ArcPy|批量以表格显示分区统计(ZonalStatisticsAsTable)

以表格显示分区统计概述

汇总另一个数据集区域内的栅格数据值并以表的形式显示结果。

以表格显示分区统计工具图示

数据准备:一个矢量区域文件(或者栅格区域文件)及一个或多个需要统计的栅格文件

使用方法

  • 区域定义为输入中具有相同值的所有区域。各区域无需相连。栅格和要素都可用于区域输入。

  • 如果输入栅格或要素区域数据(Python 中的 in_zone_data)的像元大小输入值栅格(Python 中的 in_value_raster)不同,则输出像元大小将为输入的最大值,且输入值栅格将在内部用作捕捉栅格。如果像元大小相同,但是像元未对齐,则输入值栅格将在内部用作捕捉栅格。在执行区域操作之前,上述任一情况都会触发内部重采样。

    如果区域输入和值输入均为具有相同像元大小的栅格,并且像元已对齐,则可将其直接应用于工具中,且工具执行期间不会对其进行内部重采样。

  • 如果输入栅格或要素区域数据(Python 中的 in_zone_data)为栅格,则其必须为整型栅格。

  • 如果输入栅格或要素区域数据(Python 中的 in_zone_data)为要素,则将使用输入值栅格(Python 中的 in_value_raster)的像元大小和像元对齐方式在内部将其转换为栅格。

  • 如果输入栅格或要素区域数据(Python 中的 in_zone_data)为要素,对于不与值栅格的任何像元中心重叠的任何区域要素,这些区域将不会转换为内部区域栅格。因此,这些区域将不会在输出中表示。您可以通过为保留要素区域所需细节层次的像元大小环境指定适当的值来管理这些区域并在分析环境中指定这些区域。

  • 如果输入栅格或要素区域数据(Python 中的 in_zone_data)为点要素,则其可能具有值输入栅格的任何特定像元内所含的多个点。对于这样的像元,区域值将通过具有最低 ObjectID 字段的点(例如 OID 或 FID)来确定。

  • 如果输入栅格或要素区域数据(Python 中的 in_zone_data)具有重叠面,则无法针对每个单独的面执行区域分析。因为要素输入已转换为栅格,所以每个位置只能拥有一个值。

    另一种方法就是要为每个面区域反复进行区域操作并核对结果。

  • 在指定输入栅格或要素区域数据(Python 中的 in_zone_data)时,默认区域字段将为第一个可用的整型或文本字段。如果不存在其他有效字段,则 ObjectID 字段(如 OIDFID)将成为默认字段。

  • 输入值栅格(Python 中的 in_value_raster)可以为整型,也可以为浮点型。但是,当它是浮点型时,将无法计算众数、中值、少数和变异性。

  • 对于众数和少数计算,当存在平局时,区域的输出将基于平局值的最低值。有关详细信息,请参阅分区统计的工作原理

  • 将根据统计类型的设置在输出表中创建一个字段或一系列字段。值输入为整型时,可对所有统计数据(最小值、最大值、范围、平均值、标准差、总和、变异度、众数、少数和中值)进行计算。如果值输入为浮点型,将不会计算众数、少数、中值和变异度统计数据。

  • 输出表中各项下的各个值的数据类型取决于所执行的分区计算。有关任何统计的特定行为的详细信息,请参阅“分区统计”的工作原理

  • 输出表中的行数与区域数相同。

  • 默认情况下,此工具会利用多核处理器。可供使用的最大核数为四。

    如果希望工具使用较少的核,请使用 parallelProcessingFactor 环境设置。

  • 有关适用于此工具的地理处理环境的详细信息,请参阅分析环境和 Spatial Analyst

ArcPy语法

ZonalStatisticsAsTable (in_zone_data, zone_field, in_value_raster, out_table, {ignore_nondata}, {statistics_type})

参数 说明 数据类型
in_zone_data 定义区域的数据集。可通过整型栅格或要素图层来定义区域。 Raster Layer; Feature Layer
zone_field 保存定义每个区域的值的字段。该字段可以是区域数据集的整型字段或字符串型字段。 Field
in_value_raster 含有要计算统计数据的值的栅格。 Raster Layer
out_table 将包含每个区域中值的汇总的输出表。表的格式由输出位置和路径确定。
默认情况下,输出为一张地理数据库表。如果路径不在地理数据库中,则格式将由表达式确定。
如果扩展名为 .dbf,则将采用 dBASE 格式。如果未指定扩展名,则输出将为 INFO 表。
Table
ignore_nodata(可选) 指示值输入中的 NoData 值是否会影响其所落入区域的结果。
DATA —在任意特定区域内,仅使用在输入值栅格中拥有值的像元来确定该区域的输出值。在统计计算过程中,值栅格内的 NoData 像元将被忽略。这是默认设置。
NODATA —在任意特定区域内,如果值栅格中存在任何 NoData 像元,则会视作对该区域中所有像元执行统计计算的信息不足;因此,整个区域在输出栅格中都将接收 NoData 值。
Boolean
statistics_type(可选) 要计算的统计类型。
ALL —将计算所有的统计数据。这是默认设置。
MEAN —计算值栅格中与输出像元同属一个区域的所有像元的平均值。
MAJORITY —确定值栅格中与输出像元同属一个区域的所有像元中最常出现的值。
MAXIMUM —确定值栅格中与输出像元同属一个区域的所有像元的最大值。
MEDIAN —确定值栅格中与输出像元同属一个区域的所有像元的中值。
MINIMUM —确定值栅格中与输出像元同属一个区域的所有像元的最小值。
MINORITY —确定值栅格中与输出像元同属一个区域的所有像元中出现次数最少的值。
RANGE —计算值栅格中与输出像元同属一个区域的所有像元的最大值与最小值之差。
STD —计算值栅格中与输出像元同属一个区域的所有像元的标准差。
SUM —计算值栅格中与输出像元同属一个区域的所有像元的值的总和。
VARIETY —计算值栅格中与输出像元同属一个区域的所有像元中唯一值的数目。
MIN_MAX —既计算最小值统计数据也计算最大值统计数据。
MEAN_STD —既计算平均值统计数据也计算标准差统计数据。
MIN_MAX_MEAN —同时计算最小值、最大值和平均值统计数据。
String

代码示例

使用ArcPy实现批量以表格显示分区统计:

# -*- coding: utf-8 -*-
"""
PROJECT_NAME: ArcPy 
FILE_NAME: batch_UHI 
AUTHOR: welt 
E_MAIL: tjlwelt@foxmail.com
DATE: 2022/12/17 
"""

import os

import arcpy
from arcpy import env
from arcpy.sa import *

# Set environment settings
# raster所在的文件夹
env.workspace = "D:/ArcPy/temperature"
output_path = "D:/ArcPy/temp_mean"

# Set local variables
shp = "D:/ArcPy/Urban_final.tif"
zoneField = 'Value'

datanames = os.listdir(env.workspace)
count = 0
for dataname in datanames:
   if os.path.splitext(dataname)[1] == '.tif':  # 目录下包含.tif的文件
      count = count + 1
      print(dataname)
print('count:' + str(count))

num = 1
for dataname in datanames:
   if os.path.splitext(dataname)[1] == '.tif':  # 目录下包含.tif的文件
      data_name = os.path.splitext(dataname)[0]
      arcpy.CheckOutExtension("Spatial")

      file_name = data_name.split('.')[0]
      raster = env.workspace + "/" + dataname
      outTable = (output_path + "/" + file_name + ".dbf")
      print(outTable)
      outZSaT = ZonalStatisticsAsTable(shp, zoneField, raster, outTable, "DATA", "MEAN")

      # 下面是输出的每个参数的意义
      # shp: 输入的区域数据(一般为矢量的区域文件),
      # zoneField: 区分各个区域的字段(一般为名字或者代码),
      # raster: 需要统计的区域,
      # outTable: 输出的表(输出到数据库最好扩展名为.dbf),
      # "DATA":{是否忽略空值,DATA表示不计算空值},
      # "SUM":{需要统计的类型(最大最小平均……按需选择)})

      print(1.0 * num / count)
      num = num + 1
print('finish')
posted @ 2022-12-19 15:00  Weltㅤ  阅读(1233)  评论(0编辑  收藏  举报