2

Google マップを使用して開発中のアプリケーションについてアドバイスを求めています。

概要: ユーザーは、基準を満たすストリート セグメントを検索するための基準のリストを持っています。道路セグメントは、平均以下、平均、平均以上の 3 色で表示されます。次に、ユーザーが道路セグメントをクリックすると、その特定のセグメントのプロパティを示す情報ウィンドウが表示され、ウィンドウを閉じて他のポリラインが再び表示されるまで、選択されていないセグメントが非表示になります。これはハズブロが数ヶ月前に作ったモノポリー シティ ストリート ゲームによく似ていますが、私は Flash を使用しておらず、ストリート セグメントをリストしていないため、オープン ストリート マップを使用できません。とにかく同じ)、Google スケッチの構築を表示する必要はありません。

情報: ID、ポリライン ポイント、重心を持つ道路セグメントのデータベースがあります。データベースには、6,000,000 のストリート セグメント レコードが含まれています。生成されたデータを少し絞り込むために、都市に注目します。表示しなければならない最大の都市には、250,000 通りのセグメントがあります。これは、250,000 線分のポリラインを表示することを意味します。

最も長いポリラインは、SQL Server 2008 の 2 つの 8000 varchar 列に格納されている 9600 文字を使用しています。

API v2 より高速で、アプリケーションを iPhone に移植するため、API v3 を使用する必要があります。今のところ、SQl Server 2008 アプリケーションを使用した ASP.NET 3.5 です。パフォーマンスが優先されます。

問題: これを行うデモ プロジェクトのほとんどは、API v2 で作成されています。したがって、Google API v3 リファレンス ページのチュートリアル以外に、目標を達成するためのパフォーマンスやテクノロジの使用を比較するものは何もありません。API v3 用の .NET ラッパーはまだありません。

250,000 線分のポリラインを生成すると、重いファイルが作成され、転送と解析に時間がかかります。(390,000 ポイントの 1 つのポリラインのデモを見つけました。ポイントが少ないポリラインが多いと、丸みが少なくなるため、エンコーダの効率が大幅に低下すると思います。) 道路セグメントは基準に基づいて表示されるため、ポリラインは動的に作成する必要があります。キャッシュは使用できません。

いくつかの考え:

KML/KMZ:

長所: 標準であるため、Bing マップ、Yahoo! マップ、Google マップ、Google Earth、同じ KML ファイル。データ生成は同じです。

短所: KML の LineString は、Google マップ API が処理できるようにポリラインをエンコードできません。したがって、おそらく大きくなり、表示が遅くなります。このサイズでファイルを圧縮すると、処理時間が長くなり、クライアント側でデータを圧縮解除する必要があります。250,000 個のデータで、iPhone がこれをどのように処理し、サーバーが 40 人のユーザーの同時ブラウジングをどのように処理するかはよくわかりません。

JavaScript ファイル:

長所: JavaScript ファイルにはエンコードされたポリラインを含めることができ、転送するファイルが大幅に削減されます。

短所: オーバーレイを追加したり、ポリラインを作成したりするために、独自のストリップ バージョンの API v3 を作成する必要があります。単に KML ファイルを作成してソースを指すよりも複雑です。

GeoRSS: このオプションは私のニーズには合っていないと思いますが、間違っている可能性があります。

MapServer: MapServer を使用してオーバーレイを生成することを提案する投稿を見ました。データベースとの接続とそれがもたらすパフォーマンスについてはよくわかりません. さらに、KML を生成するためのプラグインが必要です。独自の KML ファイルまたは JavaScript ファイルを作成するよりも良い結果が得られるとは思えません。メンテナンスはなくても簡単です。

モノポリー シティ ストリート: ゲームは終了しましたが、モノポリー シティ ストリートは最大ズーム レベルで重心がウィンドウの境界内にある通りのみを表示していました。マップを移動すると、新しい通りを表示するようにサーバーに要求が送信されました。これは独創的だと思いますが、同様のものを実装する方法がわかりません。私が考えた唯一のことは、long がマップ エリア X の境界内にあり、Y と同じであるかどうかを比較することでした。これにより、高ズーム レベルでパフォーマンスが大幅に向上する可能性がありますが、都市全体を表示する場合は何も得られません。

クラスタリング: クラスターはマーカーには最適ですが、ポリラインをクラスター化することはできないようです。ポリライン用のMarkerClustererのようなものが好きで、3 つのポリラインの色でクラスタリングできるようにしたいと思います。これはおそらく、「すごいことになっていただろうが、それを忘れる」というままになるでしょう.

矢印: ポリラインの方向を示す将来のバージョンがあり、重心に矢印を表示する必要があります。画像またはマーカーをロードしてもデータが 2 倍になるだけなので、カスタム オーバーレイを作成することがおそらく唯一の選択肢になるでしょう。私が達成したい同様のデモを見つけました残念ながら、デモは非常に遅いですが、デモのように複数ではなく、ポリラインごとに 1 つの矢印のみを表示したいと考えています。KML はカスタム オーバーレイをサポートしていないと思うので、この機能はデータの形式に依存します。

基準: アプリケーションは ASP.NET 3.5 で作成されますが、iPhone へのポートはアプリケーションを表示するために Web を使用せず、基準を選択するための画面サイズが制限されます。これが、パラメーターで渡された基準に基づいてファイルを生成するサービスまたはページをより重視していた理由です。サービスは、マップ上にポリラインを表示するために必要なファイルを生成します。これを行う aspx ページを作成することもできます。aspx ページは、サービスの方法よりも詳細に文書化されています。理由があるはずです。

質問:

  • 道路セグメント ファイルを返す Web サービスを作成するか、ファイルを返す aspx ページを作成する必要がありますか?
  • 最大経度/緯度ポリラインには 9600 文字があり、最大 250,000 の線分ポリラインをレンダリングする必要があるという事実に基づいて、エンコードされたポリラインまたは経度/緯度を含む KML を含む JavaScript ファイルを作成する必要があります。または、オーバーレイを生成する MapServer を使用する必要がありますか?
  • 次のバージョンでポリライン上にシンプルな矢印を表示できるようになるでしょうか。
  • KML 生成の場合XDocument、XmlDocumentを使用してファイルを作成しXmlWriter、これを手動で作成するか、ストリーム内のストリート セグメントを単にシリアル化する方が高速ですか?

これは、実際のコードの問題というよりは、ブレインストーミング スタック オーバーフローの質問です。可能性を狭めるのに役立つ答えは、より良い選択を指摘するすべての知識を持っている人と同じくらい良い.

4

1 に答える 1

10

多数の短い GPolylines は、少数の長い GPolylines よりも大幅に遅くなります

Google マップ v2 と Google マップ v3 の速度の差はそれほど大きくありません。これは、CPU 時間のほとんどがブラウザの実際のグラフィック システムによって消費されるためです。Google マップは、ブラウザに応じて、VML、SVG、または Canvas グラフィック システムを使用します。これらのうち、VML は最も遅く、ブラウザーが MSIE の場合は常に VML が使用されます。

250,000 の線分に取り組む前に、この200 のランダム ポリラインのクイック スピード テストをご覧になることをお勧めします。MSIE でそのマップをズームおよびパンしてみてください。

次に、250,000 の線分を指定するためにサーバーからクライアントに送信する必要があるデータの量も考慮してください。データの量は、KML を選択するか、JSON を選択するか、GeoRSS を選択するかによって異なりますが、ライン セグメントあたり 20 バイトになると、1 メガビットのブロードバンド接続でフェッチするのに 50 秒かかります。ユーザーが 50 秒間座っていられるかどうかを検討してください。

本当に理にかなっている唯一の解決策は、Google がトラフィック オーバーレイに対して行っていることを行い、サーバーでタイルに線を描画し、それらのタイルをクライアントで GTileLayerOverlay として表示することです。

必要なのは、空間認識データベースと、gd や ImageMagik などのサーバー側グラフィック ライブラリです。クライアントはサーバーにタイルを要求します。ズームが特定のレベルを超える場合、サーバーはデータベースをスキャンして、要求されたタイルのバウンディング ボックスとオーバーラップするバウンディング ボックスを持つ線分を探し、グラフィック ライブラリを使用してそれらを描画します。

ズーム レベルの制限は、データベースとサーバーが実行する必要のある作業量を制限するためにあります。1 つのズームアウト タイルに 250,000 の線分を描画することは望ましくありません。これは、サーバーにとって非常に大変な作業であり、ユーザーにとってはあまり意味がないからです。

クリックの取り扱いについて:

オブジェクトではなくマップ上でのクリックをリッスンし、クリックの詳細をサーバーに送信するのが簡単です。次に、サーバーはクリック位置を使用して空間認識データベースを検索し、クリックされたオブジェクトの詳細があればそれを返します。クライアント コードはこれを行います。

  GEvent.addListener(map,"click",function(overlay,point) {
    var url="clickserver.php?lat=" + point.lat() + "&lng=" +point.lng();
    GDownloadUrl(url, function(html) {
      if (html.length) {
        map.openInfoWindow(html)
      }
    });
  });

難しいのは、ポインターがポリライン上にあるときにカーソルの変更を処理することです。小さなマーカーのカーソルを変更するための既知の手法があり、次のように機能します。

タイルがフェッチされるたびに、.getTileUrl() は、そのタイルのホットスポット ボックスのリストを返すサーバーへの呼び出しも行います。マウスが移動すると、クライアントは常にマウスが置かれているタイルを計算し、対応するホットスポット ボックスのリストをスキャンします。

Google 自身は、GLayer() コードで、四分木検索を実行してタイル内のホットスポットの検索を高速化する洗練された機能を追加していますが、独自のコードでこの戦略を実装した他の人々は、それは必要ではないと考えており、線形スキャンホットスポットリストの速度は十分です。

ポリライン検出上のカーソルを処理するためにそれを拡張する方法がわかりません。

于 2009-12-11T17:24:43.573 に答える