ArcPy 批量实现 “以表格显示分区统计(ZonalStatisticAsTable)” --单一要素统计多个栅格

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值