Python NetworkX:从形状文件向图形添加边

Python NetworkX:从形状文件向图形添加边,python,networkx,shapefile,edges,Python,Networkx,Shapefile,Edges,给定以下测试仅由多段线构成的shapefile: 我能够重现shapefile中表示的空间网络的节点: 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 positio

给定以下测试
仅由多段线构成的shapefile

我能够重现shapefile中表示的空间网络的节点:

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
从shapefile提取信息的相同想法,如何绘制边

如果我做这样的事

X.add_edges_from(pos.keys())
然后我得到了这个错误,指向上面的一行:

TypeError: object of type 'int' has no len()
补充我的评论:
nx.read_shp()
也保存边缘信息。图形
G
具有类似
(x,y)
的节点。
draw\u networkx.*
pos
参数需要是一个字典,其中节点作为键,
(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)
补充我的评论:
nx.read_shp()
也保存边缘信息。图形
G
具有类似
(x,y)
的节点。
draw\u networkx.*
pos
参数需要是一个字典,其中节点作为键,
(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)

代码
X.add\u edges\u from(pos.keys())
引发错误,因为
pos.keys()
是整数列表。在您的情况下,每个边都需要由2
int
s的元组指定(因为
X
中的每个节点都属于
int
类型)。更重要的是,已生成网络的边缘。我不明白你为什么要把它们扔掉……我正在绘制
X
,哪些节点是
[0,1,2,…]
,所以
X
的边必须是
[(0,1),(0,2),…])
。关于
nx.read_shp()
,您是对的,但是如果您键入
G.edges()
,您将得到一个列表,其中可以看到这两点的坐标,而不是
(0,1)
。所以我想我需要将
G.edges()
映射到
pos
。但是我不知道怎么做(pos.keys())中的代码
X.add\u edges\u会引发错误,因为
pos.keys()
是一个整数列表。在您的情况下,每个边都需要由2
int
s的元组指定(因为
X
中的每个节点都属于
int
类型)。更重要的是,已生成网络的边缘。我不明白你为什么要把它们扔掉……我正在绘制
X
,哪些节点是
[0,1,2,…]
,所以
X
的边必须是
[(0,1),(0,2),…])
。关于
nx.read_shp()
,您是对的,但是如果您键入
G.edges()
,您将得到一个列表,其中可以看到这两点的坐标,而不是
(0,1)
。所以我想我需要将
G.edges()
映射到
pos
。但是我不知道怎么做我真的很喜欢这个答案,谢谢。它甚至保留了方向性,以防有人需要。我真的很喜欢这个答案,谢谢。它甚至保留了方向性,以防人们需要它。