如何在Android地图v2中计算复杂多边形的轮廓

时间:2014-01-17 16:25:17

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

我需要在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);

当我绘制一条横过线的星星时的屏幕截图: enter image description here

当我仅使用轮廓绘制星形时的屏幕截图: enter image description here

有没有办法计算哪些LatLng构成大纲或是否有不同的解决方案?

编辑:我正在处理的应用程序的iOS版本完美地处理它...他们只是将所有点添加到多边形,谷歌地图找出它。此时我相信这是Android Google地图所缺少的错误/功能。

编辑:错误报告: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

2 个答案:

答案 0 :(得分:1)

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

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

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

您可以使用此公式开始http://en.wikipedia.org/wiki/Line-line_intersection

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

答案 1 :(得分:1)

我知道已经过去了一年,但这是我的解决方案。 我使用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);
}

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

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