我正在寻找一种管理多边形信息窗口(打开,关闭,设置内容)的方法,就像对标记一样 我可能会听取onClick事件并在那里放一些隐藏的标记并为该标记打开InfoWindow。找到一个多边形以检索InfoWindow内容时出现问题 有一个更优雅的解决方案吗?
答案 0 :(得分:1)
我一直在寻找与您的问题类似的解决方案。
正如你所说,主要的问题是如何从 OnMapLongClickListener()获取 LatLng 坐标在多边形内。
您可以使用一种流行的算法来执行此操作,称为Point-in-polygon algorithm.。这是对该算法的Java的改编。
private boolean containsInPolygon(LatLng latLng, Polygon polygon) {
boolean oddTransitions = false;
List<VerticesPolygon> verticesPolygon = polygon.getVertices();
float[] polyY, polyX;
float x = (float) (latLng.latitude);
float y = (float) (latLng.longitude);
// Create arrays for vertices coordinates
polyY = new float[verticesPolygon.size()];
polyX = new float[verticesPolygon.size()];
for (int i=0; i<verticesPolygon.size() ; i++) {
VerticesPolygon verticePolygon = verticesPolygon.get(i);
polyY[i] = (float) (verticePolygon.getVertice().getLongitude());
polyX[i] = (float) (verticePolygon.getVertice().getLatitude());
}
// Check if a virtual infinite line cross each arc of the polygon
for (int i = 0, j = verticesPolygon.size() - 1; i < verticesPolygon.size(); j = i++) {
if ((polyY[i] < y && polyY[j] >= y)
|| (polyY[j] < y && polyY[i] >= y)
&& (polyX[i] <= x || polyX[j] <= x)) {
if (polyX[i] + (y - polyY[i]) / (polyY[j] - polyY[i])
* (polyX[j] - polyX[i]) < x) {
// The line cross this arc
oddTransitions = !oddTransitions;
}
}
}
// Return odd-even number of intersecs
return oddTransitions;
}
最后,创建一个 CustomInfoWindowsAdapter 来管理您想要显示的内容。