必要な結果:
「エッジ」と「ノード」の 2 つのテーブルを持つデータベース。特定のエリア (都市など) 内のすべての走行可能な道路 (高速道路) を表すグラフを生成するために使用できます。データセットは .osm ファイルから解析されます。
バックグラウンド:
2 つのテーブル (ノードとエッジ) を持つデータベースを作成する 2 回目の試行を行います。これを使用して、さまざまな最短経路の計算を実行できます。
最初に、さまざまなデータをデータベースに手動で抽出しようとしました (php スクリプト):
- .osm ファイルのすべてのノードを「ノード」テーブルに解析します
- すべてのエッジを「エッジ」テーブルに解析します (つまり、ウェイを解析し、それらからエッジ (開始ノードと宛先ノードで構成される) を生成し、エッジにタグを同時に追加します。
- ブラックリストに登録されたタグ (高速道路ではない) を持つすべてのエッジをエッジ テーブルから削除します。
- エッジ テーブルに存在しないすべてのノードをノード テーブルから削除します。
問題は、このシーケンスは非常に信頼性が低く、数千のノードなどの小さなデータセットでのみ「まあまあ」機能するが、数百万のノードでは機能しないことです。
問題:
数百万のノードとエッジで構成されるデータベースでは、道路の抽出 (特定のタグ フィルターに基づいてエッジを生成する場合) が非常に遅くなります。
考えられる解決策:
今回やること:
- PostgreSQL rdbms をセットアップします。
- 完全なノード、ウェイ、およびリレーション テーブルを取得するために、OSM 既製のスクリプトを使用して .osm ファイルを解析します。
- 特定のタグ (例: 'highway') を持つすべてのエッジを、ways テーブルから新しい 'edges' テーブルに抽出します。
- エッジ テーブルに存在するすべてのノードを新しい graph_nodes テーブルに抽出します。
- その後、おそらく「edges」テーブルと「graph_nodes」テーブルから「道路」グラフを生成できます。
質問:
.osm ファイルをデータベースに正しく解析して、結果として「エッジ」テーブルと「ノード」テーブルを作成するにはどうすればよいですか?
.osm から走行可能な道路のみをデータベースに抽出するにはどうすればよいですか?
どうすれば高速に実行できますか (数週間ではなく、何百万ものノードとエッジ テーブルに対して実行されるスクリプトの時間数を意味します)。
関係を考慮する必要がありますか?
はいの場合、どうすればよいですか?