利用shapefile文件创建mask筛选数据

2022-09-23 14:19:19 浏览数 (1)

最近在处理数据,需要筛选陆地、海洋还有特定区域的信息进行分析,主要还是利用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 变量之中,其中包含了经纬度信息,那么我们就可以按照如下方式进行筛选了,下图是筛选站点分布:

代码语言:javascript复制
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教程,感兴趣的可以查阅官方文档。

0 人点赞