Учитывая следующий тест shapefile
, который сделан из только полилиний:NetworkX: добавить ребра к графе из шейпа
я смог воспроизвести узлы пространственной сети, представленной в шейпе :
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)
в основном я использовал временный график G
, чтобы извлечь позиции узлов, которые в итоге появились как часть графика X
. Кажется, это сработало отлично.
Мой вопрос: Следуя той же идее использования G
для извлечения информации из шейп-файла, как я мог бы построить края?
Если я что-то вроде этого
X.add_edges_from(pos.keys())
Тогда я получаю эту ошибку, указывая на строку выше:
TypeError: object of type 'int' has no len()
Код '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) уже генерирует края сети. Я не понимаю, почему вы выбрасываете их ... –
Я рисую 'X', какие узлы являются' [0,1,2, ...] ', поэтому ребра' X' должны быть '[ (0,1), (0,2), ...] '. Вы правы в 'nx.read_shp()', но если вы наберете 'G.edges()', вы получите список, где вместо '(0,1)' вы увидите координаты этих двух точек. Поэтому, я думаю, мне нужно отобразить 'G.edges()' на 'pos'. Но я не знаю, как это сделать – FaCoffee