简体   繁体   English

如何使用Android Google Map sdk v2绘制虚线折线?

[英]How to draw dashed polyline with android google map sdk v2?

I've looked through the documentation of polyline and there is no option to make it dashed. 我已经浏览过折线文档,没有选择使其变为虚线。

Do anybody know how to draw dashed polyline with android google map sdk v2? 有谁知道如何用Android Google Map sdk v2绘制虚线折线?

Now in Polyline you can set the pattern to be Dash, Dot or Gap simply apply the following 现在在Polyline中,您可以将图案设置为Dash,Dot或Gap,只需应用以下内容

public static final int PATTERN_DASH_LENGTH_PX = 20;
public static final int PATTERN_GAP_LENGTH_PX = 20;
public static final PatternItem DOT = new Dot();
public static final PatternItem DASH = new Dash(PATTERN_DASH_LENGTH_PX);
public static final PatternItem GAP = new Gap(PATTERN_GAP_LENGTH_PX);
public static final List<PatternItem> PATTERN_POLYGON_ALPHA = Arrays.asList(GAP, DASH);

 private void drawDashedLeg(GoogleMap googleMap, Route route) {
    PolylineOptions polyOptions = new PolylineOptions();
    polyOptions.color(ContextCompat.getColor(getContext(), R.color.coolgrey));
    polyOptions.addAll(route.getPoints());
    polyOptions.pattern(PATTERN_POLYGON_ALPHA);
    Polyline polyline = googleMap.addPolyline(polyOptions);
    polylines.add(polyline);
}

Alexey, I've just created a function that worked for me and I think that will help you: Alexey,我刚刚创建了一个对我有用的函数,我认为这对您有帮助:

public static void createDashedLine(GoogleMap map, LatLng latLngOrig, LatLng latLngDest, int color){
    double difLat = latLngDest.latitude - latLngOrig.latitude;
    double difLng = latLngDest.longitude - latLngOrig.longitude;

    double zoom = map.getCameraPosition().zoom;

    double divLat = difLat / (zoom * 2);
    double divLng = difLng / (zoom * 2);

    LatLng tmpLatOri = latLngOrig;

    for(int i = 0; i < (zoom * 2); i++){
        LatLng loopLatLng = tmpLatOri;

        if(i > 0){
            loopLatLng = new LatLng(tmpLatOri.latitude + (divLat * 0.25f), tmpLatOri.longitude + (divLng * 0.25f));
        }

        Polyline polyline = map.addPolyline(new PolylineOptions()
            .add(loopLatLng)
            .add(new LatLng(tmpLatOri.latitude + divLat, tmpLatOri.longitude + divLng))
            .color(color)
            .width(5f));

        tmpLatOri = new LatLng(tmpLatOri.latitude + divLat, tmpLatOri.longitude + divLng);
    }
}

It is not possible in current release. 在当前版本中不可能。 Follow this issue for updates: https://code.google.com/p/gmaps-api-issues/issues/detail?id=4633 请关注此问题以获取更新: https : //code.google.com/p/gmaps-api-issues/issues/detail?id=4633

UPDATE 更新

Recently, Google implemented this feature for polylines in Google Maps Android API v2 and marked issue 4633 as Fixed. 最近,Google在Google Maps Android API v2中为折线实现了此功能,并将问题4633标记为“已修复”。

See information about stroke patterns in the Shapes Guide . 请参阅“ 形状指南”中有关笔划样式的信息。 See an example in the Polylines and Polygons tutorial. 见一个例子中折线和多边形的教程。

You can also read the corresponding blog post here: 您还可以在此处阅读相应的博客文章:

https://maps-apis.googleblog.com/2017/02/styling-and-custom-data-for-polylines.html https://maps-apis.googleblog.com/2017/02/styling-and-custom-data-for-polylines.html

I created the following function to draw dotted polyline with a list of LatLng points. 我创建了以下函数来绘制带有LatLng点列表的点状折线。 This algorithm creates lines of 0.002 kms (followed by 0.002 kms meter gaps) irrespective of zoom. 该算法可创建0.002 kms的线(其后为0.002 kms的仪表间隙),而与缩放无关。 This is useful when you don't want to re-plot polylines when zoom changes. 当您不想在缩放更改时重新绘制折线时,此功能很有用。

private void drawDashedPolyLine(GoogleMap mMap, ArrayList<LatLng> listOfPoints, int color) {
    /* Boolean to control drawing alternate lines */
    boolean added = false;
    for (int i = 0; i < listOfPoints.size() - 1 ; i++) {
        /* Get distance between current and next point */
        double distance = getConvertedDistance(listOfPoints.get(i),listOfPoints.get(i + 1));

        /* If distance is less than 0.002 kms */
        if (distance < 0.002) {
            if (!added) {
                mMap.addPolyline(new PolylineOptions()
                        .add(listOfPoints.get(i))
                        .add(listOfPoints.get(i + 1))
                        .color(color));
                added = true;
            } else {/* Skip this piece */
                added = false;
            }
        } else {
            /* Get how many divisions to make of this line */
            int countOfDivisions = (int) ((distance/0.002));

            /* Get difference to add per lat/lng */
            double latdiff = (listOfPoints.get(i+1).latitude - listOfPoints
                    .get(i).latitude) / countOfDivisions;
            double lngdiff = (listOfPoints.get(i + 1).longitude - listOfPoints
                    .get(i).longitude) / countOfDivisions;

            /* Last known indicates start point of polyline. Initialized to ith point */
            LatLng lastKnowLatLng = new LatLng(listOfPoints.get(i).latitude, listOfPoints.get(i).longitude);
            for (int j = 0; j < countOfDivisions; j++) {

                /* Next point is point + diff */
                LatLng nextLatLng = new LatLng(lastKnowLatLng.latitude + latdiff, lastKnowLatLng.longitude + lngdiff);
                if (!added) {
                    mMap.addPolyline(new PolylineOptions()
                    .add(lastKnowLatLng)
                    .add(nextLatLng)
                    .color(color));
                    added = true;
                } else {
                    added = false;
                }
                lastKnowLatLng = nextLatLng;
            }
        }
    }
}

private double getConvertedDistance(LatLng latlng1, LatLng latlng2) {
    double distance = DistanceUtil.distance(latlng1.latitude,
            latlng1.longitude,
            latlng2.latitude,
            latlng2.longitude);
    BigDecimal bd = new BigDecimal(distance);
    BigDecimal res = bd.setScale(3, RoundingMode.DOWN);
    return res.doubleValue();
}

Util class to calculate distance between two LatLng: 利用类来计算两个LatLng之间的距离:

public class DistanceUtil {

    public static double distance(double lat1, double lon1, double lat2,
        double lon2) {

    if ((lat1 == lat2) && (lon1 == lon2)) {
        return 0;
    } else
        return distance(lat1, lon1, lat2, lon2, 'K');
    }

    public static double distance(double lat1, double lon1, double lat2,
        double lon2, char unit) {
        double theta = lon1 - lon2;
        double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2))
            + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2))
            * Math.cos(deg2rad(theta));
        dist = Math.acos(dist);
        dist = rad2deg(dist);
        dist = dist * 60 * 1.1515;
        if (unit == 'K') {
            dist = dist * 1.609344;
        } else if (unit == 'N') {
            dist = dist * 0.8684;
        }
        return (dist);
    }

    private static double deg2rad(double deg) {
        return (deg * Math.PI / 180.0);
    }

    private static double rad2deg(double rad) {
        return (rad * 180.0 / Math.PI);
    }
}

Note: The above algorithm generates very large number of polylines which may take time to render. 注意:上述算法会生成大量折线,这可能需要花费一些时间才能渲染。 It is useful only when the list of points is small. 仅在点列表较小时才有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM