通过 shapefile 剪切 NetCDF 文件

Posted

技术标签:

【中文标题】通过 shapefile 剪切 NetCDF 文件【英文标题】:Cut NetCDF files by shapefile 【发布时间】:2021-02-11 06:33:33 【问题描述】:

我有一个大型的全局 .nc 文件数据集,我正在尝试将它们剪辑到一个较小的区域。我将此区域存储为 .shp 文件。

我曾尝试使用 Qgis 中的 gdal,但需要通过转换每个变量来做到这一点,并且我必须为所有文件一一选择每个变量和相同的形状,并且每个变量有 400 个文件似乎不是最好的主意。这也返回分离的 .tiff 文件,而不是我想要的 .nc 文件。

我有这个小脚本,但它没有做我需要的事情

    import glob
    import subprocess
    import os
    
    ImageList = sorted(glob.glob('*.nc'))
    print('number of images to process: ', len(ImageList))
    
    Shapefile = 'NHAF-250m.shp'
    
    # Create output directory
    OutDir = './Clipped_Rasters/'
    if not os.path.exists(OutDir):
        os.makedirs(OutDir)
    
    for Image in ImageList:
        print('Processing ' + Image)
    
        OutImage = OutDir + Image.replace('.nc', '_BurnedArea_Clipped.tif') # Defines Output Image
    
        # Clip image
        subprocess.call('gdalwarp -q -cutline /Users/path/to/file/NHAF-250-vector/ -tr 0.25 0.25 -of GTiff NETCDF:'+Image+":burned_area "+OutImage, shell=True)
    
    
        print('Done.' + '\n')
    
    print('All images processed.')

提前谢谢你

【问题讨论】:

【参考方案1】:

我建议使用xarray 处理netcdf 数据和geopandas + rasterio 处理您的Shapefile。

import geopandas 
import xarray
import rasterio
import glob

shapefile = 'NHAF-250m.shp'

sf = geopandas.read_file(shapefile)
shape_mask = rasterio.features.geometry_mask(sf.iloc[0],
                                      out_shape=(len(ndvi.y), len(ndvi.x)),
                                      transform=ndvi.geobox.transform,
                                      invert=True)
shape_mask = xarray.DataArray(shape_masj , dims=("y", "x"))

file_list = sorted(glob.glob('*.nc'))

for file in file_list:
    nc_file = xarray.open_dataset(file)
    # Then apply the mask
    masked_netcdf_file = nc_file.where(shape_mask == True, drop=True)
    # store again as netcdf or do what every you want with the masked array
    

【讨论】:

我明白你的意思,但我猜 ndvi 属性来自另一个文件。使用我的数据集时,geobox.transform 出现错误:“Dataset”对象没有属性“geobox”

以上是关于通过 shapefile 剪切 NetCDF 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 shapefile 屏蔽 NetCDF 并计算 shapefile 中所有多边形的平均值和异常值

如何在同一个投影上获得这个栅格和这个 shapefile?

通过python从netCDF中提取数据

如何从 R 中的 rasterbrick 对象创建长格式数据框

在 python 中处理非常大的 netCDF 文件

arcgis中导入shapefile点文件 点无法显示 原因是啥 shapefile点文件里数据x,y是经纬度坐标,z是水位