我在玩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指定转换属性,它将使用轴的转换属性(在本例中为Robinson)。当我显式地添加'transform=ccrs.Robinson()‘时,同样的事情发生了。但是,它确实允许我使用'ccrs.Geodetic()‘表示曲线,或者使用ccrs.PlateCarree()表示稍微不稳定的直线。
我在文档中找不到任何关于transform属性仅限于某些投影而不是其他投影的内容,所以我不明白为什么会发生这种情况。有谁能解释一下这件事吗?
发布于 2018-10-18 02:05:44
transform参数与您要绘制的数据相关联。您在经度/经度中指定了直线的起点和终点,因此唯一合理的转换是Geodetic和PlateCarree。
当您设置transform=ccrs.Robinson()
时,Cartopy假设您提供的坐标已经在罗宾逊投影中,但它们不是。本地坐标中的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()
https://stackoverflow.com/questions/52827226
复制相似问题