前言
地图白化是一种绘制地图的技术,它可以实现对感兴趣区域以外的数据进行遮盖或填充白色的效果,从而突出显示目标区域的特征。
地图白化的原理是利用 shapefile 文件中的多边形坐标来创建一个剪切路径,然后将这个路径应用到 matplotlib 的绘图对象上,使得只有路径内的数据可见,路径外的数据被隐藏或覆盖。
气象家园的另一个五星上将clarmy在龙场悟道后开发了cnmaps库,解决广大地学学子绘制地图的痛点
环境:python3.9
方法三:cnmaps的clip_countours_by_map
from cnmaps import get_adm_maps, draw_maps, clip_contours_by_map
import xarray as xr
import os
import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cmaps
nc = xr.open_dataset('/home/mw/input/1107125177/2023110720.nc')
data= nc.t[0,7,:,:]
lon=data.longitude
lat=data.latitude
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(projection=ccrs.PlateCarree())
cf = ax.contourf(lon, lat, data,levels=np.arange(270,320,5), transform=ccrs.PlateCarree(), cmap=cmaps.radar)
cr = ax.contour(lon,lat, data,levels=np.arange(270,320,5), colors='k')
ax.clabel(cr, inline=1, fontsize=10, fmt="%i")
#ax.add_geometries(shp.geometries(), proj, facecolor='none', edgecolor='k')
#核心代码
gd= get_adm_maps('广东省', only_polygon=True, record='first')
clip_contours_by_map(cf, gd)
draw_maps(get_adm_maps(level='省'), linewidth=0.8, color='k')
ax.set_extent([108,120,20,30])
cb = plt.colorbar(cf, orientation='vertical', shrink=0.8)
plt.show()
方法四:salem的salem.roi
import xarray as xr
import os
import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cmaps
import geopandas as gpd
import salem
import cartopy.io.shapereader as shpreader
##文件处理
shp_path = '/home/mw/input/china1656/china_map/china_map/China_Province_2022.shp'
shp = shpreader.Reader(shp_path)
shpgpd = gpd.read_file(shp_path)
gd = shpgpd[shpgpd['省'] == '广东省']
gd.to_file('/home/mw/project/gd.geojson', driver='GeoJSON')
js_path = '/home/mw/project/gd.geojson'
gpdjs = gpd.read_file(js_path)
## 绘图
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(projection=ccrs.PlateCarree())
proj = ccrs.PlateCarree()
## 核心代码
datas = data.salem.roi(shape=gpdjs)
cf = ax.contourf(lon, lat, datas,levels=np.arange(270,320,5), transform=ccrs.PlateCarree(), cmap=cmaps.radar_1)
cr = ax.contour(lon,lat, datas,levels=np.arange(270,320,5), colors='k')
ax.add_geometries(shp.geometries(), proj, facecolor='none', edgecolor='k')
ax.clabel(cr, inline=1, fontsize=10, fmt="%i")
ax.set_extent([108,120,20,30])
cb = plt.colorbar(cf, orientation='vertical', shrink=0.8)
plt.show()
可见锯齿的效果比较糟糕,经不住放大
方法三参考cnmaps快速入门
方法四参考这里