如何获取 cartopy 大地测量图的转换数据?

How do I get the transformed data of a cartopy geodetic plot?

如何在以下代码中获取 "handle" - Line2D 对象的转换线的所有数据:

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

ax = plt.axes(projection=ccrs.PlateCarree())
ax.stock_img()

ny_lon, ny_lat = -75, 43
delhi_lon, delhi_lat = 77.23, 28.61

handle = plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat],
         color='blue', linewidth=2, marker='o',
         transform=ccrs.Geodetic(),
         )
plt.show()

更清楚一点: 我不是在寻找 "handle[0].get_data()" 的输出,因为这只是打印我原来的经度和纬度,而是在寻找地图上绘制的大地线的数据。

让我对 OP 提供的代码进行一些计算和绘图检查。

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

ax = plt.axes(projection=ccrs.PlateCarree())
ax.stock_img()

ny_lon, ny_lat = -75, 43
delhi_lon, delhi_lat = 77.23, 28.61

# Plot geodetic path in thick 'blue' line
handle = plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat],
     color='blue', linewidth=10, marker='o',
     transform=ccrs.Geodetic(),
     )

# Get the geodetic path's coordinates to plot on top in 'red'
t_path = handle[0]._get_transformed_path()
path_in_data_coords, _ = t_path.get_transformed_path_and_affine()

ax.plot(path_in_data_coords.vertices[:,0], 
    path_in_data_coords.vertices[:,1],
    color='red', lw=2)

plt.show()

而且,输出图是:

祝贺 OP。

(扩展部分 1)

现在,让我们使用上面获得的坐标来计算测地线的长度。我建议的代码是:

# (*** Continued from the code above ***)
import cartopy.geodesic as geodesic
import numpy as np

# defining the earth shape on which to make calculations
myGeod = geodesic.Geodesic(6378137.0, 1/298.257223563)

# get (lat,long) lists from (long,lat) of the geodesic path
latlonlists = []
[latlonlists.append([lat,lon]) for lon,lat in zip(path_in_data_coords.vertices[:,0], path_in_data_coords.vertices[:,1])]
#print(latlonlists)

# compute length of the geodesic
geodesic_in_meters = myGeod.geometry_length(np.array(latlonlists))

print(geodesic_in_meters)  # output: 17554975.077432975

我找到答案了! 根据这个,您可以通过以下代码片段访问转换的数据:

[handle] = plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat], color='blue', linewidth=2, marker='o', transform=ccrs.Geodetic())

t_path = handle._get_transformed_path()

path_in_data_coords, _ = t_path.get_transformed_path_and_affine()
print(path_in_data_coords.vertices)

这个问题的答案还有第二种方法。