2017-02-10 21 views
0

Учитывая следующий тест shapefile, который сделан из только полилиний:NetworkX: добавить ребра к графе из шейпа

enter image description here

я смог воспроизвести узлы пространственной сети, представленной в шейпе :

import networkx as nx 
import matplotlib.pyplot as plt 

G=nx.read_shp('C:\Users\MyName\MyFolder\TEST.shp') #Read shapefile as graph 
pos = {k: v for k,v in enumerate(G.nodes())} #Get the node positions based on their real coordinates 
X=nx.Graph() #Empty graph 
X.add_nodes_from(pos.keys()) #Add nodes preserving real coordinates 
nx.draw_networkx_nodes(X,pos,node_size=100,node_color='r') 
plt.xlim(450000, 470000) 
plt.ylim(430000, 450000) 

enter image description here

в основном я использовал временный график G, чтобы извлечь позиции узлов, которые в итоге появились как часть графика X. Кажется, это сработало отлично.

Мой вопрос: Следуя той же идее использования G для извлечения информации из шейп-файла, как я мог бы построить края?

Если я что-то вроде этого

X.add_edges_from(pos.keys()) 

Тогда я получаю эту ошибку, указывая на строку выше:

TypeError: object of type 'int' has no len() 
+0

Код 'X.add_edges_from (pos.keys())' вызывает ошибку, потому что 'pos.keys()' список целых чисел. В вашем случае каждый край должен быть задан кортежем из 2 'int' (потому что каждый узел в 'X' имеет тип' int'). Что еще более важно, ['nx.read_shp()'] (https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.readwrite.nx_shp.read_shp.html#networkx.readwrite. nx_shp.read_shp) уже генерирует края сети. Я не понимаю, почему вы выбрасываете их ... –

+0

Я рисую 'X', какие узлы являются' [0,1,2, ...] ', поэтому ребра' X' должны быть '[ (0,1), (0,2), ...] '. Вы правы в 'nx.read_shp()', но если вы наберете 'G.edges()', вы получите список, где вместо '(0,1)' вы увидите координаты этих двух точек. Поэтому, я думаю, мне нужно отобразить 'G.edges()' на 'pos'. Но я не знаю, как это сделать – FaCoffee

ответ

2

Добавление на мой комментарий: nx.read_shp() содержит информацию краевую, а также , На графике G есть узлы, которые выглядят как (x,y). Параметр pos для draw_networkx_* должен быть словарем с узлом в качестве ключа и (x,y) в качестве значения.

import networkx as nx 
import matplotlib.pyplot as plt 

G=nx.read_shp('C:\Users\MyName\MyFolder\TEST.shp') #Read shapefile as graph 
pos = {xy: xy for xy in G.nodes()} 
nx.draw_networkx_nodes(G,pos,node_size=100,node_color='r') 
nx.draw_networkx_edges(G,pos,edge_color='k') 
plt.xlim(450000, 470000) 
plt.ylim(430000, 450000) 
+0

Мне очень нравится этот ответ, спасибо. Он даже сохраняет направленность, если он этого захочет. – FaCoffee