我在玩Cartopy,试图了解它是如何工作的。我尝试的第一件事与the docs中“向地图添加数据”部分下的示例非常相似。
根据我的鲁滨逊投影,我试图画一条从澳大利亚阿德莱德到英国利物浦的直线。这是我的代码:
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()
但是,这会在地图中间产生一个标记。文档说,默认情况下,如果不为plt.plot指定一个transform属性,它将使用一个作为轴(在这种情况下为Robinson)。当我显式添加'transform = ccrs.Robinson()'时,会发生同样的事情。但是,它的确使我使用了“ ccrs.Geodetic()”作为一条曲线,或者使用ccrs.PlateCarree()作为一条稍微偏斜的直线。
我在文档中找不到关于transform属性仅限于某些投影而不是其他投影的任何信息,因此我不明白为什么会发生这种情况。谁能对此有所启发?
答案 0 :(得分:1)
transform参数绑定到您正在绘制的数据。您正在以纬度/经度指定直线的起点和终点,因此,唯一明智的变换是Geodetic和PlateCarree。
设置transform=ccrs.Robinson()
时,Cartopy假设您提供的坐标已经在Robinson投影中,而实际上不在。与地理坐标相比,本机坐标中的Robinson投影范围非常大(也许约为1e7),因此您选择的两个点都非常靠近投影的中心,这就是为什么只看到一个点的原因。
如果要在Robinson投影上绘制直线时,直线必须在投影坐标中绘制。使用Cartopy的转换系统,这很简单,如下面的修改示例所示。有关Cartopy的transform / projection关键字如何工作的更多指导,请参见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()