5

必要な結果:

「エッジ」と「ノード」の 2 つのテーブルを持つデータベース。特定のエリア (都市など) 内のすべての走行可能な道路 (高速道路) を表すグラフを生成するために使用できます。データセットは .osm ファイルから解析されます。

バックグラウンド:

2 つのテーブル (ノードとエッジ) を持つデータベースを作成する 2 回目の試行を行います。これを使用して、さまざまな最短経路の計算を実行できます。

最初に、さまざまなデータをデータベースに手動で抽出しようとしました (php スクリプト):

  • .osm ファイルのすべてのノードを「ノード」テーブルに解析します
  • すべてのエッジを「エッジ」テーブルに解析します (つまり、ウェイを解析し、それらからエッジ (開始ノードと宛先ノードで構成される) を生成し、エッジにタグを同時に追加します。
  • ブラックリストに登録されたタグ (高速道路ではない) を持つすべてのエッジをエッジ テーブルから削除します。
  • エッジ テーブルに存在しないすべてのノードをノード テーブルから削除します。

問題は、このシーケンスは非常に信頼性が低く、数千のノードなどの小さなデータセットでのみ「まあまあ」機能するが、数百万のノードでは機能しないことです。

問題:

数百万のノードとエッジで構成されるデータベースでは、道路の抽出 (特定のタグ フィルターに基づいてエッジを生成する場合) が非常に遅くなります。

考えられる解決策:

今回やること:

  • PostgreSQL rdbms をセットアップします。
  • 完全なノード、ウェイ、およびリレーション テーブルを取得するために、OSM 既製のスクリプトを使用して .osm ファイルを解析します。
  • 特定のタグ (例: 'highway') を持つすべてのエッジを、ways テーブルから新しい 'edges' テーブルに抽出します。
  • エッジ テーブルに存在するすべてのノードを新しい graph_nodes テーブルに抽出します。
  • その後、おそらく「edges」テーブルと「graph_nodes」テーブルから「道路」グラフを生成できます。

質問:

.osm ファイルをデータベースに正しく解析して、結果として「エッジ」テーブルと「ノード」テーブルを作成するにはどうすればよいですか?

.osm から走行可能な道路のみをデータベースに抽出するにはどうすればよいですか?

どうすれば高速に実行できますか (数週間ではなく、何百万ものノードとエッジ テーブルに対して実行されるスクリプトの時間数を意味します)。

関係を考慮する必要がありますか?

はいの場合、どうすればよいですか?

4

2 に答える 2

1

コメントで述べたように、ブラックリストに登録されているエッジを実際に挿入する必要はありません。また、別の問題が頭に浮かびます。とにかくノードテーブルからノードを削除する必要があるのはなぜですか? ノード テーブルに特別なフラグ フィールド (使用済みと呼びましょう) を追加できます。

ノード テーブルに新しい行を挿入すると、このフィールドは false に設定されます。また、エッジ テーブルに挿入するためのトリガーを実装することもできます。これにより、挿入された行ごとに、ノード テーブル内の適切な行が使用済みとしてマークされます。

それが終わったら、未使用のノードをすべて削除できます。つまり、現在、次のようなものを使用していると思います。

delete from nodes where id not in (select start_node from edges);
delete from nodes where id not in (select end_node from edges);

そして、次のことをお勧めします。

delete from nodes where used = false;
于 2011-04-26T12:34:26.123 に答える
0

浸透を使用してタスクを実行できます。次に、境界ボックスを提供するだけです...複数の例と詳細な説明については、このリンクを確認してください (「使用例」の章を確認してください)

于 2012-08-10T06:05:55.053 に答える