shp文件裁剪多图层nc文件并逐层转为tif的python代码

本文介绍了如何使用Python库如geopandas和rasterio读取shapefile和NetCDF文件,对黄河流域数据进行空间裁剪,然后按时间序列将结果转换为GeoTIFF格式,以显示在特定坐标系统下特定时间段的辐射数据。
摘要由CSDN通过智能技术生成
import os
import geopandas as gpd
import pandas as pd
import xarray as xr
import rasterio
from matplotlib import pyplot as plt
from rasterio.mask import mask
from rasterio.transform import from_origin
from rasterio.enums import Resampling
from shapely.geometry import mapping

# 尝试用黄河流域的shp文件裁剪nc
# 20240103 09:50 YMJ

# 1. 读取区域形状文件(shp)
shp_path = 'D:\\CMFD\\test\\area.shp'
gdf = gpd.read_file(shp_path)

# 2. 读取NetCDF文件,并定义坐标系
nc_path = 'D:\\CMFD\\test\\lrad_CMFD_V0106_B-01_01mo_010deg_197901-201812.nc'
ds = xr.open_dataset(nc_path)
ds.rio.write_crs("EPSG:4326", inplace=True)

# 3. 根据区域形状文件裁剪NetCDF数据
ds.rio.set_spatial_dims(x_dim="lon", y_dim="lat", inplace=True)
clipped_ds = ds.rio.clip(gdf.geometry.apply(mapping),gdf.crs,drop=True)


# 获取时间信息并将每层保存为TIFF文件
output_directory = 'D:\\CMFD\\test\\output\\'
os.makedirs(output_directory, exist_ok=True)

# 4. 获取时间信息并将每层保存为TIFF文件
for time_index, time_value in enumerate(clipped_ds['time'].values):
    # 提取对应时间层的数据
    data_layer = clipped_ds['lrad'].isel(time=time_index)
    # print(data_layer)

    # 获取时间信息, 保存为TIFF文件
    time_info = pd.to_datetime(ds["time"].isel(time=time_index).values)
    output_path = "D:\\CMFD\\test\\output\\"
    tiff_path = f"{output_path}prec_{time_info.strftime('%Y%m%d')}.tif"
    # print(tiff_path)

    # 获取空间参考和变换信息
    # rasterio.transform.from_origin(west, north, xsize, ysize)
    transform = from_origin(data_layer['lon'].values.min(), data_layer['lat'].values.min(),
                            data_layer['lon'].values[1] - data_layer['lon'].values[0],
                            data_layer['lat'].values[0] - data_layer['lat'].values[1])

    # 写入TIFF文件
    with rasterio.open(tiff_path, 'w', driver='GTiff', height=data_layer.shape[0],
                       width=data_layer.shape[1], count=1, dtype=str(data_layer.dtype),
                       crs='EPSG:4326', transform=transform) as dst:
        dst.write(data_layer.values, 1)

# 关闭NetCDF文件
ds.close()

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值