我需要在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 Google地图所缺少的错误/功能。答案 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(),您可以获得没有任何交叉点和交叉线的轮廓多边形。