【ArcGIS自定义脚本工具】栅格统计频率和累计频率

文章目录

  • 一、功能介绍
  • 二、脚本代码
  • 三、工具参数
  • 四、工具界面

系列文章目录: ArcGIS自定义脚本工具


一、功能介绍

在基于像元二分模型利用植被指数计算植被覆盖度的过程中,通常以某一累计频率值对应的植被指数值作为裸地、满覆盖情况对应的植被指数值。例如将5%累计频率对应的植被指数值作为裸地的植被指数。在大都网络教程中,这一过程通常是利用ENVI软件的Qucik Stats工具完成的。本文通过提供一个ArcGIS的自定义脚本工具实现类似的功能,并且能够自动返回目标累计频率附近对应的像元值。
【ArcGIS自定义脚本工具】栅格统计频率和累计频率_第1张图片
名称:统计栅格频率和累计频率
描述:统计栅格像元值的频率和累计频率信息,突出显示目标累计频率附近的像元值,类似ENVI中的QuickStats。DN:像元值;COUNT:计数;Percent:频率(%);Acc Pct:累计频率(%)
必要输入:
Input raster——输入栅格
Target Acc Pct——待突出显示的累计频率(%),默认为5%和95%
Show detail——是否显示细节信息
创建时间:2022.07.12
最后修改时间: 2022.07.12
作者:Salierib

【ArcGIS自定义脚本工具】栅格统计频率和累计频率_第2张图片


二、脚本代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@File    : arcpy_calFcThres.py
@Author  : salierib
@Time    : 2022/7/11 22:09
@QQ group: 582151631
@Version:
"""
import os
import arcpy
import numpy as np
from collections import OrderedDict

tif = arcpy.GetParameterAsText(0)
tar_accs = arcpy.GetParameterAsText(1)  # List[float]
show_detail = arcpy.GetParameter(2) # bool

tar_accs = tar_accs.split(";")

# arcpy.AddMessage(show_detail)
def searchNearIdx(in_arr, target):
    idx = 0
    active = 1
    while active and idx < len(in_arr):
        if in_arr[idx] > target:
            active = 0
        else:
            idx = idx + 1
    return idx

def showInfo(raster_layer, show_detail=False):
    # read array from ASCII Grid File and use nodata value to filter array
    ndv = raster_layer.noDataValue
    arr_tmp = arcpy.RasterToNumPyArray(raster_layer.catalogPath)
    arr_valid = arr_tmp[arr_tmp != ndv]
    arr_valid.sort()
    res_count = OrderedDict()
    for i in arr_valid:
        if i not in res_count:
            res_count[i] = 1
        else:
            res_count[i] += 1
    arr_DN = list(res_count.keys())
    arr_Count = list(res_count.values())
    s = float(sum(arr_Count))
    arr_Percent = [(i / s * 100) for i in arr_Count]
    arr_Acc = [arr_Percent[0]]
    for v in arr_Percent[1:]:
        arr_Acc.append(v + arr_Acc[-1])
    if show_detail:
        arcpy.AddMessage("DN    COUNT    Percent    Acc Pct")
        infos = ["%5f    %d    %.6f    %.6f" % (vs[0], vs[1], vs[2], vs[3]) for vs in zip(arr_DN, arr_Count, arr_Percent, arr_Acc)]
        arcpy.AddMessage("\n".join(infos))
    for tar in tar_accs:
        arcpy.AddMessage("==================================")
        tar_idx = searchNearIdx(arr_Acc, float(tar))
        arcpy.AddMessage("%.6f | %.6f | %.6f" % (float(tar), arr_Acc[tar_idx], arr_DN[tar_idx]))
        arcpy.AddMessage("DN    COUNT    Percent    Acc Pct")
        num = 5
        for i in range(tar_idx-num//2, tar_idx+num//2):
            if 0 <= i < len(arr_DN):
                arcpy.AddMessage("%5f    %d    %.6f    %.6f" % (arr_DN[i], arr_Count[i], arr_Percent[i], arr_Acc[i]))


raster = arcpy.Raster(tif)
if not raster.bandCount != 1:
    showInfo(raster, show_detail=show_detail)
else:
    arcpy.AddMessage("%s is Multidimensional" % tif)

三、工具参数

【ArcGIS自定义脚本工具】栅格统计频率和累计频率_第3张图片
【ArcGIS自定义脚本工具】栅格统计频率和累计频率_第4张图片


四、工具界面

【ArcGIS自定义脚本工具】栅格统计频率和累计频率_第5张图片


你可能感兴趣的:(ArcGIS自定义脚本编程,植被指数,ArcGIS,自定义脚本)