Рисование дорожки поверх изображения карты с помощью matplotlib - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть коллекция [x, y] пар точек, которые представляют некоторые координаты, и изображение, представляющее карту.Я хотел бы нарисовать поверх рисунка дорожку, сделанную парами координат.Я пытался использовать imshow, figimage, новые оси offsetImage, annotationBBox и т. Д., Но ничего не получалось.Например, annotationBBox показался лучшим выбором, но по какой-то причине он всегда рисуется поверх графика, и если я установил слишком большое смещение, он полностью исчезнет с окончательного графика.Я не мог заставить imshow обрезать изображение, не делая это вручную, что является болью, и figimage также не поддерживает какую-либо функцию масштабирования.

Я в порядке с ручной настройкойкоординаты / поворот карты до тех пор, пока все не будет правильно совмещено.

Чего я не хотел бы, так это какого-то ГИС-решения - карта и координаты являются пользовательскими и не имеют связи с реальным миром / GPS-координатами.

Пример кода, который отображает координаты:

import matplotlib.pyplot as plt
waypoints = [[0, -1, -4, -6, -6], [0, 0, 4, 4, 3]]
plt.plot(waypoints[0], waypoints[1], 'o-')
plt.grid(False)
plt.tick_params(axis='x', which='both', bottom=False, top=False, labelbottom=False)
plt.tick_params(axis='y', which='both', left=False, right=False, labelleft=False)
plt.show()

Original plot

Пример карты:

Map

И конечная комбинация результатов должна выглядеть так:

Map+plot

1 Ответ

0 голосов
/ 10 декабря 2018

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

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.transforms import Affine2D

def get_transform_2pts(q1, q2, p1, p2):
    """ create transform to transform from q to p, 
        such that q1 will point to p1, and q2 to p2 """
    ang = np.arctan((p2-p1)[1] /(p2-p1)[0])-np.arctan((q2-q1)[1] /(q2-q1)[0])
    s = np.abs(np.sqrt(np.sum((p2-p1)**2))/np.sqrt(np.sum((q2-q1)**2)))
    trans = Affine2D().translate(*-q1).rotate(ang).scale(s).translate(*p1)
    return trans


image = plt.imread("https://i.stack.imgur.com/ue5oH.png")
y0 = image.shape[0]
waypoints = [[0, -1, -4, -6, -6], [0, 0, 4, 4, 3]]

# Coordinates for transformation.
lc1 = np.array([0,0])
ic1 = np.array([475, y0-187])

lc2 = np.array([-1, 0])
ic2 = np.array([437, y0-194])

trans = get_transform_2pts(lc1, lc2, ic1, ic2)

fig, ax = plt.subplots()

ax.imshow(np.flipud(image), origin="lower")

plt.plot(waypoints[0], waypoints[1], 'o-', transform=trans+ax.transData)

ax.set_aspect("equal")
plt.show()

enter image description here

Или если выхотите автомасштабировать только на линии,

fig, ax = plt.subplots()
ax.set_aspect("equal")

plt.plot(waypoints[0], waypoints[1], 'o-', transform=trans+ax.transData)

ax.autoscale(False)
ax.imshow(np.flipud(image), origin="lower")

plt.show()

enter image description here

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