我想比較街道網絡與隨機生成的街道網絡的比較。使用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件更多的事情:
- 我想也許節點必須有數字標籤是轉換爲shapefile並將標籤更改爲字母造成失敗。
我嘗試添加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__'
工作!謝謝。 – DotPi
我發現的唯一問題是write_shp不保留節點和邊的屬性。 – DotPi
嗨!我認爲你必須使用Wkb或Wkt,但我真的沒有嘗試過自己。也許會發布更多關於你正在嘗試做什麼的細節,我會盡力幫忙。 – lrnzcig