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

时间:2014-07-31 10:36:27

标签: android google-maps-markers google-maps-api-2 google-polyline

我已经为此图像绘制了不同点的折线。 image1
中心视图: - (CIRCLE) 代码** 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开始,即我想删除(修剪)Circle中心内的折线(绿色和白色),如下图所示。 image2

请在android Google map v2 API中建议一些答案。任何帮助都是赞赏......

1 个答案:

答案 0 :(得分:0)

这是一个很大的问题,实施起来并不容易。至少我想不出任何简单的方法。

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

完成此任务的一种方式将是:

计算标记的半径,并根据当前缩放级别获取以米为单位的半径。然后循环通过折线点并检查距离,如下所示:

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并获取背景信息。

注意:

  • 当缩放级别发生变化时,这两种方法都需要您重新绘制标记和/或折线,所以如果你有很多标记,我建议你重新考虑你的策略。
  • 也许首先使用实心背景标记或首先以不同方式绘制折线。