在Polar Stereo图形地图上使用set_extent似乎无法以可预测的方式工作。我正在遵循此Answered StackOverflow示例,但没有旋转#产生地图。我已设置ax1.set_global()
来显示数据。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from cartopy.examples.waves import sample_data
# read sample data
x, y, z = sample_data(shape=(73, 145))
fig = plt.figure(figsize=(8, 8))
# first plot with default rotation. Global extent, works fine
ax1 = fig.add_subplot(221, projection=ccrs.NorthPolarStereo())
cs1 = ax1.contourf(x, y, z, 50, transform=ccrs.PlateCarree(),
cmap='gist_ncar')
ax1.set_title('Global')
#next plot setting extent to 0,360,40,90, no display
ax2 = fig.add_subplot(222,
projection=ccrs.NorthPolarStereo())
cs2 = ax2.contourf(x, y, z, 50,
transform=ccrs.PlateCarree(),
cmap='gist_ncar')
ax2.set_extent([0,360,40,90],crs=ccrs.PlateCarree())
ax2.coastlines()
ax2.set_title('Centred on 0$^\circ$ (default)')
#Now resetting set_extent to [-180,180,40,90] strangely works!
ax3 = fig.add_subplot(
223, projection=ccrs.NorthPolarStereo())
cs3 = ax3.contourf(x, y, z, 50, transform=ccrs.PlateCarree(),
cmap='gist_ncar')
ax3.set_extent([-180, 180, 40, 90], crs=ccrs.PlateCarree())
ax3.coastlines()
ax3.set_title('Using -180,180 $^\circ$W')
#but now rotating projection yields just a corner of the map
ax4 = fig.add_subplot(
224,projection=ccrs.NorthPolarStereo(central_longitude=-45))
cs4 = ax4.contourf(x, y, z, 50, transform=ccrs.PlateCarree(),
cmap='gist_ncar')
ax4.set_extent([-180, 180, 40, 90], crs=ccrs.PlateCarree())
ax4.coastlines()
ax4.set_title('Rotated on -45 $^\circ$W')
plt.show()
我原以为set_extent可以如文档所述工作,但是旋转和范围之间似乎有#种奇怪的相互作用
答案 0 :(得分:0)
这似乎是CartoPy如何计算其边界框的人工产物。当给定范围为lon / lat时,它的作用是根据范围计算盒子的4个角,然后将其投影到原始投影,然后从中找出范围。问题在于,在立体投影中,由于(特别是)经度的周期性,这些组合中的某些组合最终在x或y中没有分隔。
我可以只用PyProj重现数学问题,所以CartoPy中的投影数学不是问题,只是它如何计算边界的限制。您可以在set_extent
中使用投影坐标进行覆盖:
ax.set_extent((0, 500000, 0, 500000), crs=ccrs.NorthPolarStereo())
我知道这并不理想,但是我想不出任何好的方法来基于lon / lat空间中的框来计算适当的边界。