はじめに
マップバインドで大きなデータセットを表示する必要がありましたか? 職場では、緯度と経度でグループ化された注文を表示する必要がありました。 また、静的なテーブルだけでなく、マップ近似ごとに詳細が異なる動的なテーブルもあります。
残念ながら(または幸いなことに)、既成のソリューションは見つかりませんでした。 Googleマップでは、マーカーと図形を地図に重ねることができますが、これらの方法では情報が少なすぎます。 Yandexカードを使用した場合、それは良くないことが判明しました。 ただし、GoogleマップにはHTMLコンテンツを使用したカスタムオーバーレイメカニズムがあります。 この作業をマップとオーバーレイでカプセル化するために、GMapsTable JavaScriptライブラリを作成しました。 おそらく誰かがそれを面白く、または役に立つと思うでしょう。 作業例。
混乱を避けるために、ズームパラメータはマップ近似と呼ばれ、スケールはスケールです。 1つ目はGoogle Maps APIに関連し、2つ目は説明したライブラリに関連しています。
全体的なタスク
では、何がありますか? 何らかの種類のデータソース(たとえば、JSON形式でデータを処理および送信するデータベースサーバー)と、データを要求してGoogleマップに表示するJavaScript Webページ。
データは累積的な性質のものです(私の場合、各エリアは、注文数、顧客数、平均金額に関連付けることができます)。 したがって、データは、さまざまな近似のさまざまな粒度で表示できます。
GMapsTableのHTMLページのメインコンテンツ:
.. <head>: <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY"></script> <script src="http://www.aivanf.com/static/gmt/gmapstable.js"></script> .. <body>: <div id="map"></div>
GMapsTableを使用すると、GoogleMaps APIとの相互作用を無視できます。 適切なデータオブジェクトのみを提供する必要があります。 JavaScript'yにジャンプする時間です! GMapsTableを使用するには、マップdivのDataContainerオブジェクトを取得するだけです。
// : ID div' // GoogleMaps, // var container = new DataContainer("map", { zoom: 9, center: {lat: 55.7558, lng: 37.6173}, mapTypeId: 'roadmap' });
そして、いくつかの関数を渡す必要があります。
container.dataLoader = function (scale, borders) { ... container.processData(some_data); } container.scaler = function (zoom) { ... return - ; }
しかし、関数の内部には正確に何を書くべきですか?..まず、GMapsTableの仕組みを理解しましょう。
DataContainerのデータ
DataContainer
はデータの表示を処理し、いつデータを更新すべきかを処理します。 最初に、「カメラ」の近似値と境界が変わると、保存されたデータを使用しようとし、データがない場合はdataLoader
関数を呼び出します。 データを含むオブジェクトを生成し、それをDataContainer.processData関数に渡す必要があります。 オブジェクトの構造は次のようになります。
data: { minLat: float, difLat: float, minLon: float, difLon: float, scale: int, table: [ [value, value, ...], [value, value, ...], ... ], tocache: boolean }
テーブルセルに独自の書式設定関数を指定する場合、 value
は数値、文字列、または任意のオブジェクトにできます。 スケール( sale
)は、緯度と経度の単位を分割する部分の数を示す整数です。 tocache
パラメーターは、現在のスケールのデータを保存し、要求しないようにするかどうかを指定します。
data: { minLat: 55.0, difLat: 2.0, minLon: 37.0, difLon: 1.0, scale: 2, table: [ [1, 3, 0, 1], [0, 1, 2, 0] ], tocache: true }
ここでは、データは55.0、37.0から57.0、38.0までの領域をカバーし、緯度と経度の各単位を2つの部分に分割しています(緯度と経度の1つのセルが4つの部分に分割されていることがわかります)。 また、ここでは、特定のスケールでこれが完全なデータであり、将来の参照のために保存する必要があることも示されています。
ズームを縮尺に変換
ズームは、Google Maps APIのパラメーターであり、1(世界地図)〜22(通り)の整数です。 各近似単位のデータを要求して保存するのは不便で非実用的です。したがって、GMapsTableはそれらをスケール(緯度と経度の単位を分割する部分の数を示す数値)に変換します。
データ保存
ズーム時にすぐに表示するために、GMapsTableは一部(またはすべて)の縮尺のデータセットを保存します。 たとえば、ロシアのほぼすべてからの座標を持つデータベースがありました-スケール10(500 KB、デスクトップブラウザーでの保存と処理が非常に簡単です)で約42,000セル、スケール200(数MB、大幅なフリーズを引き起こす)で1,700万セル。 したがって、サーバーはすべてのデータのセルの数を推定し、あまり多くない場合はデータベース全体からデータを送信します。 次のアルゴリズムが判明します。
境界線( bounds
)は、フィールドminlat, maxlat, minlon, maxlon
持つJavaScriptオブジェクトですminlat, maxlat, minlon, maxlon
の現在の境界線と十分なマージンがあります。
dataLoader
実装ではdataLoader
異なるスケールに異なる粒度を使用する必要がない場合、またはデータがそのような大きな領域をカバーしていない場合、引数を安全に無視できます。 緯度と経度とscale
でデータとその境界を渡すだけで、緯度経度の単位をどれだけ分割できます。 しかし、図を完成させるために、 dataLoader
関数(またはそれが参照するサーバー)のこの動作をお勧めします。
すべてのパラメーターのリスト
DataContainerには次のパラメーターを指定できます。
1) scaler(zoom)
-GoogleMapsからの近似値をGMapsTableのスケールに変換します。 両方とも整数です。
2) dataLoader(scale, borders)
-新しいデータが必要なときに呼び出されます。 データオブジェクトをDataContainer.processData(data)
渡す必要があります。
borders
引数は、フィールドminlat, maxlat, minlon, maxlon
持つJavaScriptオブジェクトですminlat, maxlat, minlon, maxlon
の現在の境界と予備の十分なマージンがあります。
3) tableBeforeInit(map, table, data)
-テーブルがセルで埋められる前に呼び出されます。 map
引数はGoogle Mapsオブジェクト、 table
は作成されたテーブルのHTML要素、 data
は現在の縮尺に対して指定したdata
オブジェクトです。 ここで、テーブル、現在のデータまたは現在のマップパラメーターを使用する変数を構成できます。
4) cellFormatter(td, val)
-セルを埋めるために呼び出されます。 td
はHTML要素、テーブルセルです。 val
はデータオブジェクトからのデータです。 ここでは、パラメータに従って、いくつかの値の出力または色の塗りつぶしを簡単に構成できます。
5) boundsChangedListener(zoom)
) boundsChangedListener(zoom)
マップの境界線が変更されたときに呼び出されます。
6) minZoomLevel
、 maxZoomLevel
マップの最小および最大近似の変数。 1(世界地図)から22(通り)までの整数。
DataContainerを正常に操作するには、最初の2つの機能のみが必要です。
例とソース
完全でコメントの多い使用例: HTMLページとJSコード 。
また、 GitHubにはGMapsTableもあります 。