研究需要批量处理多年雪盖数据,NASA给出的数据源是包含两个波段(0和1)的Hdf文件,需要转换为Tif文件才能方便在ArcGIS中提取更多信息,为方便读者查看,现将数据源及其路径展示如下:
#-*- coding: UTF-8 -*- #识别中文
'''
这篇代码是针对MODIS的Snowcover数据,将Hdf多波段数据输出为Tif文件
'''
import arcpy
import glob
import os
import xlrd
arcpy.env.overwriteOutput = 1 #输出文件夹里面已经有内容的,就覆盖掉
arcpy.CheckOutExtension("Spatial") #检查ArcGIS扩展模块是否可用
inPath='F:\\MODIS_Snow_Cover\\Snow_Cover_Hdf\\'
ls = os.listdir(inPath) #读取路径中所有文件,以ls来表示,常用file
#print(ls) #输出文件名用于检查
print(len(ls)) #输出文件总数
for i in ls: #遍历ls中的文件
arcpy.env.workspace = 'F:\\MODIS_Snow_Cover\\Snow_Cover_Hdf\\'+ i
#脚本中最为常用的环境变量设置就是arcpy.env.workspace,该变量用于定义当前脚本的工作目录(或者称为工作空间)
# print(arcpy.env.workspace)
arcpy.env.scratchWorkspace = 'F:\\MODIS_Snow_Cover\\Snow_Cover_Hdf\\'+ i #(为什么定义临时空间变量作用暂不明)
hdfList = arcpy.ListRasters('*','HDF') #按名称和栅格类型返回工作空间中的栅格列表(遍历指定类型的文件),需先设置工作空间环境
#判断存储最终图像的文件夹是否存在,是则存储,否则创建并存储;注意if和else后一定要加冒号,格式要对齐
if os.path.exists(r"F:\\MODIS_Snow_Cover\\Snow_Cover_Tif\\"+i):
for hdf in hdfList:
#此Hdf文件有两个波段,全部输出,相应的ExtractSubDataset_management 中也要提取对应波段
for number in range(0,1):
#将i(i是一串数字)转为字符串,最后两道斜杠一定要,不然不会存进该文件夹中,而是上一级文件夹中
outPath = 'F:\\MODIS_Snow_Cover\\Snow_Cover_Tif\\'+str(i)+'\\'
#根据对 HDF 数据集创建新栅格数据集,语法 ExtractSubDataset(in_raster, out_raster, {subdataset_index})
out = arcpy.ExtractSubDataset_management(hdf,outPath + hdf[0:15] + str(number) + ".tif", number)
else:
os.makedirs(r"F:\\MODIS_Snow_Cover\\Snow_Cover_Tif\\"+i)
for hdf in hdfList:
for number in range(0,1):
outPath = 'F:\\MODIS_Snow_Cover\\Snow_Cover_Tif\\'+str(i)+'\\'
out = arcpy.ExtractSubDataset_management(hdf,outPath + hdf[0:15] + str(number) + ".tif", number)
print(outPath)
# print(i)
print "完成"
感觉需要注意的点有:
1.熟悉如何遍历文件
2.hdf是包含多波段,所以可以事先在GIS中打开看看有几个子数据集(即波段)
3.注意格式,注意缩进等等
最后这篇代码是在两位前辈的基础上整合而成,现将其链接附在下,感谢两位作者的分享!
利用Python(ArcGIS环境下的ArcPy)批量将hdf数据特定波段输出为tif格式
(六)arcpy开发&利用arcpy在arcgis中批量将hdf数据转tif数据(python文件的变量,数据转换)