任务描述:研究需要批量处理多年雪盖数据,NASA给出的数据源是包含两个波段(0和1)的Hdf文件,需要转换为Tif文件才能方便在ArcGIS中提取更多信息,为方便读者查看,现将数据源及其路径展示如下:
#-*- coding: UTF-8 -*- #识别中文
''' 这篇代码是针对MODIS的Snowcover数据,将Hdf多波段数据输出为Tif文件 '''import arcpy
import glob
import os
import xlrdarcpy.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文件的变量,数据转换)
后记:
写博客的初衷是分享经验,同时是算是自己对思路和代码的整理,方便日后处理数据,应该可以帮到很多人。
我已免费分享我的心得,如果看官还有其他问题的,那么:知识付费,我的时间和经验正好可以解决你的问题。
咨询问题请添加QQ:819369354
2022年4月20日