代码优先:
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()
结果不是预期的结果,我对我的方法还有其他疑问。所以我的问题是:
如果要绘制地图,则看起来像网络地图(例如Google地图)。地图区域可能和中国一样大,但大部分都不是全球性的。在四处搜寻之后,这些网站大多使用“网络墨卡托”投影。所以我支持plt.axes(projection=ccrs.Mercator()
在这里使用,对吗?或者如果我错了怎么办?
我要绘制的坐标数据像121°E,49°N(在绘制过程之前将度数转换为十进制),未投影的WGS84坐标系,可能来自GPS。那我可以使用transform=ccrs.PlateCarree()
吗?或者如果我错了怎么办?
在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具有特殊的关键字,用于独立定义坐标和文本位置的转换(请参阅xycoords
和textcoords
在http://matplotlib.org/users/annotations_intro.html#annotating-text中)。
当我们深入研究Annotate类时,我们会发现Annotate的_get_xy_transform
(https://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()
在回答您的其他问题时:
如果要绘制地图,则看起来像网络地图(例如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] 删除。
我来说两句