2

我从空间数据库中获取信息,这些值类似于线串(空间)格式,我需要将此信息添加到 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 我尝试通过复制您的代码

回溯(最后一次调用):文件“D:\python\gis\new.py”,第 2 行,从 matplotlib 导入 pyplot as 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 行,在 import matplotlib.cbook as cbook 文件中 "C:\Python27\lib\site-packages\matplotlib\cbook.py",第 15 行,在 import new File 中D:\python\gis\new.py",第 2 行,从 matplotlib 导入 pyplot 作为 plt 文件 "C:\Python27\lib\site-packages\matplotlib\pyplot.py",第 20 行,in from matplotlib import _pylab_helpers, interactive ImportError: cannot import name interactive

4

1 回答 1

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')

在这个例子中,我假设一个空格分隔节点位置,每个位置的 x 和 y 坐标用逗号分隔,但这很容易改变。上面的代码将输出如下内容:

这会将节点置于其“正确”位置,尽管如果道路长度存在很大差异,它可能会导致一些问题。在上面的示例中,您可以看到两个节点或多或少位于彼此之上。但这是一个不同的问题。

于 2012-05-28T09:56:22.657 回答