こんにちは、Habr。
今日は、マップ(Webまたはモバイルアプリケーション)上の多数のポイントを効率的にダウンロードする方法を説明します。
クイックダイブ
最新のカートグラフィックソリューションの観点から、マップレンダリングにはいくつかの基本的なアプローチがあります。
- ラスター(静的ファイル-タイルがCDNに保存され、独自のTTLを持つ画像)
- ベクトル
ここでは、不快な人のために、タイルを発言する必要があります。これは特別なブロック座標グリッド(タイルとも呼ばれる静的画像)であり、各レベルでタイルの数の3つの座標(z-ズーム、x、y)で特徴付けられます
今日、最も興味深いのはベクター形式です。
なんで? 実際には、ラスター形式に関連する問題から始める必要があります。
- 個別のズームレベル(ほとんどの場合0〜20)
- タイルレイヤー上のリジッドスタイルとデータバインディング
- 古典的なラスターの欠陥
ベクター形式はどのような見通しを提供しますか? 実際には、それらのいくつかがあります。
- ズームは、特定のレイヤーのタイルと明確に関連付けられていませんが、精度と滑らかさによって異なる場合があります。
- 多くの場合、(中間レンダリングオプションを考慮せずに)クライアントがマップをレンダリングするため、どのデータとどのスタイルで描画するかを決定するのは彼です。
- 解像度などに関係なく優れた品質。これは一般に、ラスタに対するベクトルの古典的な利点です。
実際には、ベクター形式のすべてが優れていますが、欠点もあります。 少なくとも、ベクター形式はキャッシュするのが難しく、多くの場合、十分な事前生成タイルがCDNに折り畳まれ、TTLと再生成を設定し、それについてはもはや考えないラスター形式の場合ほど明白ではありません。
一般的に、これについては非常に長い間話すことができます。私の仕事は実際の仕事のメカニズムの簡単な説明をすることでした。今度は投稿のトピックに移ります。
解決策
実際には、可能な解決策の観点から、既製のライブラリ(サービス)の間で異なるサポートを持ついくつかのアプローチがあります。
GeoJSON全体をダウンロードしてレンダリングします(ほとんどの場合、このオプションに依存します:))。 実際、利点は、Googleマップ、Yandexマップ、Mapbox、リーフレットなど、ほぼすべての人気のあるライブラリが何らかの方法でサポートしていることです。 ただし、たとえばMapboxに多数のポイントをロードするための効果的なソリューションを求めるGoogleの要求に応じて、誰もが効率的にそれを行うわけではありません。最初のリンクはソリューションです。スーパークラスターは、GeoJSONデータをダウンロードして準備し、それを返すサーバーユーティリティです顧客に。
ビューポートでのみダウンロードしてください。 考え方は非常に単純で、ビューポートにあるものだけをロードします(*場合によっては、近くのタイルが遅延ロードされます)。 これの実装は、たとえばYandex Maps- LoadingObjectManagerのボックス内にあり、クライアント上でクラスタリングを実行できます。 また、サーバーからクラスター化されたデータを既に期待しているRemoteObjectManagerもあります。
静的タイルの事前生成とロード。 また、特に負荷の高いサービスの場合にはあるべき場所がありますが、特に興味深いものではありません。 ほとんどの場合、タイルはMapnikなどのツールを使用して生成され、CDNに流し込まれます。または、この作業をすべて独自に実行するサードパーティのユーティリティ/ライブラリが使用されます。
- Mapbox Vector Tilesは、実際にはマップのベクター形式の1つであり、さまざまなジオメトリやそのスタイルなどを記述します。
- ジオメトリを返す
- クラスターポイント
- 低ズームレベルでジオメトリを簡素化する
- その他
この形式はMapboxのソリューションで完全にサポートされており、リーフレット用のライブラリもあります。
GISデータのストレージの観点からも、データの操作を効率的に実行できるようにするため、MVT(Mapbox Vector Tiles)の生成を含む上記に必要なすべての操作を提供するPostGISを選択できます。
-
@
演算子を使用して、ジオメトリをタイル(長方形)に含める - MVT生成-ST_AsMVT、ST_AsMVTGeom
ご清聴ありがとうございました。建設的なフィードバックをお待ちしております。もしおもしろければ、カードを使った作業のいくつかの側面についてお話しします。