使用Cartopy绘制其他Projecton中的投影数据
问题内容:
这个问题是关于绘制一些我使用Lambert
Conformal(LCC)CRS的数据。尽管这些问题特别涉及在多个投影中绘制LCC数据,但它也通常适用于Cartopy的使用,因为我想更好地了解使用Cartopy进行绘制的逻辑/过程。
以下是一些我想做的代码示例。第一个示例只是绘制一些LCC数据。我使用的数据可在此处的链接中找到。
import cartopy.crs as ccrs
import cartopy.feature as cf
import matplotlib.pyplot as plt
import numpy as np
proj = ccrs.LambertConformal(central_latitude = 25,
central_longitude = 265,
standard_parallels = (25, 25))
# Data and coordinates (from download link above)
with np.load('nam_218_20120414_1200_006.npz') as nam:
dat = nam['dpc']
lat = nam['lat']
lon = nam['lon']
ax = plt.axes(projection = proj)
ax.pcolormesh(lon, lat, dat, transform = ccrs.PlateCarree())
ax.add_feature(cf.NaturalEarthFeature(
category='cultural',
name='admin_1_states_provinces_lines',
scale='50m',
facecolor='none'))
ax.coastlines('50m')
ax.add_feature(cf.BORDERS)
plt.show()
产生的图可以在这里看到:
LCC地图上的美国露点
使用Cartopy时,我的第一个困惑就是为什么PlateCarree
在绘制时总是要转换为?我最初的想法是该呼叫的transform
关键字pcolormesh
需要LCC投影信息,而不是PlateCarree
。
接下来,如果我想在其他投影(例如正交投影)中绘制我的LCC数据,我会像下面这样进行吗?
# First, transform from LCC to Orthographic
transform = proj.transform_points(ccrs.Orthographic(265,25), lon, lat)
x = transform[..., 0]
y = transform[..., 1]
ax = plt.axes(projection = ccrs.Orthographic(265,25))
ax.pcolormesh(x, y, dat, transform = ccrs.PlateCarree())
ax.add_feature(cf.NaturalEarthFeature(
category='cultural',
name='admin_1_states_provinces_lines',
scale='50m',
facecolor='none'))
ax.coastlines('50m')
ax.add_feature(cf.BORDERS)
ax.set_global()
产生的图可以在这里看到:
正交地图上的美国露点
我认为“正交”地图看起来不错,但是我想确保自己正确理解了用Cartopy进行重新投影的过程。
总而言之,我想了解以下内容:
- 你总是必须
transform
要PlateCarree
打印时?为什么或者为什么不? - 重新投影是否只需要调用该
transform_points
方法,或者是否涉及其他步骤?
更新1
根据@swatchai的答案,似乎我的问题2的答案似乎transform_points
不是必需的。人们可以transform
在许多matplotlib绘图方法中简单地使用关键字参数。这就是我最初的想法。但是,跳过该操作transform_points
对我没有用。请参见下面的示例:
ax = plt.axes(projection = ccrs.Orthographic(265,25))
ax.pcolormesh(lon, lat, dat, transform = proj)
ax.add_feature(cf.NaturalEarthFeature(
category='cultural',
name='admin_1_states_provinces_lines',
scale='50m',
facecolor='none'))
ax.coastlines('50m')
ax.add_feature(cf.BORDERS)
ax.set_global()
产生此图:
没有transform_points步骤的正交图
问题似乎在于纬度和经度输入未转换为网格坐标,因此它们仅在极小区域内绘制。因此,在问题2的基础上,如果您应该跳过transform_points
,基于上述示例,cartopy的绘图方法是否存在错误?还是我还缺少一步?
问题答案:
需要在地理坐标和投影(或网格)坐标之间进行重要区分。可以在这里找到更详细的描述。重要的是,经度和纬度是 地理
坐标,而单位为米的点是 投影 坐标,这有助于回答问题1 。
示例数据来自的数值天气模型在计算中使用了Lambert
Conformal投影(更多信息请参见)。但是,输出的坐标是纬度和经度。如果您对空间数据缺乏经验,那么您可能会以为 纬线 对是LCC 投影
坐标,而实际上它们却是 地理 坐标。在模型集成期间会使用LCC内容。
要回答问题1,不,您不必总是PlateCarree
用作源CRS。但是,您确实总是将PlateCarree
经纬度数据用于此处(在这种情况下)。这样,cartopy将正确地将纬度/经度值转换为
投影 坐标(以米为单位),并能够transform
在绘图过程中轻松地将数据转换为其他投影。这个问题最终是Update
1中看似空白图的原因。通过说源数据的LCC投影坐标为transform
,cartopy接受了经/纬度输入并将其解释为具有米的单位。确实绘制了数据,但范围太小,以至于在不将绘图范围更改为与数据相同的情况下无法看到它们。
关于问题2,不,transform_points
不是必须的。设置Cartopy的方式使得可以以最少的中间步骤轻松绘制多个投影。如@swatchai所述,有时您可能需要使用实际的投影坐标,并且使用transform_points
方法可以做到这一点。当transform_points
被用来制造在原岗位的第二个情节它本质上是手工做什么,会自动已经完成了输入坐标已经有妥善处理PlateCarree
的transform
。
最后,@
ajdawson对使用方法projection
和transform
绘制时间进行了重要的说明。一旦了解了源坐标的内容,此信息也将很有用。该评论引用如下:
通常,它
projection
告诉cartopy绘制的地图应该是什么样子,并transform
告诉cartopy您的数据所代表的坐标系。您可以设置projection
为所需的任何投影,但transform
需要匹配数据使用的任何坐标系。