You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:40:22