日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

python中的netCDF4批量處理NC文件的操作方法_python

作者:skypanxh ? 更新時間: 2022-05-23 編程語言

一、使用ArcMap提取出第一期數據

1.使用工具箱中的“Make NetCDF Raster Layer”工具,提取出一個數據

可以發現該數據有正確的像元大小、坐標系等

2.導出該數據作為標準數據

二、使用python批量提取所有數據

1. 查看數據屬性

from netCDF4 import Dataset,num2date
infile = "../01Data/Runoff1992-2014/GRUN_v1_GSWP3_WGS84_05_1902_2014.nc"
data_set = Dataset(infile) # 讀取nc文件信息
print(data_set)

輸出為


root group (NETCDF3_CLASSIC data model, file format NETCDF3):
? ? title: GRUN
? ? version: GRUN 1.0
? ? meteorological_forcing: GSWP3
? ? temporal_resolution: monthly
? ? spatial_resolution: 0.5x0.5
? ? crs: WGS84
? ? proj4: +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
? ? EPSG: 4326
? ? references: Ghiggi et al.,2019. GRUN: An observation-based global gridded runoff dataset from 1902 to 2014. ESSD, doi: https://doi.org/10.5194/essd-2019-32
? ? authors: Gionata Ghiggi; Lukas Gudmundsson
? ? contacts: gionata.ghiggi@gmail.com; lukas.gudmundsson@env.ethz.ch
? ? institution: Land-Climate Dynamics, Institute for Atmospheric and Climate Science, ETH Zürich
? ? institution_id: IAC ETHZ
? ? dimensions(sizes): X(720), Y(360), time(1356)
? ? variables(dimensions): float64 X(X), float64 Y(Y), float64 time(time), float32 Runoff(time, Y, X)
? ? groups:?

可以看到variables變量X、Y為經緯度,time為時間,Runoff為需要的結果

2.批量導出結果

from osgeo import gdal
from netCDF4 import Dataset,num2date
import numpy as np

def WriteTiff(im_data,inputdir, path):
    raster = gdal.Open(inputdir)
    im_width = raster.RasterXSize #柵格矩陣的列數
    im_height = raster.RasterYSize #柵格矩陣的行數
    im_bands = raster.RasterCount #波段數
    im_geotrans = raster.GetGeoTransform()#獲取仿射矩陣信息
    im_proj = raster.GetProjection()#獲取投影信息
    
    if 'int8' in im_data.dtype.name:
        datatype = gdal.GDT_Byte
    elif 'int16' in im_data.dtype.name:
        datatype = gdal.GDT_UInt16
    else:
        datatype = gdal.GDT_Float32
    if len(im_data.shape) == 3:
        im_bands, im_height, im_width = im_data.shape
    elif len(im_data.shape) == 2:
        im_data = np.array([im_data])
        im_bands, (im_height, im_width) = 1, im_data.shape
        # 創建文件
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(path, im_width, im_height, im_bands, datatype)
    if (dataset != None):
        dataset.SetGeoTransform(im_geotrans)  # 寫入仿射變換參數
        dataset.SetProjection(im_proj)  # 寫入投影
    for i in range(im_bands):
        dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
    del dataset
infile = "../01Data/Runoff1992-2014/GRUN_v1_GSWP3_WGS84_05_1902_2014.nc"
data_set = Dataset(infile) # 讀取nc文件信息
time = data_set.variables["time"][:]  # 獲取時間一列
units = data_set.variables["time"].units # 獲取第一期時間
#讀取樣本tif文件的地理信息
intif = "../03ProcessData/runoff_example.tif"
for i in range(0,len(time)):
    yr = num2date(time[i],units).year # 提取年份
    mon = num2date(time[i],units).month    # 提取月份
    value_data = data_set.variables['Runoff'][i]
    # 將缺失值改為0
    data = value_data.data
    mask = value_data.mask
    data[np.where(mask == True)] = 0
    outputname = "../01Data/Runoff1992-2014/tif/" + str(yr) + str(mon).zfill(2) + ".tif"
    WriteTiff(data,intif , outputname)
    print(outputname)

!注意事項

1.使用時候請自行修改修改輸入輸出文件路徑與變量名稱

2.根據需要處理缺失值

原文鏈接:https://www.cnblogs.com/skypanxh/p/16034602.html

欄目分類
最近更新