すべてのOpenStreetMapデータをインデックス付きの方法で効率的に保存するにはどうすればよいですか?


8

私が持っているPBFファイル国に関する以下の情報が含まれています。

  • それぞれ独自の経度、緯度、プロパティを持つノード。2Dスペースにポイントを格納するために使用されます。

  • それぞれのプロパティを持つ方法は、ノードを介して接続されます。道路、境界を保存するために使用されます。

このファイルの圧縮形式は80 MBですが、圧縮解除してDBに保存すると、592 MBになります。

ええ、それはベルギーだけの国のためのものです。フランス、ドイツ、イタリアを一緒に保管することを想像してください。


たとえば、アントワープからブリュッセルを通ってシャルルロワまでの単一の高速道路を見てみましょう。これは、高速道路のすべてのターンを格納するための大量のノードで構成されますが、これらすべてのターンが必要ですか?疑わしい。

私が何ができるようになりたいのか教えてみましょう:

  • さまざまなズームレベルで地図を表示したい。少なくとも大都市、小都市、街路レベル。

  • 2点間のルーティング情報を取得できるようにしたい。

  • GPS位置に最も近い道路を計算できるようにしたい。

  • データベース内のインデックスを使用して、場所を検索します。

ただし、最も重要なのは、データベースがモバイルデバイスに保存されるため、データベースが大きくなりすぎないことです。


そこで、2つの手法の組み合わせについて考えました。

  • すべての個々のノードの保存/処理を回避するための、表示目的の画像タイル。

  • 道路に関する情報とともに、ルート情報の道路の端点を保存します。

この問題は、この情報だけではGPS位置に最も近い道路を計算できないことです。高速道路の曲がりを想像すると、2つの端点だけで高速道路にいると判断できません。エンドポイント間で中間ノードを保存することを考えていましたが、生成には非常にコストがかかると思います。また、道路の端点(Tスプリットのようなもの)を決定することは、T字型スプリットの上部に中点を保存する必要があるかどうかを理解する必要があるため、それほど簡単なことではありません。

したがって、画像タイルを使用すると表示が簡単です。しかし、ルーティングとGPS位置検索を行う簡単な方法を見つけることができません。どのようなストレージテクニックを検討する必要がありますか?80 MBファイルがのデータベースに変わるのは少し不便592 MBですが、そのサイズをできるだけ小さくしたいと思います...

これをできるだけ効率的に行うにはどうすればよいですか?ディスクとCPUに関して。WP7をターゲットにしています...


580MBのうちどれだけがノード/ウェイデータであり、どれだけがデータに高速アクセスするためのインデックスであるか
k3b

回答:


4

主な問題は、道路に関する重要な情報を追加するノードのみが含まれているように思えます。

つまり、GPSを必要とせずに、ジャンクションとエンディングにノードを格納するだけです(これを開始/終了ノードと呼びます)。明らかに重量/コストなどを含みます。

これへのアプローチについて考えることができる1つの方法は、最初にすべての開始/終了ノードを追加することです。これは最低限必要なものです。明らかにこれは曲がりくねった道路を考慮に入れていません。

次に、すべての道路(終了地点からジャンクションまたはジャンクションからジャンクションとして定義)について、次の手順を実行します。

  1. すべての中間ノードをループ処理し、各ノードから道路までの最小距離を計算します(開始点と終了点のみで開始するため)、これまでに含まれたノードによって定義されます。
  2. 上記の合計が(some constant threshold * number of intermediate nodes)中間ノードを追加する必要がある場合よりも大きい場合。そうでない場合は、ループを終了します。
    • 中間ノードを追加するには、現在の道路表示からの距離が最大のノードを見つけて追加します。

それはもっと理にかなっています、今私は良いしきい値が何であるか疑問に思います。80 MBの圧縮ファイルからではなく、すでに持っている582 MBのデータベースから始めることもできますが、すべてを実装するのは難しいようです。他のアイデアが表示されるか確認するために質問を開いたままにします... :)
Tamara Wijsman

ノードの数を増やす(サイズを大きくする)とノードの数を減らす(精度を下げる)の間でしきい値のバランスをとる必要があると思います。最初のステップで、ジャンクションとエンドポイントのみを含むより小さなDBを生成できるとします。
ジョージダケット

実際のパスを含む、ノード間のデータを保持する必要があることに行き詰まっています。ノード間にはコストがありますが、交差点間で変わる可能性があります。制限速度と車線数は交差点で変わるだけではありません。最も近い道路を計算するには、正確な経路を知る必要があります。実際のパスに加えてノード間の接続線には、そのセグメントのすべてのメタデータが必要です。このメタデータは、ルーティングとルート案内に必要です。
mhoran_psprep

パスを見つけるには、ノードの数を減らすことでおそらく回避できます。たとえば、道路(ジャンクション間)に複数のノードがあり、速度制限に変更があったとしても、一度では問題にならない場合があります。次のジャンクションに進む必要がある道路。異なる速度制限とそれらの速度制限の長さを考慮してノードを削減するときは注意してください。レーン数も同じです。適切なエッジウェイトまで減らす必要があります。
George Duckett、2012

また、「ジャンクション」の定義にも依存しますが、これは最も減少するが、正確性が最も低くなるのは、単純に2つ以上の道路が交わる場所です。代替案は、道路のプロパティが変更された場所です(つまり、マイナー->メジャー、30 km-> 40 kmなど)。
George Duckett、2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.