如何基于Shapefile提取.nc文件中指定海域的盐度数据?
提取Shapefile范围内的NetCDF盐度数据并叠加可视化
以下是基于Python实现的完整解决方案,涵盖数据加载、坐标系统一、范围裁剪和可视化的全流程:
安装依赖
首先确保安装所需的库:
pip install xarray netCDF4 geopandas rioxarray matplotlib
完整代码示例
import xarray as xr import geopandas as gpd import rioxarray import matplotlib.pyplot as plt # 1. 加载数据 # 加载盐度NetCDF文件 salinity_ds = xr.open_dataset("salinity.nc") # 替换为你数据中实际的盐度变量名(可通过print(salinity_ds)查看) salinity_var = salinity_ds['salinity'] # 加载海盆边界Shapefile basin_gdf = gpd.read_file("basin_boundary.shp") # 2. 统一空间坐标系 # 给盐度数据设置坐标系(默认WGS84,EPSG:4326,根据实际情况调整) # 如果经纬度维度名不是lon/lat,需用rio.set_spatial_dims指定,例如: # salinity_var = salinity_var.rio.set_spatial_dims(x_dim='longitude', y_dim='latitude') salinity_var = salinity_var.rio.set_crs("EPSG:4326") # 转换Shapefile坐标系与盐度数据一致 if basin_gdf.crs != salinity_var.rio.crs: basin_gdf = basin_gdf.to_crs(salinity_var.rio.crs) # 3. 裁剪Shapefile范围内的盐度数据 # 处理时间维度:取第一个时间切片(按需替换为指定时间,如sel(time='2020-01-01')) if 'time' in salinity_var.dims: salinity_slice = salinity_var.isel(time=0) else: salinity_slice = salinity_var # 执行裁剪 clipped_salinity = salinity_slice.rio.clip(basin_gdf.geometry, basin_gdf.crs) # 4. 可视化 # 方案1:全局盐度底图叠加海盆边界 fig, ax = plt.subplots(figsize=(12, 8)) salinity_slice.plot(ax=ax, cmap='viridis', extend='both', cbar_kwargs={'label': 'Salinity'}) basin_gdf.boundary.plot(ax=ax, color='darkred', linewidth=2) ax.set_title("Global Salinity with Target Basin Boundary") ax.set_xlabel("Longitude") ax.set_ylabel("Latitude") plt.show() # 方案2:仅显示裁剪后的海盆范围内盐度 fig, ax = plt.subplots(figsize=(12, 8)) clipped_salinity.plot(ax=ax, cmap='viridis', extend='both', cbar_kwargs={'label': 'Salinity'}) basin_gdf.boundary.plot(ax=ax, color='darkred', linewidth=2) ax.set_title("Salinity within Target Basin Boundary") plt.show()
注意事项
- 变量名检查:运行
print(salinity_ds)查看NetCDF数据的变量结构,确保'salinity'是正确的变量名 - 空间维度指定:如果你的数据经纬度维度名为
longitude/latitude而非lon/lat,需添加salinity_var = salinity_var.rio.set_spatial_dims(x_dim='longitude', y_dim='latitude') - 时间维度灵活处理:若需提取特定时间点的盐度,将
isel(time=0)替换为sel(time='YYYY-MM-DD')(需匹配数据中的时间格式)
内容的提问来源于stack exchange,提问作者smi
相关产品推荐
相关产品推荐

