最近在处理数据,需要筛选陆地、海洋还有特定区域的信息进行分析,主要还是利用shapefile文件创建mask文件,然后进行筛选。
创建mask文件
创建mask文件主要利用的是 regionmask 库,示例如下:
这里采用的是全球海岸线数据创建陆地和海洋mask文件,shape文件可以直接利用 cartopy 进行下载。
代码语言:javascript复制import numpy
import geopandas as gpd
import regionmask as rm
cnm = gpd.read_file('natural_earth/physical/ne_10m_land.shp')
lon = np.arange(80, 140, 0.05)
lat = np.arange(10, 60.05, 0.05)
lm = rm.mask_geopandas(cnm, lon, lat)
lm.data[lm.data >= 0] = 1
# 陆地为 1,海洋为 0
lm.to_netcdf('mask_land_ocean.nc', engine='netcdf4', encoding={'region': {'dtype': np.int16}})
mask结果可视化
其实,这里创建了mask文件之后,可以直接在画图的时候进行白化,比如:
代码语言:javascript复制ds_mask = ((ds.tbb_13 - 273.15)
.sortby('latitude')
.isel(time=0)
.sel(latitude=slice(10, lat.max()),
longitude=slice(lon.min(), lon.max()),
)
.where(lm.values >= 0)
.plot(vmin=-105, vmax=60, cmap=summer))
mask文件白化结果
筛选数据
其实地图的白化也算是数据筛选了,这里提到的数据筛选主要是用来筛选站点数据。利用创建的不同mask文件来筛选指定区间的数据。
比如,这里我们将降水之类的站点数据读取到 ds
变量之中,其中包含了经纬度信息,那么我们就可以按照如下方式进行筛选了,下图是筛选站点分布:
import xarray as xr
mask = xr.open_dataset('mask_land_ocean.nc')
lat, lon = xr.DataArray(ds.latitude.values), xr.DataArray(ds.longitude.values)
# 选择距离这些观测站点经纬度最近的mask文件经纬度坐标
idx = mask.region.sel(lon=lon, lat=lat, method='nearest')
ocean_sta = ds[idx.data < 1]
land_sta = ds[idx.data > 0]
站点筛选可视化
当然也可以利用其它shapefile文件创建mask文件筛选数据,比如江苏省shapefile文件。此外,regionmask 官方文档还给出了任意形状的mask教程,感兴趣的可以查阅官方文档。