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

本文介绍了一个ArcGIS自定义脚本工具,用于计算栅格像元值的频率和累计频率,特别强调了如何根据目标累计频率查找对应像元值,类似于ENVI的QuickStats功能。适用于植被覆盖率分析,便于快速定位关键阈值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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


一、功能介绍

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

在这里插入图片描述


二、脚本代码

#!/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)

三、工具参数

在这里插入图片描述
在这里插入图片描述


四、工具界面

在这里插入图片描述


评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Salierib

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值