2016-01-19 35 views
3

我想比較街道網絡與隨機生成的街道網絡的比較。使用write_shp在NetworkX中寫shapefile

作爲一個起點,我用NetworkX創建了一個隨機圖,每個節點都有一個隨機位置。我想將它導出到shape文件中,以便我可以在ArcGIS中使用它。我檢查了NetworkX文檔,很高興看到他們有一個write_shp()方法。他們的文檔中提到:

「節點和邊預計將有一個衆所周知的二進制(WKB)或 知名文本(WKT)鍵,以便產生幾何形狀也 接受與數字元組關鍵節點。 (X,Y)「。

我決定將每個節點的位置存儲爲一個(x,y)元組,而不是將WKT作爲節點的屬性。

這裏是我使用的代碼:

g=nx.fast_gnp_random_graph(15, 0.25) 

#Relabel Nodes 
mapping=dict(zip(g.nodes(),"ABCDEFGHIJKLMNO")) 
g=nx.relabel_nodes(g, mapping) 

radius=100000 #100 Km 

for d in g.nodes_iter(data=True): #I know this is a round about way to do this, but I might need node attributes later 
     #Generate point location 
     t = random.random() * (math.pi * math.pi) 
     r = radius * math.sqrt(random.random()) 
     x = r * math.cos(t) 
     y = r * math.sin(t) 
     co_od=(x,y) 
     nx.set_node_attributes(g, 'loc', {d[0]: co_od}) 

nx.write_shp(g, './shp/trialAgainShp') 

我收到以下錯誤跟蹤:

File "D:\ProgramFiles\Anaconda\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 699, in runfile 
    execfile(filename, namespace) 

    File "D:\ProgramFiles\Anaconda\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 74, in execfile 
    exec(compile(scripttext, filename, 'exec'), glob, loc) 

    File "C:/Users/Dipto/Desktop/CSProceedings_AuthorTools_Word_2003/createGrapg.py", line 62, in <module> 
    nx.write_shp(g, './shp/trialAgainShp') 

    File "D:\ProgramFiles\Anaconda\lib\site-packages\networkx\readwrite\nx_shp.py", line 183, in write_shp 
    g = netgeometry(n, data) 

    File "D:\ProgramFiles\Anaconda\lib\site-packages\networkx\readwrite\nx_shp.py", line 157, in netgeometry 
    fkey = [float(x) for x in key] 

ValueError: could not convert string to float: A 

然而,當我打開文件夾「trialAgainShp」,我確實看到創建shape文件名稱爲'節點',但是它們是空的。

我不知道我要去的地方錯了


EDITS:

我試過2件更多的事情:

  1. 我想也許節點必須有數字標籤是轉換爲shapefile並將標籤更改爲字母造成失敗。
  2. 我嘗試添加WKT到每個節點用下面的代碼作爲FOR循環的最後幾行:

    #Create WKT 
        wkt='POINT(' + str(x) + ' ' + str(y) + ')' 
        print wkt 
        nx.set_node_attributes(g, 'WKT', {d[0]: wkt}) 
    

第一個選項沒有任何效果作爲錯誤保持相同。第二個改變錯誤以下幾點:

... 
nx.write_shp(g, './shp/trialAgainShp') 

    File "D:\ProgramFiles\Anaconda\lib\site-packages\networkx\readwrite\nx_shp.py", line 183, in write_shp 
    g = netgeometry(n, data) 

    File "D:\ProgramFiles\Anaconda\lib\site-packages\networkx\readwrite\nx_shp.py", line 139, in netgeometry 
    elif type(key[0]).__name__ == 'tuple': # edge keys are packed tuples 

TypeError: 'int' object has no attribute '__getitem__' 

回答

2

如果你想要去的元組鍵,我覺得合理的,你必須把它的座標存儲爲您的節點的密鑰(而不是作爲一個屬性) 。

快速審判修改了一下你的代碼:

In [26]: 

mapping = {} 
counter = 0 
for d in g.nodes_iter(data=True): #I know this is a round about way to do this, but I might need node attributes later 
     #Generate point location 
     t = random.random() * (math.pi * math.pi) 
     r = radius * math.sqrt(random.random()) 
     x = r * math.cos(t) 
     y = r * math.sin(t) 
     co_od=(x,y) 
     nx.set_node_attributes(g, 'loc', {d[0]: co_od}) 
     mapping[counter] = co_od 
     counter += 1 

In [28]: 

g=nx.relabel_nodes(g, mapping) 

In [29]: 

nx.write_shp(g, '...') 

希望它能幫助。

+0

工作!謝謝。 – DotPi

+0

我發現的唯一問題是write_shp不保留節點和邊的屬性。 – DotPi

+0

嗨!我認爲你必須使用Wkb或Wkt,但我真的沒有嘗試過自己。也許會發布更多關於你正在嘗試做什麼的細節,我會盡力幫忙。 – lrnzcig