在 Python Cartopy 地图中突出显示地点

Highlight places in Python Cartopy maps

我仍然对 Cartopy 的某些方面感到困惑。我不明白为什么有些指令不起作用...例如,如果我想绘制一张英国地图,我可以使用下面的程序,我得到了我的地图。

我知道 Orthographic 投影使用度数表示经度和纬度,所以我设置 extent = [-6.5, 3.5, 49.5, 59.0] 来限制我的地图,其中 -6.5 表示东经 6.5° 3.5表示西经3.5°

为此,如果我想在地图上突出显示格林威治,我想我必须首先定义它的坐标:Greenwich_lon, Greenwich_lat = 0.0, 51.0,然后绘制这些坐标:ax.plot(Greenwich_lon, Greenwich_lat, marker='x', markersize=12, color='red')

但这让我在地图上找到了一个完全之外的正确位置!

为什么会这样?它来自不合适的ax.plot吗?是不是来自参数Greenwich_lonGreenwich_latax.plot中的定位(我把它们颠倒了,但没有改变)?它是否来自 ax.plot 中缺少的某些指令?它来自使用的投影系统吗?

在哪里可以找到简单明了的解释和示例?我知道 Cartopy 有一个庞大的文档 here,但它是如此之大,以至于我迷失得比什么都重要......

import matplotlib.pyplot as plt
import cartopy
import cartopy.feature as cf
import cartopy.crs as ccrs
import numpy as np

plt.figure(figsize=(8, 8))

extent = [-6.5, 3.5, 49.5, 59.0]
central_lon = np.mean(extent[:2])
central_lat = np.mean(extent[2:])

proj = ccrs.Orthographic(central_lon, central_lat)

ax = plt.axes(projection=proj)
ax.set_extent(extent)
ax.gridlines()

border = cf.NaturalEarthFeature(
    'cultural', 'admin_0_boundary_lines_land', scale='110m') 
land = cf.NaturalEarthFeature(
    'physical', 'land', scale='110m', 
    edgecolor='black', facecolor=cfeature.COLORS['land'])
ocean = cf.NaturalEarthFeature(
    'physical', 'ocean', scale='110m', 
    edgecolor='none', facecolor=cfeature.COLORS['water'])

ax.add_feature(border) 
ax.add_feature(land) 
ax.add_feature(ocean) 

Greenwich_lon, Greenwich_lat = 0.0, 51.0

ax.plot(Greenwich_lon, Greenwich_lat, marker='x', markersize=12, color='red')

plt.show()

Cartopy 始终在 projection 坐标中绘制(与 Matplotlib 中的 data 坐标相同)。通常,它接受大多数投影坐标中的输入数据,并带有指定数据所基于的坐标系的选项。

您有责任使用正确的值和附带的选项。 例如,如果 XXXX() 是您的数据所基于的地图投影坐标,

.set_extent(lon_min, lon_max, lat_min, lat_max, crs=cartopy.crs.XXXX())

.plot(lon, lat, marker'x', transform=cartopy.crs.XXXX())

如果您使用 lat/long 度数,您可以使用 PlateCarree() 代替上面的 XXXX()。 但是,出于方便的原因,.set_extent() 将 crs=cartopy.crs.PlateCarree() 作为您通常忽略的默认选项。

有关坐标系和变换的更多信息:

卡托比 https://scitools.org.uk/cartopy/docs/latest/tutorials/understanding_transform.html 由于 Cartopy 是建立在 Matplotlib 之上的,因此您需要查看 Matplotlib 中的相关主题。

Matplotlib https://matplotlib.org/3.2.1/tutorials/advanced/transforms_tutorial.html