ArcPy 批量实现 “以表格显示分区统计(ZonalStatisticAsTable)” --单一要素统计多个栅格
以表格显示分区统计(ZonalStatisticAsTable):计算"统计区域"和"被统计栅格"二者空间重叠区域的像元值,并以表的形式显示结果
这里主要记录一下:一个shp要素对多个tif数据进行以表格显示分区统计,将统计表根据tif文件名重新命名输出,然后提取所有输出统计表的某些信息并汇总到excel表格中。
多个tif数据:
某shp要素与第一个tif数据进行以表格显示分区统计,并输出统计表为20160115.dbf
某shp要素与第二个tif数据进行以表格显示分区统计,并输出统计表为20160126.dbf
以此类推…
虽然得到了数个统计表,但一个一个打开查看十分耗时,接下来,将上一步得到的所有统计表中的有用信息提取出来并写入excel表格中。
ArcPy语法
ZonalStatisticsAsTable (in_zone_data, zone_field, in_value_raster, out_table, {ignore_nodata}, {statistics_type})
参数 | 说明 | 数据类型 |
---|---|---|
in_zone_data | 统计区域,可以是要素图层或整型栅格 | Feature Layer/ Raster Layer |
zone_field | 统计区域中需要保存的字段 | Field |
in_value_raster | 被统计栅格 | Raster Layer |
out_table | 输出表,默认输出为地理数据库表 | Table |
ignore_nodata(optinal) | 指明输入中的NoData是否会影响统计结果 DATA——仅使用输入栅格中拥有值的像元来确定该区域的输出值,在统计计算中,NoData将被忽略,默认设置 NODATA——如果栅格中存在任何NoData像元,则视为该区域执行统计的像元信息不足,整个区域在输出栅格中都将接收NoData | Boolean |
statistic_type(optional) | 要统计的类型 ALL——计算所有统计指标,默认设置 MEAN——统计区域与被统计栅格重叠区域所有像元的平均值 …其它统计指标不赘述 | String |
代码
# -*- coding:utf-8 -*-
import os
import sys
import arcpy
from arcpy.sa import *
import copy
reload(sys)
sys.setdefaultencoding('utf8')
#ZonalStatisticAsTable
inZoneData = "D:/test/feature.shp" #统计区域
zoneField = "Name" #统计区域中要保存的字段
folder_path = "D:/test/TIF" #tif数据所在文件夹
for filename in os.listdir(folder_path): #读取tif数据所在文件夹下的所有文件名
if filename.endswith(".tif"): #查找出.tif后缀文件
fir_filename = os.path.splitext(filename)[0] #读取.tif之前的文件名部分
arcpy.CheckOutExtension("Spatial")
raster = folder_path + "/"+ filename #被统计栅格
outTable = folder_path + "/" + fir_filename + ".dbf" #根据tif文件名定义输出表
outZSaT = ZonalStatisticsAsTable(inZoneData, zoneField, raster, outTable, "DATA", "ALL")
#Extract data from all .dbf and write into excel
fields = ['Name','ALL'] #Name是统计区域中要保存的字段,ALL是分区统计的统计指标
outtxt = "D:/test/1.txt" #最后生成的txt文件
nodata = "Null"
f = open(outtxt,'w')
dbfs = [i for i in os.listdir(folder_path) if i.endswith(".dbf")]
f.write("DBF_NAME," + ",".join(fields)+"\n")
for dbf in dbfs:
fc = os.path.join(folder_path,dbf)
existsFields = [fi.name for fi in arcpy.ListFields(fc)]
actualFields = [fi for fi in fields if fi in existsFields]
newContents = [fi in existsFields for fi in fields]
for i in range(len(newContents)):
if newContents[i] == False:
newContents[i] = nodata
print(dbf)
with arcpy.da.SearchCursor(fc,actualFields) as cursor:
for row in cursor:
newContents2 = copy.deepcopy(newContents)
contents = [str(i) for i in row]
for ele in contents:
for j in range(len(newContents2)):
if newContents2[j] == True:
newContents2[j] = ele
break
line = dbf[:-4] + "," + ",".join(newContents2) + "\n"
f.write(line)
f.close()
如有疑问,欢迎交流。
后半部分将多个dbf合并到excel中,参考:https://blog.csdn.net/weixin_40450867/article/details/104161945