30,000データポイント...これは、openlayersを使用して合理的に提供できますか?


8

私はWeb GISの問題に取り組んでおり、最善の戦略を見つける必要があります。30,000セルの地図があり、アルバータ州のグリッドを形成しています。各セルのデータポイントのリストがあります-すべてのセルに約50のインジケータフィールドと値があります。たとえば、1つの値が人間の母集団である場合、各セルにはその細胞の人間の母集団の値があります。これらの値をセルの四角形またはブレンドされたヒートマップタイプの外観で視覚的に表示できるインタラクティブマップを作成したいと考えています。さらに、すべてのデータポイントで複合計算を行い、それらの計算を使用して追加のマップを作成できるようにしたいと考えています。計算を考慮すると、マップには約300,000の順列があります。それを締めくくるために、それはまた一時的です。16の異なるタイムスライスがあります。

これまでの私の戦略:

1)サーバー側で、実行時に動的にセル値を計算し、値をクライアントに送信します(すべての30,000)。これは、画面上の525px x 525pxの画像の3x3ピクセルの正方形ごとの値にほぼ相当します。

2)レイヤーが開いているクライアント側で、サイズ変更可能な1px pngを使用し、必要に応じてアルファ値を調整して、各セルのデータ値に対応する異なる色のグラデーションを表示します。地図がズームインまたはズームアウトすると、PNGのサイズが変更されます。理論的には、正方形としてマップのブランケットカバレッジを形成するように正確に配置されるか、ヒートマップアプローチを使用して、ブランケットカバレッジを形成するのに十分に重なり合うことになります。

質問:

これらのセル値をサーバー上で動的に計算してから、リアルタイムでOpenLayersインターフェースに送信するのは妥当ですか?サーバーが計算を実行できると確信していますが、OpenLayersは一度に30,000データポイントを合理的に地図上に表示できますか?ポイントデータを使用して包括的なカバレッジを作成できると期待するのは妥当ですか?私は、マップの100%のブランケットカバレッジを提供する30,000のシェイプを持つベクトルマップと同等のものを作成しようとしていると思いますが、ポイントデータを使用して簡略化しています。

私の心の代替戦略は次のとおりです。

a)サーバー上でリアルタイムでマップを生成し、ラスタライズされたレイヤーとしてクライアントに送信する

b)すべての順列を事前に生成し、それらをラスタライズされたマップとしてサーバーに保存する

何かご意見は?私のアプローチは道を外れ、間違った木を吠えていますか?より良い方法に関するアドバイスはありますか?

この問題についてのご意見をお待ちしております。あなたが興味を持っているなら、私はそれを手伝うために開発者と契約することを探しているかもしれません。

本当にありがとう!

ノア


私はさらに調査していて、完全に間違ったルートを取っている可能性があります... GeoServerでレンダリング変換を使用するのはどうですか... GeoServerが30,000データポイントの変換を生成する速度
Noah Purves-Smith、2012

OpenLayersをクラスタを使用する- Flickrの例dev.openlayers.org/releases/OpenLayers-2.12/examples/...
Mapperz

コメントMapperzをありがとう...残念ながら、クラスタリングは私たちが必要とするものを本当に解決しません。
Noah Purves-Smith、2012

回答:


13

この質問は何度も尋ねられました。まっすぐ上にある30kポイントは、OLマップでは機能しません。または、Flash / Silverlightマップでも。

大まかな(大まかな!)覚えておくべき桁数-JSマップ(openlayers)で100ポイント、Flashマップ(ArcGIS FlashまたはSilverlightなど)で1,000ポイント、デスクトップアプリ(ArcGIS Desktop)で10,000ポイントが優れたパフォーマンスですレベル。これらは「実際の」ポイントであり、以下に概説するように非表示または偽造されていません。

それだけでなく、30kポイントを操作するのはあまり良くありません。「その1つの」マーカーを別のマーカーの後ろにアクセスするにはどうすればよいですか?

次の2つのオプションがあります。

1)サーバーで、先ほど述べたようにラスターを作成します。WMSサービスを提供し、ユーザーがポイントをクリックまたはホバーすると、サーバーに戻ってデータを取得します

2)表示するポイントの数を減らします。主にサーバー側のクラスタリングと、境界ボックスのトリミングを介して。クライアント側のクラスタリングは「大丈夫」で「かわいい」ですが、30kポイントでは役に立ちません。遅くなります。したがって、bbox戦略を使用してレイヤーを設定すると、OLがパン/ズーム時にサーバーを呼び出し、100〜300ポイント未満が返されるポイントにトリミングされた新しいデータセットを返します。


それに負けない!私の答えでは、1番が拡張されています。
Michael Markieta

答えをありがとうバディム。私は問題を十分に説明したとは思いませんが、間違った解決策を見ていたと思います。サーバーでラスターを作成することは、さらに詳しく調べた今、間違いなく適切な方法だと思います。私はこれが初心者だと言えますか?
Noah Purves-Smith、2012

@ノア-問題ありません。あなたは正しい軌道に乗っています:) WMSは、あなたがそれを凝縮することができない限り、あまりにも多くのデータのためのより良い方法です。
Vadim 2012

いい答えだ。私の解決策は、あなたの2番目の提案に似ていて、100万のデータポイントのデータセットをサポートすることができました。
cjstehno 2013

6

UIとUXの観点から見ると、地図上の30,000の個々のポイントは、データを正確に表現しているとは限りません。

ラスタライズされたポイントデータの上でUTF8グリッドを使用することもできます。ただし、グリッドの解像度とポイントの数により、データの選択は非常に予測不可能になり、最高のUXではなくなります。http://mapbox.com/developers/utfgrid/

OLクラスターとUTF8グリッドの組み合わせは興味深いでしょう。これは、UTF8グリッドを使用して選択できるよりも、ラスタークラスターを返すサーバーサイズのデータ​​のクラスター化によって実行できます。この時点以降の操作の選択肢は、さらに拡大することです(OLなどの従来のクライアント側のベクトルクラスタリング手法の場合と同様)。また、そのクラスター内の平均値を計算してユーザーに提示するなど、いくつかのデータを処理することもできます。


2

すでに述べたように、OLを介した30,000の機能は非常に悪い考えです。Chromeでキャンバスレンダリングを使用して10,000ポイントを管理しましたが、問題なく動作しましたが、グラフィック(.png)マーカーに切り替えるとクロールしました。

私はあなたのサーバーサイドアプローチの提案を提供したかっただけです。明らかに、事前に300,000の順列すべてを事前に生成することはできず、スコープは最終的には大きくなるはずです。SLDでWMSを使用する場合は、次の方法でマップを生成できます。

クライアント(OpenLayersなど)がサーバーにWMS画像をリクエストします。リクエストのURLにはパラメーターが含まれます。...&SLD=http://app-server/sld?time=2010&measure=population...ここでSLDパラメーターは、オンザフライでSLDを生成するためのURL(URLエンコードする必要があります)です。WMSサーバーが要求を受け取ると、アプリケーションサーバーに一意のSLDを照会し、XML応答を取得します。次に、ユーザーが要求した順列を生成します。

WMSおよびPHPのGeoServer for SLDを生成してこれを実行しましたが、パフォーマンスは問題ありませんでした(しかし、そうすべきではない理由はありませんでした。状況が異なる場合があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.