系列文章目录: 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)
三、工具参数