我从空间数据库获取信息,其值类似于线串(空间)格式,我需要将此信息添加到networkx图,稍后需要在matplot lib中绘制图形 我写了这段代码
cursor.execute("SELECT AsText(roadstring) FROM road1")
for row in cursor.fetchall():
a=row[0][12:-2]
a=str(a)
a=a.split(",")
for i in a:
i=i.split(" ")
i[0]=float(i[0])
i[1]=float(i[1])
weig=abs(i[0]-i[1])
G.add_node((i[0],i[1]))
我无法获得如何为道路(x1,y1)添加二维边缘到(x2,y2),即使我需要为这些边缘之间的距离增加重量 有什么建议??
每条道路的线条都像643715.202,2499149.0506 643752.61523545,2499089.86084203 643773.6038,2499056.6558 643773.73878609,2499056.44011079 643793.20162482,2499025.34111554 643813.55943268,2498992.81212045 643826.6563,2498971.8852
我收到此错误我安装了matplotlib我试过复制你的代码
Traceback(最近一次调用最后一次):文件“D:\ python \ gis \ new.py”,行 2,在 从matplotlib导入pyplot作为plt文件“C:\ Python27 \ lib \ site-packages \ matplotlib__init __。py”,第133行,在 来自matplotlib.rcsetup import(defaultParams,File“C:\ Python27 \ lib \ site-packages \ matplotlib \ rcsetup.py”,第19行,in 来自matplotlib.colors import is_color_like文件“C:\ Python27 \ lib \ site-packages \ matplotlib \ colors.py”,第54行,in 将matplotlib.cbook导入为cbook文件“C:\ Python27 \ lib \ site-packages \ matplotlib \ cbook.py”,第15行,in 导入新文件“D:\ python \ gis \ new.py”,第2行,in 从matplotlib导入pyplot作为plt文件“C:\ Python27 \ lib \ site-packages \ matplotlib \ pyplot.py”,第20行,in 来自matplotlib import _pylab_helpers,交互式ImportError:无法导入名称交互式
答案 0 :(得分:4)
我不完全确定你想要完成什么,但这就是我的解释方式 它
您将道路定义为道路沿线的坐标,并且您想绘制这些道路 坐标为节点,它们之间的道路为边。你也想要优势 权重是两个节点之间的距离。
通过保存前一个节点并使用毕达哥拉斯定理来计算距离,可以很容易地实现这一点。这是 我是怎么做到的:
import networkx as nx
from matplotlib import pyplot as plt
import math
G = nx.Graph()
row = '643715.202,2499149.0506 643752.61523545,2499089.86084203 ' +\
'643773.6038,2499056.6558 643773.73878609,2499056.44011079 ' +\
'643793.20162482,2499025.34111554 643813.55943268,2498992.81212045 ' +\
'643826.6563,2498971.8852'
a=row.split(" ")
# Saving the previous node to be able to calculate the distance
prev_point = None
# Save the positions in a dictionary to be able to draw
# the nodes at the correct positions
pos = {}
for i in a:
cur_point = tuple([float(x) for x in i.split(',')])
assert len(cur_point) == 2
if prev_point is not None:
# Calculate the distance between the nodes with the Pythagorean
# theorem
b = cur_point[1] - prev_point[1]
c = cur_point[0] - prev_point[0]
a = math.sqrt(b ** 2 + c ** 2)
G.add_edge(cur_point, prev_point, weight=a)
G.add_node(cur_point)
pos[cur_point] = cur_point
prev_point = cur_point
nx.draw(G, pos=pos)
plt.savefig('roads.png')
在这个例子中,我假设一个空格将节点位置和每个节点分开 position的x和y坐标以逗号分隔,但可以轻松更改。上面的代码将输出如下内容:
这会将节点置于“正确”位置,但如果道路长度存在很大差异,可能会导致一些问题。在上面的示例中,您可以看到两个节点或多或少彼此重叠。但这是一个不同的问题。