Как нарисовать сеть, используя пары координат - PullRequest
0 голосов
/ 08 мая 2019

У меня есть строка:

MULTILINESTRING (
    (0 0, 0 20),
    (20 0, 20 20),
    (7.49080237694725 11.97316968394073, 5.67208473076472 5.229834926470677),
    (19.01428612819832 3.12037280884873, 25.96681259449994 4.024633854021577),
    (14.6398788362281 3.119890406724053, 21.51766222234933 1.803845175041164)
)

, который я люблю рисовать, под этим я подразумевал, что хочу соединить каждый набор пар, скажем, соединить (0 0, 0 20), соединить (0 0) с (0 20) и т. Д.

Я предпочитаю цикл for, а не просто разделяю их на разные линии и соединяю их. для меня также важно использовать Networkx, так как позже я хочу найти некоторую матрицу, такую ​​как смежная матрица.

1 Ответ

0 голосов
/ 08 мая 2019

Хорошо, у нас есть строка:

import networkx as nx
import re

a = """MULTILINESTRING (
    (0 0, 0 20),
    (20 0, 20 20),
    (7.49080237694725 11.97316968394073, 5.67208473076472 5.229834926470677),
    (19.01428612819832 3.12037280884873, 25.96681259449994 4.024633854021577),
    (14.6398788362281 3.119890406724053, 21.51766222234933 1.803845175041164)
)"""

Сначала мы строим регулярное выражение для извлечения всех координат из строки:

REGEX = re.compile(r'\((?P<x1>[\d\.]+) (?P<y1>[\d\.]+), (?P<x2>[\d\.]+) (?P<y2>[\d\.]+)\)')
raw_coords = REGEX.findall(a)

Мы извлекли строки вместо поплавков. Более того, они не в формате, совместимом с Networkx. Поэтому мы переформатируем их:

coords = [
    [(float(c[0]), float(c[1])), (float(c[2]), float(c[3]))]
    for c in raw_coords
]

Создайте график и заполните его нашими ребрами (он автоматически создаст узлы с координатами):

G = nx.DiGraph()
G.add_edges_from(coords)

Создать диктант позиции (необходим для nx.draw):

pos = {n: n for n in G.nodes}

Создать ярлык диктовку (для красивого рисунка):

labels = {n: '({:.2f}, {:.2f})'.format(n[0], n[1]) for n in G.nodes}

И нарисуйте окончательный график:

nx.draw(
    G,
    pos=pos,
    labels=labels
)

Вот оно:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...