2012-12-16 69 views
1

我正在寻找一种方法来管理多边形的信息窗口(打开,关闭,设置内容),就像它为标记所做的一样
我大概可以听onClick事件并在其中放置一些隐藏的标记并为该标记打开一个InfoWindow。虽然找到一个多边形来检索InfoWindow内容仍然有问题。
有一个更优雅的解决方案?如何管理InfoWindows在Android上的多边形Google Maps API v2

回答

0

我一直在解决类似于你的问题的解决方案。

正如你所说的,主要的问题是如何获得,如果经纬度坐标OnMapLongClickListener()是一个多边形内得到。

有一个流行的算法可以用来做这个叫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管理要显示的内容。

+0

我使用了相同的解决方案。不管怎么说,还是要谢谢你! – GetUsername

+0

Polygon和VerticesPolygon类实现哪个包? –

+0

嗨戈兰。两者都是自定义类。多边形有一个VerticesPolygon的句子。 VerticesPolygon只是用于定义多边形的顶点列表,最后,Vertice具有经度和纬度,这与LatLng类似。问候 – jgonza73

相关问题