クラむアントでのクラスタリング、たたは地図䞊に10,000ポむントを衚瀺する方法

プロゞェクトにはいく぀かの皮類がありたす
地理情報の出力は
必芁䞍動産サむト、䌚瀟名簿、
アトラクション、掲瀺板などのカタログ。
これらのサむトでは、goolge API 3およびYandex API 2のプラグむンを開発するこずにしたした。

基本的な芁件
  1. サヌバヌでの深いデヌタ準備なしで接続する機胜。぀たり、オブゞェクトの既存の地理座暙のみを䜿甚したす。
  2. デヌタを準備および送信するためのシンプルなプロトコル。
  3. 2぀のタむプのラベルクラスタヌずグルヌプを䜿甚した高速クラむアントクラスタリング。 クラスタヌ-近くにあるいく぀かのオブゞェクト。 クリックするず、クラスタヌが「開き」たす。぀たり、オブゞェクトがクラスタリング距離よりも遠いずきにズヌムが増加したす。 グルヌプ-1぀のポむント最小距離にある耇数のオブゞェクト。 ズヌムでグルヌプをクリックするず、グルヌプ内のオブゞェクトのリストが衚瀺されたす。
  4. クラスタリングを䜿甚しお最倧10,000ポむントを衚瀺したす。
  5. IE7のモバむルデバむス第1䞖代のiPadで衚瀺したす。
  6. グルヌプクラスタヌずオブゞェクト自䜓の2぀の情報りィンドりのクラむアントでのテンプレヌト化。
  7. ラベルにスプラむトを䜿甚したす。
  8. さたざたな皮類のオブゞェクトに察しお無制限の数の皮類のラベルアむコンを䜿甚する機胜。
  9. さたざたなズヌム範囲に察しお耇数のアむコンサむズを䜿甚する機胜。

この蚘事では、このプラグむンの実装に䜿甚されたいく぀かのアプロヌチに぀いお説明したす。

機胜の動䜜時間の枬定は、いく぀かのデバむスで実行されたした。 䟿宜䞊、それらの䞀郚2で曞き蟌みたす-Google Chrome 19.0 @ AMD Athlon 64 X2 Dual Core 5600+ 2.8 GHz RAM 2Gb Windows-7 32bitが平均で、Safari @ Apple iPad 16GB 1.0 GHz iOS 5.1.1が最も遅く䞍機嫌です。

サヌバヌ偎


サヌバヌ郚分は次の2぀の芁求で構成されたす。

1.カヌドデヌタの芁求。

ラベルを遞択するためのパラメヌタヌを含むリンクがこのリク゚ストに送信されたす。 たずえば、郜垂= 1および郚屋= 1,2。 ぀たり、1ベッドルヌムず2ベッドルヌムのアパヌトメントで郜垂ID = 1のみを遞択したす䞍動産サむトの䟋。
応答ずしお、マップのjsonパラメヌタヌマップ、マップの䞭心ずズヌム、アむコンパラメヌタヌ、クラスタリング距離、スプラむトなどずすべおのポむントに関するデヌタを含むjsonを含むスクリプトが返されたす。 これらのポむントには、オブゞェクトID、地理座暙、アむコンタむプ、ツヌルチップラむンが含たれたす。 非圧瞮状態の10,000ポむントの堎合、応答サむズは1.2 MBですが、gzip圧瞮では350 KBのみです。
頻繁に繰り返されるリク゚ストは、nginxによっお適切にキャッシュされたす。

2.オブゞェクトの芁求。

1぀のマヌカヌをクリックするず、情報りィンドりにオブゞェクトに関するデヌタがポップアップ衚瀺されたす。 Ajaxリク゚ストにはオブゞェクトのIDが含たれたす。 応答はjsonです。 jsonフィヌルドの名前は情報りィンドりテンプレヌト内のタグず䞀臎する必芁があり、埌者は受信したコンテンツに眮き換えられたす。

クラむアント郚


ポむントデヌタの解析

受信したデヌタは次のように凊理されたす。
1.れロズヌムでのグロヌバルピクセル座暙は、各ポむントに察しお蚈算されたす。
2.グロヌバル座暙に基づいお、14番目のズヌムのタむルIDが蚈算され、察応するタむルIDの配列にポむントが配眮されたす。 将来、どのズヌムでも、必芁なタむルのIDを簡単に蚈算しお、それらのすべおのポむントを遞択できたす。 ポむントサンプリング速床-10,000ポむントの堎合、100/350ミリ秒以䞋。

解析時間10000ポむント-100/650ミリ秒

クラスタリング

Yandex API 2のネむティブClustererなど、いく぀かのクラスタヌをテストしたした。それらのいずれも、いく぀かの理由で私に適しおいたせんでした。 たず、クラスタヌのみが存圚し、グルヌプは存圚したせん。 クラスタヌをクリックするず、ズヌムは最倧たで増加したすが、リストは衚瀺されたせん。 リストを取埗するには、もう䞀床クリックする必芁がありたす。 これが、YandexのClustererの配眮方法です。 Google Maps v3甚のMarkerClustererにもこのタむプのマヌカヌはありたせん。
第二に、クラスタヌはグリッドによっお蚈算されたす。グリッドは高速ですが、倚数のラベルを持぀クラスタヌが「グリッド䞊」に配眮され、芋苊しくなりたす。
その結果、独自のClusterizeクラスタリングが䜜成されたした。 その䞭で、クラスタリング方法は非同期ハむブリッドです。タむルのデヌタを芁求するず、次のこずが起こりたす。
-タむルは4぀のサブタむルグリッドに分割され、各サブタむルは距離によっおクラスタヌ化されたすが、クラスタヌ自䜓はセルの䞭倮ではなく、「折りたたたれた」ポむントの領域の䞭倮に配眮されたす。
-受信したポむントずクラスタヌはタむルに収集され、再びクラスタヌ化されたす。 この時点で、すでにいく぀かのポむントがありたす。
-受け取ったポむントは、隣接するタむルを考慮しお「間匕かれ」たす既にクラスタヌ化されおいる堎合。 ぀たり、タむトルのマヌカヌず重なる境界線䞊の境界線タむルにクラスタヌたたはマヌカヌがある堎合、これらのマヌカヌはクラスタヌに結合されたす。 これにより、タむルの境界にマヌカヌが「付着」しないようにしたす。
クラスタリング速床は非垞に高いこずが刀明したした。10,000のうち、60/500ミリ秒で580ポむントを取埗したす。 たったく問題ありたせん。

マヌカヌアむコン

スプラむトを䜿甚しおアむコンを衚瀺したす。 アむコンの皮類の数に制限はありたせん。 䟋では、単䞀マヌカヌ+クラスタヌおよびグルヌプアむコンに7皮類のアむコンを䜿甚しおいたす。 2぀のバヌゞョンの䟋2の各タむプのアむコンは、14を超えるズヌムでは倧きく、14未満では小さいです。クラスタリング距離は17ピクセルであるため、小さいアむコンは小さいスケヌルできれいに芋えたす。



情報りィンドりのテンプレヌト

マヌカヌをクリックするこずにより発生したす
1.マヌカヌがクラスタヌの堎合-クラスタヌは「開瀺」にズヌムされたす。


2.マヌカヌがグルヌプの堎合、このグルヌプのオブゞェクトのリストが衚瀺されたす。

3.単䞀のマヌカヌがデヌタをロヌドし、情報りィンドりを衚瀺したす


マヌカヌ出力。

マヌカヌを衚瀺するには、Google API 3ずYandex API 2を䜿甚したした。
デヌタを保存および凊理し、タむルをクラスタヌ化し、キャンバスを描画するモデルず、必芁なAPIをロヌドしおマヌカヌを衚瀺するいく぀かのコントロヌラヌを䜜成したした。

Google API 3-ネむティブコントロヌラヌ

このコントロヌラヌは、ネむティブのGoogle Api 3機胜ずクラスタリングのクラスタリングを䜿甚したす。
Google API 3はすばやく読み蟌たれ、可胜であればキャンバスを䜿甚しお、タグのスプラむトをサポヌトしたす。
䟋
長所
少量のコヌド
CANVASぞの自動切り替え
スプラむトのサポヌト
短所
ズヌムを倉曎するずきの遅くお䞍噚甚なレンダリング
぀たり、各マヌカヌに察しお4぀のオブゞェクトが䜜成され、ズヌム10〜12でDOMがクラッシュしたす

カヌド出力速床10,000ポむントおよびクラスタリングによる10ズヌム


Google API 3-キャンバスコントロヌラヌ

コントロヌラヌはキャンバスを䜿甚しお各タむルをレンダリングし、クラスタリングをクラスタヌ化したす。
このコントロヌラヌでは、タむルはキャンバス䞊に非同期でレンダリングされたす。 レンダリング速床がわずかに向䞊するこずを陀いお、ネむティブ関数ず比范しお特別な利点はありたせん。
䟋
長所
少数のDOMオブゞェクト
ネむティブコントロヌラよりも最倧50高速なレンダリング速床
スプラむトのサポヌト
短所
ズヌム倉曎時の点滅
IEではサポヌトされおいたせん

カヌド出力速床10,000ポむントおよびクラスタリングによる10ズヌム


Google API 3-fullcanvasコントロヌラヌ

コントロヌラヌはキャンバスを䜿甚しお、マップの可芖郚分党䜓をレンダリングしたす。
クラスタリングクラスタリング。
キャンバスキャンバスは、マップの衚瀺郚分のサむズに合わせお䜿甚​​され、移動ごずに描画されたす。
䟋
長所
DOMオブゞェクトの最小数
ネむティブコントロヌラヌず比范しお最高100の最高レンダリング速床
スプラむトのサポヌト
IE 6のFlashCanvasサポヌト
ズヌム倉曎時の矎しいアニメヌション
短所
぀たり、100のペヌゞスケヌルでのみ動䜜したすバグ

カヌド出力速床10,000ポむントおよびクラスタリングによる10ズヌム


Yandex API 2-「すぐに䜿える」ネむティブコントロヌラヌ

コントロヌラヌはそのたたAPI 2を䜿甚したす。
クラスタリングもネむティブのClustererです。
新しいYandex API 2では、クラスタリングが既にモゞュヌルずしおAPIに組み蟌たれおいたす。 クラスタ化ツヌルの䜿甚-3行のコヌド。 クラスタヌアむコンの蚭定ずリスト付きの情報りィンドりがありたす。 この䟋では、デヌタ凊理時間が単に悲惚なため、これを䜿甚したせんでした。
䟋 撀回には時間がかかる堎合がありたす
長所
すぐに䜿えるすべおの機胜
短所
初期凊理ずクラスタリングが非垞に遅い
膚倧な数のDOMオブゞェクト
クラスタヌタむプ「ポむント」の欠劂
スプラむトサポヌトの欠劂。
ズヌム倉曎時の点滅

カヌド出力速床10,000ポむントおよびクラスタリングによる10ズヌム


Yandex API 2-ネむティブコントロヌラヌ

コントロヌラヌはAPI 2関数を䜿甚しおGeoObjectをホストしたす。
゜フトりェアは、ラベルテンプレヌトずクラスタリングのクラスタリングを䜿甚したす。
このコントロヌラヌを䜕床か曞き盎したした。 ymaps.GeoObjectは珟圚スプラむトをサポヌトしおいたせん。たた、overlay.staticGraphics.Placemarkファクトリはシャドりをサポヌトしおいたせん。 その結果、アむコンず圱ずいう2぀のdivで構成されるマヌカヌのレむアりトテンプレヌトを䜜成したした。
䟋
長所
かなり高いカヌド準備速床
レむアりトタグによるスプラむトサポヌト
短所
膚倧な数のDOMオブゞェクト
ゆっくり
すなわち殺す

カヌド出力速床10,000ポむントおよびクラスタリングによる10ズヌム


Yandex API 2-キャンバスコントロヌラヌ

コントロヌラヌはキャンバスを䜿甚しお各タむルをレンダリングし、クラスタリングをクラスタヌ化したす。
Googleキャンバスず同じレンダリングを䜿甚したす。 ズヌムを倉曎するずきにキャンバスがスムヌズにアニメヌション化されるGooge APIずは異なり、Yandex API 2からこれを達成するこずはできたせんでした束葉杖で既に方法を知っおいたす。
䟋
長所
少数のDOMオブゞェクト
高速レンダリング
スプラむトのサポヌト
スムヌズな移動効果
短所
ズヌムを倉曎するずきの「おridge」
IEではサポヌトされおいたせん

カヌド出力速床10,000ポむントおよびクラスタリングによる10ズヌム


Yandex API 2-fullcanvasコントロヌラヌ

コントロヌラヌはキャンバスを䜿甚しお、マップの可芖郚分党䜓をレンダリングしたす。
レンダリングは、マップが移動され、ズヌムが倉曎されるたびに行われたす。
クラスタリングクラスタリング。
Google fullcanvasコントロヌラヌずは異なり、キャンバスは衚瀺領域よりも広くお高くなっおいたす。 したがっお、マップの移動はよりスムヌズになりたす。 ズヌムを倉曎するずきのアニメヌションは、個別に䜜成する必芁がありたした。
䟋
長所

DOMオブゞェクトの最小数
最高のレンダリング速床
スプラむトのサポヌト
IE 6のFlashCanvasサポヌト
ズヌム倉曎時の矎しいアニメヌション
短所
぀たり、100のペヌゞスケヌルでのみ動䜜したすバグ

カヌド出力速床10,000ポむントおよびクラスタリングによる10ズヌム


ここで珟圚の䟋を芋るこずができたす。

おわりに


fullcanvasコントロヌラヌを䜿甚するのが最も効果的です。 たずえば、FlashCanvasは適甚可胜ですが、これたでのずころ制限がありたす。
さらに、fullcanvasコントロヌラヌは、WebGLを䜿甚しおマヌカヌをアニメヌション化するたずえば、カヌ゜ルの埌ろの3dタヌン、他のアニメヌション効果を䜜成する絶奜の機䌚です。
情報りィンドりのテンプレヌトを䜿甚するず、プロゞェクトのデザむンをカスタマむズしたり、オブゞェクトに関する情報を衚瀺したりできたす。
珟圚たでに、プラグむンは95で蚘述されおいたす。 いく぀かのバグをピックアップし、fullcanvasコントロヌラヌでのキャンバスのレンダリングを最適化するこずは残っおいたす。
これたでに解決されおいない唯䞀の問題は、ieのFlashCanvasのペヌゞスケヌルです。 近い将来、それを克服するこずが可胜になるず思いたす。

Source: https://habr.com/ru/post/J145832/


All Articles