2011-04-26 17 views
5

所需的結果:如何從.osm文件建立在數據庫中的「道路」圖表

具有兩個表的數據庫,「邊緣」及「節點」,其可被用於產生的曲線圖代表某個地區(如城市)中所有可行駛的公路(高速公路)。數據集從.osm文件中解析。

背景:

我要爲我的第二次嘗試用兩個表創建一個數據庫 - 節點,可以用來做就可以了不同的最短路徑計算的邊緣。

首先我試圖手動提取不同數據到數據庫中(PHP腳本):

  • 解析從.osm文件中的所有節點爲「節點」表
  • 所有邊緣解析成「邊「表(即解析方式並從這些邊生成邊(由起始節點和目標節點組成),同時將標記添加到邊上;
  • 刪除所有包含黑名單標記的邊緣(非高速公路)從邊緣表中刪除;
  • 刪除節點表中不存在於邊緣表中的所有節點。

問題是這個序列是非常不可靠的,它只能在小數據集上工作,如數千個節點,但不是數百萬個。

問題:

用由數以百萬計的節點和邊,道路提取(基於特定標籤濾波器胃內產生邊緣)是極其緩慢的數據庫。

可能的解決辦法:

什麼,我要做到這一點時間:

  • 設立的PostgreSQL RDBMS;
  • 使用OSM預製腳本解析.osm文件以獲取完整的節點,方式和關係表;
  • 將具有特定標籤(例如'高速公路')的所有邊緣從路表中提取到新的「邊」表中;
  • 將存在於邊緣表中的所有節點提取到新的graph_nodes表中;
  • 之後,我可能會從'邊緣'和'graph_nodes'表格生成'道路'圖。

問:

如何正確地解析.osm文件導入到數據庫中有「邊緣」和「節點」表的結果呢?

如何從.osm中只提取可驅動的道路到​​數據庫中?

我該如何快速執行(我的意思是幾個小時的腳本運行數百萬個節點和邊緣表,而不是幾周)?

我是否應該考慮關係?

如果是,我應該怎麼做?

+0

爲什麼要補充的邊緣,如果你已經知道他們被列入黑名單?在這種情況下,無需添加它們...... – 2011-04-26 12:28:09

+0

您可以在姊妹網站http://gis.stackexchange.com/或OSM的http://help.openstreetmap.org/ – 2011-04-26 12:28:51

+0

上獲得更好的答案Rowland ,我可以將這個問題重新發布到gis.stackexchange.com嗎?你知道是否有任何規則? – Kirill 2011-04-29 08:43:53

回答

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; 
0

您可以使用反滲透來執行任務。然後你只需要提供一個邊框... 對於多個例子,進一步說明檢查:this link (請參見「用法示例」)

相關問題