Cartopy地图填充整个坐标轴

2 投票
1 回答
941 浏览
提问于 2025-04-27 21:28

我想用Cartopy在一个网格上绘制数据(这个网格是LCC投影),希望数据能够填满整个坐标轴(虽然还有其他坐标轴,但这里不讨论那个)。

为了让你更明白,我在Cartopy中做了以下操作:

import cartopy.crs as ccrs
import numpy as np
import pyproj as p4
from mpl_toolkits.basemap import Basemap

lalo = #read latitudes and longitudes of my grid defined in a special LCC projection (below)

lat = np.reshape(lalo[:,1],(ny,nx))
lon = np.reshape(lalo[:,0],(ny,nx))
minlat = lat[0,0]
maxlat = lat[-1,-1]
minlon = lon[0,0]
maxlon = lon[-1,-1]
Z = np.ones((ny,nx)) #some data

#grid definition for cartopy:
myproj = ccrs.LambertConformal(central_longitude=13.3333, central_latitude=47.5,
                               false_easting=400000, false_northing=400000,
                               secant_latitudes=(46, 49))
fig = plt.figure()
ax = plt.axes(projection = myproj)    
plt.contourf(lon, lat, Z)#, transform=myproj) 
#no difference with transform option as lon,lat are already in myproj projection

结果是一个图像,没有填满整个坐标轴,效果如下:

Cartopy

而当我使用Basemap这样做时:

a=6377397.155
rf=299.1528128
b= a*(1 - 1/rf)
m = Basemap(projection='lcc', resolution='h', rsphere=(a,b),
        llcrnrlon=minlon,llcrnrlat=minlat,urcrnrlon=maxlon,urcrnrlat=maxlat,
        llcrnrx=400000, llcrnry=400000,
        lat_1=46, lat_2=49, lat_0=47.5, lon_0=13.3333, ax=ax)
x,y = m(lon,lat)
m.contourf(x,y,Z)

我得到了以下(想要的)图像:

Basemap

最后,当我使用proj4来转换经纬度,使用这个定义 p4.Proj('+proj=lcc +lat_1=46N +lat_2=49N +lat_0=47.5N +lon_0=13.3333 +ellps=bessel +x_0=400000 +y_0=400000') 时,我又得到了想要的图像:

proj4

请问有没有办法在Cartopy中也实现这个效果呢?

换句话说,我希望绘制的图像能够呈现出一个完美的矩形,而背景地图则相应地被扭曲,也就是说,想要的效果和这个例子正好相反(我无法安装iris包,否则我会尝试这个例子)。

我尝试了一些方法,比如:

  • 建立一个自定义的投影类,就像这里做的那样,确保所有参数都设置正确(和我的proj4定义一致)。
  • 尝试调整纵横比,但这些只影响坐标轴,而不是整个轴,还有其他一些尝试。

任何帮助都非常感谢!

暂无标签

1 个回答

2

这里缺少的重要信息是,你的数据是用经纬度表示的,而不是用笛卡尔坐标系(也就是我们常说的直角坐标系)。所以,你需要使用一个能够理解经纬度的笛卡尔坐标系(目前还没有实现球面轮廓)。这样的坐标系统叫做PlateCarree,只需要把它作为数据转换的参数传入,就能把你的数据放到正确的位置。

plt.contourf(lon, lat, Z, transform=ccrs.PlateCarree())

这实际上强调了一个事实:你数据的默认坐标系统和地图的坐标系统是一样的,而在大多数情况下,这并不是经纬度。要改变你数据的坐标系统,唯一的方法就是传入转换的参数。

希望这对你有帮助。

撰写回答