Как управлять InfoWindows для полигонов на Android Google Maps API v2
Я ищу способ управления информационными окнами (открывать, закрывать, устанавливать содержимое) для полигонов, так же, как это делается для маркеров
Я, вероятно, могу прослушать событие onClick и поместить туда какой-нибудь скрытый маркер и открыть Инфокино для этого маркера. Однако существует проблема с поиском полигона для извлечения содержимого InfoWindow.
Есть более изящное решение?
1 ответ:
Я работал над решением, подобным вашей проблеме.
Как вы сказали, основная проблема заключается в том, как получить, если LatLng координата, полученная из OnMapLongClickListener() находится внутри многоугольника.Существует популярный алгоритм, который вы можете использовать для этого, называемый алгоритм точки в полигоне.. Это адаптация для Java этого алгоритма.
Наконец, создайте CustomInfoWindowsAdapter для управления тем, что вы хотите показать.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; }