2012-05-27 3 views
2

Я получаю информацию из пространственной базы данных, значения подобны линейному строковому (пространственному) формату, и мне нужно добавить эту информацию на график networkx позже, нужно рисовать график в matplot Lib Я написал этот кодНужно указать двухмерную диаграмму (x, y) координаты networkx python

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 (most recent call last): File "D:\python\gis\new.py", line 2, in from matplotlib import pyplot as plt File "C:\Python27\lib\site-packages\matplotlib__init__.py", line 133, in from matplotlib.rcsetup import (defaultParams, File "C:\Python27\lib\site-packages\matplotlib\rcsetup.py", line 19, in from matplotlib.colors import is_color_like File "C:\Python27\lib\site-packages\matplotlib\colors.py", line 54, in import matplotlib.cbook as cbook File "C:\Python27\lib\site-packages\matplotlib\cbook.py", line 15, in import new File "D:\python\gis\new.py", line 2, in from matplotlib import pyplot as plt File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 20, in from matplotlib import _pylab_helpers, interactive ImportError: cannot import name interactive

+2

Было бы полезно, если бы вы могли привести пример текста, который вы пытаетесь проанализировать, - «AsText (roadstring)». – gilesc

ответ

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

В этом примере я предполагаю, что пространство разделяет позицию узлов и каждый позиции по й и у координаты разделена запятая, но это может быть легко изменен. Приведенное выше код будет выводить что-то вроде этого:

Это поставит узлы на свои «правильные» позиции, хотя это может вызвать некоторые проблемы, если есть большие различия в длине дороги. В приведенном выше примере вы можете видеть, что два узла более или менее расположены друг над другом. Но это другой вопрос.

+0

Просто комментарий: вы можете удалить 'abs()' вызовы из 'b' и' c', так как они позже квадрат, так что знак не является проблемой. –

+0

Спасибо за ответ. Мне также нужно построить график в формате png с ограничивающей рамкой, которая известна как max и min – Rakesh12

+0

@kigurai Очень верно, удалили их. @Rakesh Я добавил сохранение изображения. Похоже, вы хотите, чтобы позиции узлов были фактическими координатами. 'draw' может взять словарь позиций и сделать это, [взгляните сюда] (http://networkx.lanl.gov/reference/generated/networkx.drawing.nx_pylab.draw.html#networkx.drawing.nx_pylab. привлечь). – Maehler

Смежные вопросы