7

現在、Android デバイス用のアプリケーションを開発しています。主な機能は、地図上にポリラインを描画して、各通りの都市の交通量を示すことです。残念ながら、3K ポリラインを描画すると (画面サイズとズーム レベルに応じて数が減ります)、マップが非常に遅くなります... すべての線を描画する時間については言及しません。

道路をマークしたり、地図上に線を引いたりするより効率的な方法をご存知でしょうか?

私もOSMに乗り換えようかと考えていましたが、一度も使ったことがなく、どれだけ効率がよいのかわかりません。

Samsung Galaxy Note 10.1 でアプリをデバッグし、アプリは Map API v2 を使用します

ポリラインを描画する私のコード:

Polyline line;
List<Float> coordinatesStart;
List<Float> coordinatesEnd;
LatLng start;
LatLng end;
List<List<Float>> coordinates;
int polylinesNumber = 0;
for(Features ftr : features){
    coordinates = ftr.geometry.coordinates;

    for(int i = 0; i<coordinates.size()-1; i++){

            coordinatesStart = coordinates.get(i);
            coordinatesEnd = coordinates.get(i+1);
            start = new LatLng(coordinatesStart.get(1), coordinatesStart.get(0));
            end = new LatLng(coordinatesEnd.get(1), coordinatesEnd.get(0));
            line = map.addPolyline(new PolylineOptions()
             .add(start, end)
             .width(3)
             .color(0x7F0000FF)); //semi-transparent blue
            polylinesNumber++;

    }
}

助けていただければ幸いです!

4

4 に答える 4

5

ここで素晴らしい最適化:

あなたの主なエラーは、マップに描画するすべての線にインスタンスを使用することです。 これにより、描画が非常に遅くなります。new PolyLineOptions

解決策は次のとおりです。

ポリライン オプションの 1 つのインスタンスのみを使用し.add(LatLng)、ループ内の関数のみを使用します。

    //MAGIC #1 here
    //You make only ONE instance of polylineOptions.
    //Setting width and color, points for the segments added later inside the loops.
    PolylineOptions myPolylineOptionsInstance = new PolylineOptions()
            .width(3)
            .color(0x7F0000FF);

    for (Features ftr : features) {
        coordinates = ftr.geometry.coordinates;

        for (int i = 0; i < coordinates.size(); i++) {

            coordinatesStart = coordinates.get(i);
            start = new LatLng(coordinatesStart.get(1), coordinatesStart.get(0));

            //MAGIC #2 here
            //Adding the actual point to the polyline instance.
            myPolylineOptionsInstance.add(start);

            polylinesNumber++;
        }
    }

    //MAGIC #3 here
    //Drawing, simply only once.
    line = map.addPolyline(myPolylineOptionsInstance);

注意:

異なる線分/セクションに異なる色を使用したい場合は、複数のポリライン オプションを使用する必要があります。これは、ポリライン オプションが 1 色しか持てないためです。ただし、方法は同じです。できるだけ少ない polylineOptions を使用します。

于 2016-09-21T12:15:35.230 に答える
3

描画したポリラインが画面上でユーザーに表示されるかどうかを確認しますか? そうでなければ、それが私の最初のアイデアです。この質問はそのために役立つかもしれません。

于 2013-05-24T14:42:25.463 に答える
2

これも役立つかもしれません:

http://discgolfsoftware.wordpress.com/2012/12/06/hiding-and-showing-on-screen-markers-with-google-maps-android-api-v2/

于 2013-05-24T19:57:37.527 に答える
2

この回答が完全ではなかったので、これに参加したいと思います。ズームアウトすると、画面上に多数の個別のポリラインが表示されたままになり、UI スレッドが停止します。この問題は、ポイントからスクリーン ピクセルへのカスタムTileProviderおよび球状メルカトル図法を使用して解決しました。LatLngこのアイデアはmap-utils-libraryから生まれました。これには、キャンバスをタイルに書き込むために必要なツールのほとんどが含まれています (その他にも多くの便利な機能があります)。

私が取り組んでいたプロジェクトからComplexTileOverlaysの例を書きました。これには、 でアルファと線の太さを変更する方法が含まれますCustomTileProvider

まず、スプラッシュスクリーンを使用してポリラインのカスタム データベースをメモリに読み込みます (この例では、モントリオール島の自転車施設のオープン データベースです)。そこから、1 つのタイルを表すキャンバス 256x256 ピクセルのキャンバスに各ライン プロジェクションを描画します。全体として、マップに関連付けるグラフィック オーバーレイが多数ある場合、この手法は飛躍的に高速になります。

于 2014-06-13T19:46:45.617 に答える