必须指向二维图(x,y)坐标networkx python
Posted
技术标签:
【中文标题】必须指向二维图(x,y)坐标networkx python【英文标题】:Have to point two dimensional graph(x,y) co ordinates networkx python 【发布时间】:2012-06-02 08:52:34 【问题描述】:我从空间数据库中获取信息,这些值类似于线串(空间)格式,我需要将此信息添加到 networkx 图形中,稍后需要在 matplot 库中绘制图形 我已经写了这段代码
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 导入(defaultParams,文件“C:\Python27\lib\site-packages\matplotlib\rcsetup.py”,第 19 行,在 从 matplotlib.colors 导入 is_color_like 文件“C:\Python27\lib\site-packages\matplotlib\colors.py”,第 54 行,在 将 matplotlib.cbook 导入为 cbook 文件“C:\Python27\lib\site-packages\matplotlib\cbook.py”,第 15 行,在 导入新文件“D:\python\gis\new.py”,第 2 行,在 从 matplotlib 导入 pyplot 作为 plt 文件“C:\Python27\lib\site-packages\matplotlib\pyplot.py”,第 20 行,在 from matplotlib import _pylab_helpers, interactive ImportError: cannot import name interactive
【问题讨论】:
如果您能提供一个您尝试解析的文本示例——“AsText(roadstring)”将会很有帮助。 【参考方案1】:我不完全确定你想要完成什么,但这是我的解释 它。
您将道路定义为沿道路的坐标,并且您想绘制这些道路 坐标作为节点,它们之间的道路作为边。你也想要边缘 权重是两个节点之间的距离。
这可以很容易地通过保存前一个节点并使用勾股定理来计算距离来完成。这是 我是怎么做到的:
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')
在这个例子中,我假设一个空格将节点位置和每个 位置的 x 和 y 坐标用逗号分隔,但这很容易改变。上面的代码会输出如下内容:
这会将节点置于“正确”位置,但如果道路长度存在很大差异,可能会导致一些问题。在上面的示例中,您可以看到两个节点或多或少位于彼此之上。但这是一个不同的问题。
【讨论】:
只是评论:您可以从b
和c
中删除abs()
调用,因为它们稍后会被平方,所以符号不是问题。
感谢您的回复,我还需要使用已知最大值和最小值的边界框以 png 格式绘制图形
@kigurai 非常正确,删除了它们。 @Rakesh我也添加了图像的保存。听起来您希望节点的位置成为实际坐标。 draw
可以获取职位字典并执行此操作,take a look here。
我需要他们在他们的真实位置我可以通过其他方式做到这一点
我需要他们处于他们的真实位置我可以通过其他方式做到这一点我试图在地图上绘制一组道路以上是关于必须指向二维图(x,y)坐标networkx python的主要内容,如果未能解决你的问题,请参考以下文章