剪辑或删除折线谷歌地图 v2 的某些部分

Posted

技术标签:

【中文标题】剪辑或删除折线谷歌地图 v2 的某些部分【英文标题】:Clip or remove some portion of polyline google maps v2 【发布时间】:2014-09-23 06:31:03 【问题描述】:

我已经为这张图片中的不同点绘制了折线。 中心视图:-(圆形) **MARKER**的代码:

viewIntermediateMarker = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE))
            .inflate(R.layout.layout_intermediate_marker, null);

middlemarker = map.addMarker(new MarkerOptions()
                    .position(MIDDLE)
                    .snippet(String.valueOf(MIDDLE))
                    .icon(BitmapDescriptorFactory
                            .fromBitmap(SearchNearByCourseActivity
                                    .createDrawableFromView(mContext,
                                            viewIntermediateMarker))));

Polyline(白色):

poly_TToMid = map.addPolyline(new PolylineOptions()
                        .add(MIDDLE_MARKER, TEE_POINT).width(3)
                        .color(Color.WHITE));

Polyline(绿色):

    poly_MidToFlage = map.addPolyline(new PolylineOptions()
                        .add(MIDDLE_MARKER, upperSquMidLat).width(3)
                        .color(Color.GREEN));

但是我想让我的图像 1 和图像 2 一样,即 我想删除(修剪)圆中心内的折线(绿色和白色),如下图所示。

请建议一些答案如何在 android Google map v2 API 中实现这一点。任何帮助表示赞赏...

【问题讨论】:

@Rod_Algonquin 检查已编辑的问题。 【参考方案1】:

这是一个相当大的问题,实现起来并不容易。至少我想不出任何简单的方法来做到这一点。

这困难背后的主要原因是缩放级别的变化。在不同的缩放级别,标记下方的折线位于不同的位置,因为地图米/像素的密度会发生变化。

实现此目的的一种方法是:

根据当前缩放级别计算标记的半径并以米为单位获取半径。然后遍历折线点并像这样检查距离:

List<LatLng> points = polyline.getPoints();

LatLng latLng = points.get(0);
// Get the starting point's lat lng coordinates
Location startLoc = new Location("Test");
startLoc.setLatitude(latLng.latitude);
startLoc.setLongitude(latLng.longitude);

for (int i=1; i<points.size(); i++) 
    Location loc = new Location("Test");
    loc.setLatitude(points.get(i).latitude);
    loc.setLongitude(points.get(i).longitude);

    float distance = startLoc.distanceTo(loc);

    if (distance >= radiusInMeters) 
        polyline.setPoints(points.subList(i, points.size()));
        break;
    

但是这不会太准确(我已经尝试过了),因为distanceTo 返回平均值,radiusInMeters 也不能太准确。它也不会表现出色,因为它必须遍历每个点并计算距离(并对每个标记都进行计算)。

另一种方法是获取标记后面的颜色并将其用作背景。为此,您可以使用地图快照功能并获取标记所需的部分。

List<LatLng> points = polyline.getPoints();
final LatLng latLng = points.get(0);

mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() 
    @Override
    public void onMapLoaded() 
        mMap.snapshot(new GoogleMap.SnapshotReadyCallback() 
            @Override
            public void onSnapshotReady(Bitmap bitmap) 
                if (bitmap == null) 
                    Log.e(TAG, "Error! Snapshot couldn't be taken.");
                    return;
                

                // Get the screen coordinates
                Point point = mMap.getProjection().toScreenLocation(latLng);
                if (point == null || point.x <= 0 || point.y <= 0) 
                    Log.e(TAG, "Error! Couldn't get the lat-lng coordinates.");
                    return;
                

                int color = bitmap.getPixel(point.x, point.y);

                // Draw your marker using `color` as the background
            
        );
    
);

您还可以在快照上使用更高级的方法getPixels 并获取背景片段。

注意事项:

这两种方法都需要您在缩放级别发生变化时重新绘制标记和/或多段线,因此如果您有很多标记,我的建议是您重新考虑您的策略。 也许一开始就使用纯色背景标记或以不同的方式绘制多段线。

【讨论】:

感谢您的帮助。非常好的建议,我正在尝试这两个建议。

以上是关于剪辑或删除折线谷歌地图 v2 的某些部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在路线谷歌地图v2 android上绘制交互式折线

无法删除谷歌地图片段中的折线

仅在设备屏幕的特定部分显示谷歌地图折线

如何从谷歌地图 api android 中删除多余的折线

如何保存谷歌地图绘制的折线路径?

谷歌地图 android 上的折线用于每次位置更改、新折线或 setPoints?