首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Cartopy中绘制直线,Robinson投影

在Cartopy中绘制直线,Robinson投影
EN

Stack Overflow用户
提问于 2018-10-16 10:43:05
回答 1查看 1.9K关注 0票数 2

我在玩cartopy,试图理解它是如何工作的。我尝试的第一件事与the docs中“向地图添加数据”部分中的示例非常相似。

我正试着在我的罗宾逊投影上画一条直线,从澳大利亚的阿德莱德到英国的利物浦。这是我的代码:

代码语言:javascript
运行
复制
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属性仅限于某些投影而不是其他投影的内容,所以我不明白为什么会发生这种情况。有谁能解释一下这件事吗?

EN

Stack Overflow用户

发布于 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

代码语言:javascript
运行
复制
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()

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52827226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档