Получить прогнозируемые координаты из геометрических координат - PullRequest
0 голосов
/ 06 мая 2019

У меня есть карта, нарисованная с помощью Cartopy и Matplotlib.У меня есть конкретная геометрическая координата (в широте / долготе), и я хотел бы знать координату пикселя, ближайшую к проекции этой геометрической координаты (если она видима), например, чтобы нарисовать изображение над координатой на карте.

(Обратите внимание, я не хочу рисовать с помощью Matplotlib; я экспортирую фигуру как растровое изображение и рисую в другой части конвейера.)

Эта документация предполагает, что это может быть что-то вроде этого:

import cartopy, matplotlib.pyplot

fig = matplotlib.pyplot.figure()
ax = fig.add_axes([0, 0, 1, 1], projection=cartopy.crs.Orthographic())
ax.add_feature(cartopy.feature.LAND, facecolor='black')

# Print the location of New York City in display coordinates
lon, lat = -74.0060, 40.7128
trans = cartopy.crs.Geodetic()._as_mpl_transform(ax)
x, y = trans.transform((lon, lat))
print(x, y)

# Or this way
projx, projy = ax.projection.transform_point(lon, lat, cartopy.crs.Geodetic())
x, y = ax.transData.transform((projx, projy))
print(x, y)

Хотя интересно, если я нанесу эту точку на карту, фигура центрируется и увеличивается в Манхэттене, а затем выходные координаты отображения действительно находятся вцентр фигуры в (640, 480).

matplotlib.pyplot.plot(lon, lat, marker='o', color='red', markersize=12,
    alpha=0.7, transform=cartopy.crs.Geodetic())

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Я только что обнаружил, что преобразования не установлены должным образом, пока фигура не будет в своем конечном состоянии.Таким образом, ключ должен сначала нарисовать фигуру,

fig.canvas.draw()

или, по крайней мере, правильно применить аспект.

ax.apply_aspect()

Затем вы получите правильные координаты пикселей,

import matplotlib.pyplot as plt
import cartopy
import cartopy.crs as ccrs

fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.PlateCarree())
ax.add_feature(cartopy.feature.LAND, facecolor='black')
ax.set_global()

# before being able to call any of the transforms, the figure needs to be drawn
fig.canvas.draw()
# or
# ax.apply_aspect()

# Print the location of New York City in display coordinates
lon, lat = -74.0060, 40.7128
trans = ccrs.PlateCarree()._as_mpl_transform(ax)
x, y = trans.transform_point((lon, lat))
print(x,y)

plt.show()

Это печатает:

188.43377777777778 312.3783111111111

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

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

В моем примере кода мне не удалось указать экстент карты. Если я добавлю

ax.set_global()

, тогда преобразованные координаты являются разумными.

Я представил два способа вычисления преобразованных координат, но способ с _as_mpl_transform(), похоже, возвращает центральную точку, когда Нью-Йорк не виден. Способ с ax.projection.transform_point() возвращает NaN в нерабочем состоянии.

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