为什么注释在Cartopy中无法正常工作?

吉普赛尔

代码优先:

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

ax = plt.axes(projection=ccrs.Mercator())
ax.set_extent([72, 135, 18, 53])
ax.annotate('hello', xy=(100, 49), xycoords='data',
            transform=ccrs.PlateCarree(), zorder=12)
plt.show()

结果不是预期的结果,我对我的方法还有其他疑问。所以我的问题是:

  1. 如果要绘制地图,则看起来像网络地图(例如Google地图)。地图区域可能和中国一样大,但大部分都不是全球性的。在四处搜寻之后,这些网站大多使用“网络墨卡托”投影。所以我支持plt.axes(projection=ccrs.Mercator()在这里使用,对吗?或者如果我错了怎么办?

  2. 我要绘制的坐标数据像121°E,49°N(在绘制过程之前将度数转换为十进制),未投影的WGS84坐标系,可能来自GPS。那我可以使用transform=ccrs.PlateCarree()吗?或者如果我错了怎么办?

  3. annotate上述说明不了什么。注释该ax.set_extent行后,“ hello”文本将绘制在零(0,0)点。我要的是点(东经100度,北经49度)如何解决这个问题?

佩尔森

首先-感谢您的代码-它使处理问题变得容易得多。

老实说,我不认为Cartopy之前曾认真使用过注释,所以这可能就是您遇到这个问题的原因-您无所不能;)

看起来这Axes.annotate应该归咎于matplotlib的方法-它破坏了https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/axes/_axes.py#L651传递的转换这主要是因为annotate具有特殊的关键字,用于独立定义坐标和文本位置的转换(请参阅xycoordstextcoordshttp://matplotlib.org/users/annotations_intro.html#annotating-text中)。

当我们深入研究Annotate类时,我们会发现Annotate的_get_xy_transformhttps://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/text.py#L1446)可以处理各种(某些未记录的)表单的值textcoords,包括转换实例。

好,到目前为止,很好。似乎您可以将坐标系设置为,xycoords并且所有内容都应为矮矮胖胖的。但是,令人遗憾的是,annotate不知道如何像大多数matplotlib其余部分那样将Cartopy坐标系转换为matplotlib变换,因此对于批注功能,我们将不得不这样做。

要从任意坐标系的任意坐标轴创建一个matplotlib变换,我们可以简单地执行以下操作:

ax = plt.axes(projection=ccrs.Mercator())
crs = ccrs.PlateCarree()
transform = crs._as_mpl_transform(ax)

现在,我们可以将此转换传递给annotate方法,并且应该在预期的位置以文本和箭头结尾。在使用它时,我采取了一些自由方式来突出注释的一些功能:

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


ax = plt.axes(projection=ccrs.Mercator())

ax.set_extent([65, 125, 5, 40])

ax.add_feature(cartopy.feature.OCEAN)
ax.add_feature(cartopy.feature.LAND)
ax.add_feature(cartopy.feature.BORDERS, linestyle=':', edgecolor='gray')
ax.coastlines()

ax.plot(116.4, 39.95, 'ob', transform=ccrs.PlateCarree())

transform = ccrs.PlateCarree()._as_mpl_transform(ax)
ax.annotate('Beijing', xy=(116.4, 39.9), xycoords=transform,
            ha='right', va='top')

ax.annotate('Delhi', xy=(113, 40.5), xytext=(77.23, 28.61),
            arrowprops=dict(facecolor='gray',
                            arrowstyle="simple",
                            connectionstyle="arc3,rad=-0.2",
                            alpha=0.5),
            xycoords=transform,
            ha='right', va='top')

plt.show()

用Cartopy注释的示例

在回答您的其他问题时:

如果要绘制地图,则看起来像网络地图(例如Google地图)

cartopy.crs中有一个新常量,用于精确定义Google Mercator(cartopy.crs.GOOGLE_MERCATOR)。这只是墨卡托投影的一个实例,并进行了一些调整,使其完全类似于Google墨卡托(https://github.com/SciTools/cartopy/blob/master/lib/cartopy/crs.py#L889)。

我要绘制的坐标数据像121°E,49°N(在绘制过程之前将度数转换为十进制),未投影的WGS84坐标系,可能来自GPS。那我可以使用transform = ccrs.PlateCarree()吗?或者如果我错了怎么办?

我建议您最好使用大地坐标系-此坐标系默认使用WGS84基准面,它将为您提供WGS84纬度和经度的最准确表示。不过,以您目前正在绘制的比例来看,我想您会很难注意到这种差异(中纬度的最大差异约为22Km)。

HTH,

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么即使需要,电话数据注释也无法正常工作?

为什么我的getTimestamp()方法在php中无法正常工作?

为什么高度:0在CSS定义中无法正常工作

为什么我的包裹中的功能无法正常工作

为什么在webview中的javascript无法正常工作?

为什么接头在angular js中无法正常工作

为什么我的代码中的fprintf()函数无法正常工作?

为什么if块中的条件无法正常工作?

毕加索无法在android 10中正常工作。为什么?

为什么这种简单的比较在JavaScript中无法正常工作?

为什么类型转换在Swift 2.0中无法正常工作?

为什么sed中的\ d无法正常工作?

为什么Skimage中的'imshow'在移位时无法正常工作

为什么循环/分组在jQuery中无法正常工作

为什么流查看在 HashMap 中无法正常工作

为什么在Oracle中无法正常工作的情况

为什么正向遍历for循环在JavaScript中无法正常工作

为什么Docker容器中的Django无法正常工作?

为什么“插入或更新”中的命令更新无法正常工作?

为什么JQuery中的.join()无法正常工作?

为什么在JavaScript中的indexOf无法正常工作?

为什么同步在此代码中无法正常工作?

为什么我在jquery中的focus()无法正常工作?

为什么Vue中的@mouseover操作无法正常工作

为什么JavaScript无法在Rails 6中正常工作?

为什么OrWhere在Laravel中无法正常工作

为什么C中的float无法正常工作?

为什么我在CSS中的轻松过渡无法正常工作?

为什么我的React中的clearInterval无法正常工作?