2012-04-18 130 views
6

私はAjaxでBing Mapsを使用しており、プッシュピンをドロップする場所は約80,000箇所あります。この機能の目的は、ユーザがルイジアナ州のレストランを検索して、プッシュピンをクリックして健康検査情報を確認できるようにすることです。Bing Mapsで多数のプッシュピンを処理する方法

明らかに地図上に一度に80,000ピンを持つのはあまり効果がありませんが、私はこの問題を解決するのに苦労しています。別の問題は、これらの場所間の距離が非常に小さいことです(すべて80,000人がルイジアナにあります)。マップを乱雑にするのを避けるためにクラスタリングを使うことができるのは知っていますが、それでもパフォーマンスの問題が発生するようです。

私が現在行っているのは、特定のズームレベルまでピンを表示せずに、現在のビュー内のピンのみを表示することです。私が現在しようとしているのは、viewchangeendイベントを使用してズームレベルとマップの境界を見つけ、その範囲内の任意のポイントについてデータベースに(Webサービスを通じて)照会することです。

私はこれを間違った方法で行っているように感じます。この大量のデータを管理するより良い方法はありますか?最初はすべてのポイントをロードしてから、マップが動くたびにWebサービスにアクセスする必要はなく、データを手元に置いておく方がよいでしょうか。もしそうなら、私はどうすればそれについて行きますか?

私は自分の質問に対する回答を見つけることができませんでした。これは通常、間違った質問をしていることを意味します。誰かが正しい質問を見つけられるように助けてくれれば、それは大いに感謝されます。

+0

多くのデータポイントを視覚化しようとしている場合、おそらくはプッシュピンがそれを行う最良の方法ではありません。代わりにヒートマップを使うことを考えましたか? –

+0

コメントありがとう!私はそれを考えていませんでしたが、それをチェックした後、ユーザーは個々の場所を選択してその場所の情報ページに移動する必要があるため、私のシナリオではうまくいかないと思います。それをもっと明確にするために質問を編集します。 – Justin

答えて

9

さて、私はこれに対して少し異なるアプローチを実装しました。それはちょうど楽しい練習でしたが、私はHTML5のキャンバスを使ってBing Mapsに自分のすべてのデータ(約140.000点)を表示しています。

以前にすべてのデータをクライアントにロードしました。次に、描画プロセスを最適化して、ビュー変更プロセス中に常に発生する「Viewchange」イベントにアタッチしました。

私はこれについてブログに書いています。あなたはそれを確認することができますhere

私の例は、それに対話を持っていませんが、簡単に行うことができます(ブログ記事の素敵な話題です)。このように、イベントを手動で処理し、対応するポイントを自分で検索するか、描画するポイントの量やズームレベルがある閾値を下回った場合は、通常のプッシュピンを表示します。あなたはBing Mapsのに限定されていない場合


とにかく、別のオプションは、Leafletの同類を使用することです。キャンバスレイヤーを作成することができます。キャンバスレイヤーはタイルベースのレイヤーですが、HTML5キャンバスを使用してクライアントサイドでレンダリングされます。それは新しい可能性を広げます。例thisの地図をGisCloudにチェックしてください。


さらに別のオプションは、スタティックデータに適していますが、UTFGridというテクニックを使用しています。それを開発した若者は私よりも確かにexplainですが、それはあなたが望むように、多大なパフォーマンスを伴って多くの点のために拡大します。それは、あなたの情報を持つタイルレイヤーと、タイルの機能を記述する "ascii-art"ファイルのようなものを伴う付随するjsonファイルを持つことから成っています。次に、waxというライブラリを使用して、パフォーマンス上の影響をまったく受けることなく、完全なマウスオーバー、マウスクリックイベントを提供します。

私はまたそれについてbloggedを持っています。

+0

興味深い概念ですが、私は実際にマップ上に詳細な寸法(線の長さ、角度など)を表示するためにキャンバスが使用される屋根マッピングアプリケーションの場合、非常に似たようなことをしました。しかし、このアプローチの問題は、キャンバス要素がマップに移動するのに使用されたすべてのポインタイベントを受け取るようになることです。 none標準のCSSプロパティーpointer-events:noneはこれを解決できますが、一部のブラウザー、特にIEではサポートされていません。 javascriptで手動でイベントを通過しようとすると混乱のように思える。私はあなたがこれを解決する方法を知っているかどうかを知ることに興味があります。 –

+0

実際には、イベントはマップに直接移動します。私が見たビデオを見たことがありますか?すべてのズームとパンは、Bing Mapsによって直接処理されます。 – psousa

+0

あなたは何をしているのか分かります。私は地図divの上にキャンバスを配置している間にキャンバスを地図divに挿入しました。しかし、あなたのアプローチでも、キャンバスは引き続き追加することができるプッシュピンのような他のマップ要素の上にあります。私は、マップタイルの上にキャンバスを挿入しようとするとか、押しピンや図形のような他のマップ要素の下にキャンバスを挿入しようとするなど、巧妙なことをすることができると思いますが、それは正しく実装するための痛みのようです。とにかく+1;) –

3

私はあなたがそれを使用して離れて得ることができる場合、クラスタリングはあなたの最善の策だろうと思う。クラスタリングを使用しようとしたが、それでもパフォーマンスの問題が発生したとしますか?私はV7 Interactive SDKで80000のデータポイントでそれを試してみるとうまくいくようです。 Runボタンを押し、次に

TestDataGenerator.GenerateData(80000,dataCallback); 

TestDataGenerator.GenerateData(100,dataCallback); 

:リンクに行くことによって自分自身をそれをテストし、Load module - clusteringタブ内の行を変更します。そのパフォーマンスは、多くのデータポイントで私にとって受け入れられるようです。

+0

正直言って、私はそれをテストしていませんでした。私はマップ上で描画するだけでなく、Webサービスを起動してデータベースから読み込むことについても心配していました。間違った方法で問題に近づいていると思っていたが、実際にはうまくいくかもしれない。助けてくれてありがとう! (私はここでは新しく、私はまだ15の評判ポイントを持っていないので、あなたの答えを+1できません...申し訳ありません)。 – Justin

関連する問題