Anaconda環境下將netCDF文件轉換爲TIFF格式,python將nc.文件轉換爲TIFF
Spyder中導入Arcpy
目前的ArcGIS主要支持 python 2.x 版本,所以首先需要在Anaconda下新建一個python 2.7版本的編譯器。如下圖:打開自己的編譯器(以Spyder爲例),在右側IPython處可以看到目前的編譯器版本和系統操作位數,導入Arcpy一定要32位纔可以。如果不滿足,則打開Anaconda Prompt
在命令行輸入 set CONDA_FORCE_32BIT=1 ** #更改環境爲32 bit
然後使用conda info **可以查看當前的環境(找到 platform,應該對應爲win-32)
conda create -n env_name python=2.7 執行此命令創建 python2.7(env_name 爲命名,個人隨意,python的版本要與自己電腦上的Arcgis相一致)
安裝過程中會有Proceed(y/n)?,當然選y啦
緊接着激活剛剛創建的環境,activate env_name
在這個環境下安裝Spyder conda install spyder -y ,如果去anaconda的主界面安裝,裝下來的Spyder仍然是64位,所以看到這裏就繼續一次裝好算了啦
以上過程完成就成功大半,然後是設置路徑的問題:
如圖,根據自己的實際情況設置路徑,即可:
然後可以在Spyder中測試以下,是否可行。
另,有一篇介紹詳細的博客,推薦 https://blog.csdn.net/qq_27386899/article/details/84761665
註明出處什麼的在哪裏整 ? 來源:CSDN博客,沉研
將netCDF文件導出爲TIFF格式
有了Arcpy這個板塊,接下來處理netCDF文件 這裏對netCDF文件不作介紹 首先,提前介紹兩個arcpy中的函數arcpy.MakeNetCDFRasterLayer_md(inNetCDF, variable, x_dimension, y_dimension, nowFile, band_dimension, dimension_values, valueSelectionMethod)
參數較多,介紹重要的:
inNetCDF :輸入的 NetCDF 文件
variable :向輸出柵格分配單元值時使用的 netCDF 文件的變量,將要顯示的值(如氣溫、降水等)
x_dimension, y_dimension:經緯度座標或者輸出圖層的 x y 座標
nowFile :輸出柵格數據的名稱
dimension_values :在輸出圖層中顯示變量時要使用的維度(如時間)的值(如 01/30/05)。默認情況下,將使用維度的第一個值。
另:附上Arcgis Pro給出的參考, https://pro.arcgis.com/zh-cn/pro-app/tool-reference/multidimension/make-netcdf-raster-layer.htm
另外一個:
arcpy.CopyRaster_management(nowFile, outpath, "", "", "", "NONE", "NONE", "")
複製柵格函數,其中:
nowFile:想要複製的柵格數據集或鑲嵌數據集
outpath:要創建的柵格數據集的名稱和格式
另:附上ArcGIS網站的參考,http://desktop.arcgis.com/zh-cn/arcmap/10.3/tools/data-management-toolbox/copy-raster.htm
import arcpy
from arcpy.sa import * #引入模塊
outLoc = r"E:\data\tif1" #輸出路徑
inNetCDF = r"E:\data\Data_forcing_01mo_010deg\Precipitation rate.nc" #輸入路徑
variable = 'prec' #此處是.nc數據中的變量名(降水)
x_dimension = "lon"
y_dimension = "lat"
band_dimension = ""
valueSelectionMethod = "BY_VALUE" #以上五個變量爲第一個函數會用到的變量,提前定義好
nc_FP = arcpy.NetCDFFileProperties(inNetCDF) #讀取netCDF文件
nc_Dim = nc_FP.getDimensions() #獲取維度信息,返回一個維度列表 ['lon','lat','time']
'''
在一個.nc文件中有444個時間,每一個月有一個降水數據,所以導出有444個tiff圖像
爲了給導出圖像方便命名,要使用 dimension_values ,每一個輸出的變量值都是使用該維度的值
'''
for dimension in nc_Dim:
if dimension == "time":
top = nc_FP.getDimensionSize(dimension) #獲取維度的大小
for i in range(0, top):
dimension_value = nc_FP.getDimensionValue(dimension, i) #遍歷每一個時間值,輸出1981/1/1
year_value = str(dimension_value[0:4]) #對每一個值提取年份
if eval(year_value) >= 1986: #判斷年份,本項目需要 1986-2015 ,取年份大於1986年
nowFile =str(dimension_value[0:7]) #取前七位,作爲輸出名
nowFile = nowFile.translate(None, '/') #去掉輸出名中的‘/’,輸出示例:19861
print(nowFile)
dv1 = ["time", dimension_value] #列表
dimension_values = [dv1]
outpath= outLoc+"\\"+nowFile + ".tif"
arcpy.MakeNetCDFRasterLayer_md(inNetCDF,variable,x_dimension,y_dimension,nowFile,band_dimension, dimension_values, valueSelectionMethod)
arcpy.CopyRaster_management(nowFile, outpath, "", "", "", "NONE", "NONE", "")
print('success')
以上是python代碼,祝學習進步 ?
更新一波:
跑過之後數據不對刪除重新運行,發現一直報錯,關閉python,重新啓動再運行一次就好了!!!!