【问题标题】:How to calculate outline of complex polygon in Android maps v2如何在 Android 地图 v2 中计算复杂多边形的轮廓
【发布时间】:2014-02-07 01:45:44
【问题描述】:

我需要在 Android 地图 v2 中填充多边形的中心,并且当多边形复杂且线条相互交叉时遇到问题。用户可以用手指在地图上绘图,然后我使用地图投影将我的点转换为 LatLng。

我需要填充中心,即使它是用交叉线绘制的。

我的绘制代码如下:

    PolygonOptions rectOptions = new PolygonOptions();
    rectOptions.strokeColor(getResources().getColor(R.color.blue));
    rectOptions.fillColor(getResources().getColor(R.color.blue_map_fill));
    rectOptions.strokeWidth(4);
    rectOptions.addAll(latLngs);
    mMap.addPolygon(rectOptions);

当我画星星时的屏幕截图:

当我只用轮廓绘制星星时的屏幕截图:

有没有一种方法可以计算构成轮廓的 LatLng 或有不同的解决方案?

编辑:我正在开发的应用程序的 iOS 版本完美地处理了这个问题。他们只是将所有点添加到一个多边形中,然后谷歌地图就会计算出来。在这一点上,我认为这是 Android 谷歌地图缺少的错误/功能。

编辑:错误报告:https://code.google.com/p/gmaps-api-issues/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Stars%20ApiType%20Internal&groupby=&sort=&id=6255

【问题讨论】:

  • 你解决了这个问题吗?我也遇到了同样的问题
  • 不,我没有,错误报告也没有消失。
  • 找到解决办法了吗?

标签: android google-maps google-maps-android-api-2 polygon


【解决方案1】:

一种可能的方法是检测线条相互碰撞的位置,然后将这些像素位置转换为 lat/lng 点。

您需要跟踪在您的情况下相同的第一个点和最后一个点,然后检查每条线与多边形中的所有其他线。还要根据您开始检查的方向(即顺时针/逆时针)跟踪您找到它们的顺序。将所有交点从 x,y 转换为 lat/lng。

找到所有交点后,您可以从第一个点开始并在第一个交点创建一条线,然后下一条线将是您的下一个非交点的第一个交点(即。星)等等等等,直到你形成一个所有新点的新列表,然后给出要绘制的地图。

你可以使用这个公式开始http://en.wikipedia.org/wiki/Line-line_intersection

我的逻辑中可能有一些我没有想到的漏洞。

【讨论】:

  • 感谢您的回答。我并不特别需要它只为一颗星星工作,而是任何用相交线绘制的多边形,所以我相信如果他们画出一些疯狂的东西,这个逻辑就会失败。
【解决方案2】:

我知道已经过去一年了,但这是我的解决方案。 我使用JTS library,我想你也可以使用这个库的客户端来创建周围的多边形。

此方法创建一个新的LatLng 对象列表,您可以使用它来绘制输入的周围多边形。

private void createSurroundingPolygon(List<LatLng> polygonPath) {
    List<Coordinate> coordinates = new ArrayList<>();
    for (LatLng latLng : polygonPath) {
        coordinates.add(new Coordinate(latLng.longitude, latLng.latitude));
    }

    GeometryFactory factory = new GeometryFactory();
    Geometry lineString = factory.createLineString(coordinates.toArray(new Coordinate[coordinates.size()]));
    Polygon polygon = (Polygon) BufferOp.bufferOp(lineString, 0.0001);

    Coordinate[] coordinatesSurroundingPolygon = polygon.getExteriorRing().getCoordinates();
    List<LatLng> surroundingPolygon = new ArrayList<>();
    for (int i = 0; i < coordinatesSurroundingPolygon.length; i++) {
        surroundingPolygon.add(new LatLng(coordinatesSurroundingPolygon[i].y, coordinatesSurroundingPolygon[i].x));
    }
    drawPolygon(surroundingPolygon);
}

首先它会创建一个新的坐标列表。它们用于创建 JTS Geometry,即 LineString。您不能直接从坐标列表中创建 LinearRing 或 Polygon,因为您不知道它是否是有效的(没有交点的封闭多边形)。当你缓冲给定的几何图形时,你会得到一个多边形,在我的例子中是 0.0001。距离是在原始多边形之外添加的额外空间。

最后,使用Polygon.getExtgeriorRing() 方法,您可以得到没有任何交点和交叉线的轮廓多边形。

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    相关资源
    最近更新 更多