2

空間データベースから情報を取得しています。値はラインストリング(空間)形式のようなもので、この情報を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) に 2 次元のエッジを追加する方法を取得できませんが、それらの間の距離のためにこれらのエッジに重みを追加する必要があります。

各道路の線引きはこんな感じ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 を 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 行目、in from matplotlib import _pylab_helpers、interactive ImportError:名前をインタラクティブにインポートできません

4

1 に答える 1

4

あなたが何を達成したいのか完全にはわかりませんが、これが私がそれをどのように解釈するかです。

道路に沿った座標として定義された道路があり、これらの座標をノードとして描画し、それらの間の道路をエッジとして描画します。また、エッジの重みを2つのノード間の距離にする必要があります。

これは、前のノードを保存し、ピタゴラスの定理を使用して距離を計算することで、非常に簡単に実行できます。これは私がそれをした方法です:

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座標がコンマで区切られていると想定していますが、これは簡単に変更できます。上記のコードは次のようなものを出力します:

これにより、ノードが「正しい」位置に配置されますが、道路の長さに大きな違いがある場合は問題が発生する可能性があります。上記の例では、2つのノードが多かれ少なかれ互いに重なり合っていることがわかります。しかし、それは別の質問です。

于 2012-05-28T09:56:22.657 に答える