多数のポイント(ジオメトリ)をマップにロードする効果的な方法

こんにちは、Habr。







今日は、マップ(Webまたはモバイルアプリケーション)上の多数のポイントを効率的にダウンロードする方法を説明します。







クイックダイブ



最新のカートグラフィックソリューションの観点から、マップレンダリングにはいくつかの基本的なアプローチがあります。









ここでは、不快な人のために、タイルを発言する必要があります。これは特別なブロック座標グリッド(タイルとも呼ばれる静的画像)であり、各レベルでタイルの数の3つの座標(z-ズーム、x、y)で特徴付けられます 22\倍







今日、最も興味深いのはベクター形式です。







なんで? 実際には、ラスター形式に関連する問題から始める必要があります。









ベクター形式はどのような見通しを提供しますか? 実際には、それらのいくつかがあります。









実際には、ベクター形式のすべてが優れていますが、欠点もあります。 少なくとも、ベクター形式はキャッシュするのが難しく、多くの場合、十分な事前生成タイルがCDNに折り畳まれ、TTLと再生成を設定し、それについてはもはや考えないラスター形式の場合ほど明白ではありません。







一般的に、これについては非常に長い間話すことができます。私の仕事は実際の仕事のメカニズムの簡単な説明をすることでした。今度は投稿のトピックに移ります。







解決策



実際には、可能な解決策の観点から、既製のライブラリ(サービス)の間で異なるサポートを持ついくつかのアプローチがあります。







  1. GeoJSON全体をダウンロードしてレンダリングします(ほとんどの場合、このオプションに依存します:))。 実際、利点は、Googleマップ、Yandexマップ、Mapbox、リーフレットなど、ほぼすべての人気のあるライブラリが何らかの方法でサポートしていることです。 ただし、たとえばMapboxに多数のポイントをロードするための効果的なソリューションを求めるGoogleの要求に応じて、誰もが効率的にそれを行うわけではありません。最初のリンクはソリューションです。スーパークラスターは、GeoJSONデータをダウンロードして準備し、それを返すサーバーユーティリティです顧客に。







  2. ビューポートでのみダウンロードしてください。 考え方は非常に単純で、ビューポートにあるものだけをロードします(*場合によっては、近くのタイルが遅延ロードされます)。 これの実装は、たとえばYandex Maps- LoadingObjectManagerのボックス内にあり、クライアント上でクラスタリングを実行できます。 また、サーバーからクラスター化されたデータを既に期待しているRemoteObjectManagerもあります。







  3. 静的タイルの事前生成とロード。 また、特に負荷の高いサービスの場合にはあるべき場所がありますが、特に興味深いものではありません。 ほとんどの場合、タイルはMapnikなどのツールを使用して生成され、CDNに流し込まれます。または、この作業をすべて独自に実行するサードパーティのユーティリティ/ライブラリが使用されます。







  4. Mapbox Vector Tilesは、実際にはマップのベクター形式の1つであり、さまざまなジオメトリやそのスタイルなどを記述します。

    • ジオメトリを返す
    • クラスターポイント
    • 低ズームレベルでジオメトリを簡素化する
    • その他


この形式はMapboxのソリューションで完全にサポートされており、リーフレット用のライブラリもあります。







GISデータのストレージの観点からも、データの操作を効率的に実行できるようにするため、MVT(Mapbox Vector Tiles)の生成を含む上記に必要なすべての操作を提供するPostGISを選択できます。









ご清聴ありがとうございました。建設的なフィードバックをお待ちしております。もしおもしろければ、カードを使った作業のいくつかの側面についてお話しします。







上記の例は私のgithubで利用可能です








All Articles