NetCDF 文件批量轉(zhuǎn)柵格并導(dǎo)出柵格各波段
兩年前,我曾發(fā)布過(guò)一篇名為《導(dǎo)出 NetCDF 柵格圖層的各個(gè)波段》的公眾號(hào)推文,講述了通過(guò)網(wǎng)絡(luò)中的ArcGIS工具將單個(gè) NetCDF 文件的各個(gè)波段分別導(dǎo)出為 tif 文件的方法。該工具提供了 arcpy 源代碼,我們以該代碼為基礎(chǔ),將其轉(zhuǎn)換為 ArcGIS Pro 環(huán)境下的 Python 3 代碼,并使程序可對(duì)多個(gè)文件進(jìn)行批處理,本文將對(duì)該代碼及其在 ArcGIS Pro 中的配置過(guò)程進(jìn)行介紹。
1 數(shù)據(jù)來(lái)源及介紹
本文所使用的數(shù)據(jù)為國(guó)家青藏高原科學(xué)數(shù)據(jù)中心的 中國(guó)1km分辨率逐月降水量數(shù)據(jù)集。對(duì)下載得到的 nc 文件通過(guò) Panoply 軟件進(jìn)行讀取可知,其X、Y及波段維度名稱分別為lon、lat、time,nc文件中共12個(gè)波段,分別存儲(chǔ)該年度1-12月每個(gè)月份的降水量。

2 腳本配置及相關(guān)代碼
2.1 NetCDF 轉(zhuǎn)換為 tif
在 ArcGIS Pro 地圖工程的默認(rèn)工具箱中新建腳本工具,命名為 NetCDF to TIF,并仿照 ArcGIS 的 創(chuàng)建 NetCDF 柵格圖層 工具設(shè)置其參數(shù)。該工具用于讀取文件夾中的所有 NetCDF 文件,根據(jù)其 X、Y、波段等維度將其轉(zhuǎn)換為 TIF 文件并逐一輸出至 TIF 文件夾中。由于單波段 NetCDF 文件不存在波段維度,故該參數(shù)設(shè)置為可選類型。


右鍵單擊腳本工具,在彈出菜單中單擊編輯,將編輯窗口中的默認(rèn)代碼替換為下方 Python 代碼:
import os
import arcpy
# 腳本工具核心代碼
def script_tool(nc_folder, variable, x_dimension, y_dimension, band_dimension, tif_folder):
# 基于工作空間為 tif_folder,后續(xù)輸出文件都將存放在該文件夾中
arcpy.env.workspace = tif_folder
# 遍歷文件夾中所有后綴名為 .nc 的文件,將其逐一轉(zhuǎn)換為 tif 文件
for file in os.listdir(nc_folder):
if file[-3:] == ".nc":
# 以原始文件名稱為基礎(chǔ),得到不包含后綴名部分的 tif 文件名
tif_file_name = file[:-3]
# 判斷 band_dimension 參數(shù)是否存在輸入值,有值則在后續(xù)函數(shù)中指定 band_dimension 參數(shù)
if band_dimension:
# 基于 NetCDF 文件創(chuàng)建柵格圖層
arcpy.MakeNetCDFRasterLayer_md(f"{nc_folder}/{file}", variable, x_dimension, y_dimension, tif_file_name, band_dimension)
else:
arcpy.MakeNetCDFRasterLayer_md(f"{nc_folder}/{file}", variable, x_dimension, y_dimension, tif_file_name)
# 基于柵格圖層創(chuàng)建 tif 文件
arcpy.CopyRaster_management(tif_file_name, tif_file_name + ".tif")
arcpy.AddMessage(tif_file_name + " " + "conversion successful!")
return
# 讀取輸入?yún)?shù),執(zhí)行程序
if __name__ == "__main__":
# 獲取 ArcGIS 腳本工具參數(shù)
nc_folder = arcpy.GetParameterAsText(0)
variable = arcpy.GetParameterAsText(1)
x_dimension = arcpy.GetParameterAsText(2)
y_dimension = arcpy.GetParameterAsText(3)
band_dimension = arcpy.GetParameterAsText(4)
tif_folder = arcpy.GetParameterAsText(5)
# 執(zhí)行腳本工具核心代碼
script_tool(nc_folder, variable, x_dimension, y_dimension, band_dimension, tif_folder)
保存后可在右鍵菜單的工具屬性中看到下方界面:

配置完成后,將 Panoply 讀取到的參數(shù)輸入腳本,如下圖所示:

程序運(yùn)行完成后輸出的柵格數(shù)據(jù)如下圖所示:

2.2 遍歷并導(dǎo)出柵格各波段
新建腳本工具,命名為 Band Split,并設(shè)置參數(shù)。


將腳本工具的默認(rèn)代碼替換為下方 Python 代碼:
import os
import arcpy
def script_tool(input_folder, output_folder):
# 遍歷文件夾中所有 tif 文件
for file in os.listdir(input_folder):
if file[-4:] == ".tif":
# 根據(jù)文件名稱獲取對(duì)應(yīng)年份,此處為倒數(shù)第5位至倒數(shù)第8位,可根據(jù)實(shí)際情況調(diào)整
year = file[-8:-4]
# 創(chuàng)建循環(huán),遍歷各月份對(duì)應(yīng)波段,將波段逐一導(dǎo)出為單獨(dú)的 tif 文件并保存到輸出文件夾
for i in range(12):
input_band = f"{input_folder}/{file}/Band_{i+1}"
output_raster = f"{output_folder}/Pre_{year}_{i + 1}.tif"
arcpy.CopyRaster_management(input_band, output_raster)
arcpy.AddMessage(f"Pre_{year}_{i+1} conversion successful!")
return
if __name__ == "__main__":
# 獲取 ArcGIS 腳本工具參數(shù)
input_folder = arcpy.GetParameterAsText(0)
output_folder = arcpy.GetParameterAsText(1)
# 執(zhí)行腳本工具核心代碼
script_tool(input_folder, output_folder)
配置完成后,將上一步得到的 tif 文件夾作為輸入文件夾參數(shù)輸入腳本,如下圖所示:

程序運(yùn)行完成后輸出的柵格數(shù)據(jù)如下圖所示:

3 降水?dāng)?shù)據(jù)參考文獻(xiàn)格式
3.1 數(shù)據(jù)的引用
彭守璋. (2020). 中國(guó)1km分辨率逐月降水量數(shù)據(jù)集(1901-2023). 國(guó)家青藏高原數(shù)據(jù)中心. https://doi.org/10.5281/zenodo.3114194.
Peng, S. (2020). 1-km monthly precipitation dataset for China (1901-2023). National Tibetan Plateau / Third Pole Environment Data Center. https://doi.org/10.5281/zenodo.3114194.
3.2 文章的引用
1、Peng, S.Z., Ding, Y.X., Wen, Z.M., Chen, Y.M., Cao, Y., & Ren, J.Y. (2017). Spatiotemporal change and trend analysis of potential evapotranspiration over the Loess Plateau of China during 2011-2100. Agricultural and Forest Meteorology, 233, 183-194. https://doi.org/10.1016/j.agrformet.2016.11.129
2、Ding, Y.X., & Peng, S.Z. (2020). Spatiotemporal trends and attribution of drought across China from 1901–2100. Sustainability, 12(2), 477.
3、Peng, S.Z., Ding, Y.X., Liu, W.Z., & Li, Z. (2019). 1 km monthly temperature and precipitation dataset for China from 1901 to 2017. Earth System Science Data, 11, 1931–1946. https://doi.org/10.5194/essd-11-1931-2019
4、Peng, S., Gang, C., Cao, Y., & Chen, Y. (2017). Assessment of climate change trends over the loess plateau in china from 1901 to 2100. International Journal of Climatology.
浙公網(wǎng)安備 33010602011771號(hào)