4

マーカーの場合と同じように、ポリゴンの情報ウィンドウ (開く、閉じる、コンテンツを設定) を管理する方法を探しています。
おそらく onClick イベントをリッスンし、そこにいくつかの非表示のマーカーを配置して、そのマーカーの InfoWindow を開きます。ただし、InfoWindow コンテンツを取得するための多角形を見つけるには問題があります。
よりエレガントなソリューションはありますか?

4

1 に答える 1

1

私はあなたの問題に似た解決策で取り組んできました。

あなたが言ったように、主な問題は、 OnMapLongClickListener() から取得した LatLng 座標がポリゴン内にあるかどうかを取得する方法です。

これを行うために使用できる、Point-in-polygon アルゴリズムと呼ばれる一般的なアルゴリズムがあります。. これは、このアルゴリズムを 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を作成します。

于 2013-02-26T00:21:59.203 に答える