Google Maps v2 - 用不同颜色绘制路线 - Android

Posted

技术标签:

【中文标题】Google Maps v2 - 用不同颜色绘制路线 - Android【英文标题】:Google Maps v2 - draw route with different colors - Android 【发布时间】:2018-05-04 21:54:57 【问题描述】:

我正在构建一个基于位置的 android 应用程序,我想根据用户的速度绘制一条路线。 例如: 0-10kmh - 黄色折线 10-20kmh - 红色折线

现在我在后台服务中运行所有内容并更新 Map Activity;

定位服务:

if (location.getSpeed() >0 && location.getSpeed < 10) 

           yellowPolyLineArray.add(new LatLng(location.getLatitude(), location.getLongitude()));
            polylineIntent.putParcelableArrayListExtra("yellow",yellowPolyLineArray);



 else if (location.getSpeed() >10 && location.getSpeed < 20) 

           redPolyLineArray.add(new LatLng(location.getLatitude(), location.getLongitude()));
            polylineIntent.putParcelableArrayListExtra("red",redPolyLineArray);

这一切都是在onLocationChangedmethod 中完成的,我每次用户移动时都会发送数组列表来映射活动,使用本地广播接收器:

private BroadcastReceiver mDrawRouteRec = new BroadcastReceiver() 
        @Override
        public void onReceive(Context context, Intent intent) 



            //Receiver array of yellowspeed polylines
            yellowPolyline = intent.getParcelableArrayListExtra("yellow");
            if(yellowPolyline != null)

                //Implement polyline options variable and draw as user moves
                PolylineOptions polylineOptions = new PolylineOptions();
                polylineOptions.addAll(yellowPolyLine);
                polylineOptions
                        .width(5)
                        .color(Color.YELLOW);
                mMap.addPolyline(polylineOptions);
            


          //Receiver array of red speed polylines
            redPolyline = intent.getParcelableArrayListExtra("yellow");
            if(redPolyline != null)

                //Implement polyline options variable and draw as user moves
                PolylineOptions polylineOptions = new PolylineOptions();
                polylineOptions.addAll(redPolyLine);
                polylineOptions
                        .width(5)
                        .color(Color.RED);
                mMap.addPolyline(polylineOptions);
            

随着用户的移动实时绘制折线

现在,如果用户以 15kmh 行驶一段距离,然后以 5kmh 行驶一段距离,这一切正常。

但如果用户以 15kmh(黄色)的速度行驶,则以 5kmh(红色)行驶一段距离,然后再次以 15kmh(黄色)行驶。第二条 15kmh 部分所在的折线不是从绿色折线结束的地方开始,而是从第一条黄色折线结束的地方开始。在地图上形成一条线。

图片: Screenshot

一个想法是在我开始绘制红线时清除黄线阵列。但是还有其他更有效的解决方案吗?

【问题讨论】:

而不是维护黄色和红色的两个列表。维护一个列表,并说明要绘制的颜色并相应地绘制线条。 但是我要如何区分什么时候画黄色,什么时候画红线,因为只有一个坐标列表。我正在考虑使用 HashMap,但它不起作用 您可以创建自定义类来存储latitude, longitude, and color。每当您要达到当时的任何条件时,存储颜色并根据该条件进行绘制。 嗯,好主意,所以每次我的位置发生变化时,我都会用新值覆盖自定义类,将其发送到 Map Activity 并绘制它? 没错。此外,您不需要传递列表。您可以将一个对象传递给它。 【参考方案1】:

要使用彩色线段绘制折线,您可以使用以下方法:

private void showPolyline(List<ColoredPoint> points) 

    if (points.size() < 2)
        return;

    int ix = 0;
    ColoredPoint currentPoint  = points.get(ix);
    int currentColor = currentPoint.color;
    List<LatLng> currentSegment = new ArrayList<>();
    currentSegment.add(currentPoint.coords);
    ix++;

    while (ix < points.size()) 
        currentPoint = points.get(ix);

        if (currentPoint.color == currentColor) 
            currentSegment.add(currentPoint.coords);
         else 
            currentSegment.add(currentPoint.coords);
            mGoogleMap.addPolyline(new PolylineOptions()
                    .addAll(currentSegment)
                    .color(currentColor)
                    .width(20));
            currentColor = currentPoint.color;
            currentSegment.clear();
            currentSegment.add(currentPoint.coords);
        

        ix++;
    

    mGoogleMap.addPolyline(new PolylineOptions()
            .addAll(currentSegment)
            .color(currentColor)
            .width(20));


ColoredPoint 在哪里:

class ColoredPoint 
    public LatLng coords;
    public int color;

    public ColoredPoint(LatLng coords, int color) 
        this.coords = coords;
        this.color = color;
    

mGoogleMapGoogleMap 对象。对于

List<ColoredPoint> sourcePoints = new ArrayList<>();
sourcePoints.add(new ColoredPoint(new LatLng(-35.27801,149.12958), Color.GREEN));
sourcePoints.add(new ColoredPoint(new LatLng(-35.28032,149.12907), Color.GREEN));
sourcePoints.add(new ColoredPoint(new LatLng(-35.28099,149.12929), Color.YELLOW));
sourcePoints.add(new ColoredPoint(new LatLng(-35.28144,149.12984), Color.YELLOW));
sourcePoints.add(new ColoredPoint(new LatLng(-35.28194,149.13003), Color.RED));
sourcePoints.add(new ColoredPoint(new LatLng(-35.28282,149.12956), Color.RED));
sourcePoints.add(new ColoredPoint(new LatLng(-35.28302,149.12881), Color.BLUE));
sourcePoints.add(new ColoredPoint(new LatLng(-35.28473,149.12836), Color.BLUE));

showPolyline(sourcePoints);

你得到了类似的东西:

另外,为了将速度转换为颜色,你可以使用这样的方法:

public int speedToColor(float speed) 
    int color = Color.TRANSPARENT;
    if (speed < 5) 
        color = Color.BLUE;
     else if (speed < 25) 
        color = Color.GREEN;
     else if (speed < 50) 
        color = Color.YELLOW;
     else 
        color = Color.RED;
    
    return color;

【讨论】:

以上是关于Google Maps v2 - 用不同颜色绘制路线 - Android的主要内容,如果未能解决你的问题,请参考以下文章

在 Google Maps Android SDK (v2) 中更改建筑物颜色

使用 Google Maps Android API v2 在两点之间绘制路径

如何使用 Google MAps API v2 围绕引脚绘制圆圈

更改或完全删除 Android 上 Google Maps v2 的 InfoWindow 的突出显示颜色

Google maps v2 android,信息窗口在点击时没有以默认突出显示颜色突出显示?

为 Google Maps API v2 Android 发布流媒体方向