Насколько я знаю, есть пара подходов, которые вы могли бы использовать, чтобы получить ожидаемый результат.
Во-первых, явно преобразует точки, которые должны быть в собственной проекции ...
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
# create the lat/lon points
lons = np.array([214.5, 2.7, 197.5])
lats = np.array([35, 36, 37.])
# create the projections
ortho = ccrs.Orthographic(central_longitude=0, central_latitude=90)
geo = ccrs.Geodetic()
# create the geoaxes for an orthographic projection
ax = plt.axes(projection=ortho)
# transform lat/lons points to othographic points
points = ortho.transform_points(geo, lons, lats)
# plot native orthographic points
ax.plot(points[:, 0], points[:, 1], 'ro')
# plot north pole for reference (with a projection transform)
ax.plot([0], [90], 'b^', transform=geo)
# add coastlines for reference
ax.coastlines(resolution='50m')
ax.set_global()
Этот график, как и ожидалось ...
Ожидаемый ортографический проекционный участок
Исходная проблема, которую вы видите, заключается в том, что cartopy
пытается интерпретировать последовательность точек как ограниченную геометрию (или траекторию), но становится немного запутанной. Явное преобразование точек широты / долготы в родные точки орфографии уклоняется от этой пули.
Зная этот слепок информации, мы могли бы альтернативно вызвать соответствующий метод, который учитывает список точек как отдельные точки (и избегать cartopy
принятия предположений, которые не соответствуют нашим ожиданиям), используя scatter
вместо plot
...
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
# create the lat/lon points
lons = np.array([214.5, 2.7, 197.5])
lats = np.array([35, 36, 37.])
# create the projections
ortho = ccrs.Orthographic(central_longitude=0, central_latitude=90)
geo = ccrs.Geodetic()
# create the geoaxes for an orthographic projection
ax = plt.axes(projection=ortho)
# plot native orthographic scatter points
ax.scatter(lons, lats, marker='o', c='r', transform=geo)
# plot north pole for reference
ax.plot([0], [90], 'b^', transform=geo)
# add coastlines for reference
ax.coastlines(resolution='50m')
ax.set_global()
Это также работает для меня.
НТН