利用ArcGIS与arcpy进行栅格属性信息的提取

来源:互联网 发布:tfboys队内关系 知乎 编辑:程序博客网 时间:2024/04/28 22:54

最近在做一个高分数据处理的项目时,需要对几千景高分影像数据进行处理,主要就是影像的预处理和地理配准。在对数据的不断处理过程中,就想着能不能把影像的基本信息提取出来,比如后缀名、分辨率、波段数、坐标系等等,这样既可以当作一种项目过程中的检查,也可以当作项目的资料提供给甲方。牵涉到大量的影像数据,采用人工逐条记录的方法明显不太合适,这时候自然而然的想到了利用ArcGIS软件和python语言。

和ArcGIS相关的Python语言自然就是arcpy了,查阅了ArcGIS的帮助,看看有没有能提取栅格信息的方法,发现有一个获取栅格的方法,可以返回很多基本的属性信息,方法如下:
GetRasterProperties_management (in_raster, {property_type}, {band_index})

可以提取的属性信息有:
这里写图片描述
再然后就可以写具体的python代码实现自己的需要了,由于要经常性的使用,就采取了GP框架做一个工具箱:
这里写图片描述
这里考虑到尽可能一次到位,可以对多个文件夹下的栅格数据一次提取,而不是只能对一个文件夹下进行提取,结果直接保存成一个xls文件。(好像python2.7标准库不支持xlsx)
代码:

import arcpyimport os,stringinputfolders = string.split(arcpy.GetParameterAsText(0),";")savepath = arcpy.GetParameterAsText(1)savename = os.path.join(savepath+".xls")

这里图简便,直接给后面加了一个.xls,这样打开excel时会提示文件格式与拓展名不匹配,不过不影响打开。这里比较好的是用xlwt包创建一个excel,不会出现这个问题。

f=open(savename,"w")head=[u"影像名称",u"格式",u"分辨率(X)",u"分辨率(Y)",u"波段数",u"坐标系",u"文件大小",u"象元值类型"]for hea in head:    f.write(hea.encode("gbk")+"\t")f.write("\n")

这里先写表头,用f.write这种方式写,\t换右格,\n换行似乎太低端了,如果用xlwt写的话应该ws.write(i,j,value),其中i是行,j是列,都从0开始算,value再写值,才显得比较高端一些。用f.write这种方式写的好处就是比较快,比较适合简单的脚本工具开发。
下面就可以获取属性信息了,由于我需要像元值类型VALUETYPE,而它有14种对应方式,因此在这里可以先建立一个字典:

dict={}dict["0"] = u"1位"dict["1"] = u"2位"dict["2"] = u"4位"dict["3"] = u"8位无符号整型"dict["4"] = u"8位有符号整型"dict["5"] = u"16位无符号整型"

等等。。。

然后开始对输入的每一个文件夹执行代码:

for inputfolder in inputfolders:    arcpy.env.workspace= inputfolder    imglist = arcpy.ListRasters("","")

这里获取了文件夹下的所有栅格影像,并把他们建立为一个列表,接下来就开始对这个列表循环了:

    for img in imglist:        imgpath= arcpy.Describe(img).CatalogPath        geshi = os.path.splitext(img)[1]        img_name = arcpy.Describe(img).baseName        img_sizeX = arcpy.GetRasterProperties_management(img,"CELLSIZEX")        img_sizeY = arcpy.GetRasterProperties_management(img,"CELLSIZEY")        img_bandcount = arcpy.GetRasterProperties_management(img,"BANDCOUNT")        img_SR = arcpy.Describe(img).spatialReference.name        img_size = float(os.path.getsize(imgpath))/1024/1024/1024        img_valuetype =str(arcpy.GetRasterProperties_management(img,"VALUETYPE"))        valuetype=dict[img_valuetype]        ```这里获取了格式、文件名、分辨率X、分辨率Y、波段数、坐标系、文件大小和像元值类型。再写入xls中:
        f.write("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\n".format(img_name,geshi,img_sizeX,img_sizeY,img_bandcount,img_SR,str(size)+"G",valuetype.encode("gbk")))

f.close()
“`

然后执行工具:
这里写图片描述

就生成一个excel,打开发现已经写进去了:
这里写图片描述
当然,还可以把其他属性信息都写进去,这里就不赘述了。这种方式只适合比较简单的,如果想写的正式些还是建议把创建excel和给excel里写数据的过程都用xlwt实现。

原创粉丝点击