Построение прямой в Картопи, проекция Робинсона - PullRequest
0 голосов
/ 16 октября 2018

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

Я пытаюсь нарисовать прямую линию из Аделаиды, Австралияв Ливерпуль, Великобритания, по моей проекции Робинсона.Это мой код:

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

ax = plt.axes(projection=ccrs.Robinson())
ax.coastlines()
ax.stock_img()

ad_lat, ad_lon = -34.93, 138.60
liv_lat, liv_lon = 53.41, -2.99

plt.plot([ad_lon, liv_lon], [ad_lat, liv_lat],
          color='blue', linewidth=1, marker='o', markersize=3,
          )

plt.show()

Однако в результате на карте появляется один маркер.В документах сказано, что по умолчанию, если вы не укажете свойство transform для plt.plot, оно использует свойство для осей (в данном случае Робинзона).Когда я явно добавляю 'transform = ccrs.Robinson ()', происходит то же самое.Тем не менее, он позволяет мне использовать «ccrs.Geodetic ()» для изогнутой линии или ccrs.PlateCarree () для слегка шаткой прямой линии.

Я не могу найти ничего в документах о преобразованиисобственность ограничена одними проекциями, но не другими, поэтому я не понимаю, почему это происходит.Кто-нибудь может пролить свет на это?

1 Ответ

0 голосов
/ 17 октября 2018

Аргумент преобразования связан с данными, которые вы выводите.Вы указываете начальную и конечную точки линии в широте / долготе, и поэтому единственными разумными преобразованиями являются Geodetic и PlateCarree.

Когда вы устанавливаете transform=ccrs.Robinson() Cartopy предполагает, что предоставленные вами координаты уже находятся вПроекция Робинсона, которой они не являются.Размеры проекции Робинсона в собственных координатах очень велики по сравнению с географическими координатами (возможно, порядка ~ 1e7), поэтому обе выбранные вами точки находятся очень близко к центру проекции, поэтому вы просто видите точку.

Если вы хотите, чтобы линия была прямой при прорисовке на проекции Робинсона, вам придется построить ее в координатах проекции.Это просто, если использовать систему преобразований Cartopy, как в приведенном ниже модифицированном примере.Дополнительные сведения о том, как работают ключевые слова Cartopy для преобразования / проекции, см. https://scitools.org.uk/cartopy/docs/v0.16/tutorials/understanding_transform.html.

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

ax = plt.axes(projection=ccrs.Robinson())
ax.coastlines()
ax.stock_img()

ad_lat, ad_lon = -34.93, 138.60
liv_lat, liv_lon = 53.41, -2.99

# New bit: transform the given lat/lon points into the Robinson projection
geodetic = ccrs.Geodetic()
robinson = ccrs.Robinson()
ad_lon_t, ad_lat_t = robinson.transform_point(ad_lon, ad_lat, geodetic)
liv_lon_t, liv_lat_t = robinson.transform_point(liv_lon, liv_lat, geodetic)

plt.plot([ad_lon_t, liv_lon_t], [ad_lat_t, liv_lat_t],
         color='blue', linewidth=1, marker='o', markersize=3,
         # Be explicit about which transform you want:
         transform=robinson)

plt.show()

straight line in Robinson projection

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