ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

arcgis用累计值进行分级

arcgis用累计值进行分级

为了计算生态系统服务的重要性,一般来说会使用累计值来进行计算。比如说累计的前50%值的像元为极重要区,而50-75是一般重要。

重要性说明
极重要从大到小排序,累计50的值
重要从大到小排序,累计50-75的值
中等重要从 90%到 75%该段的栅格值,占总量 15%的值归类为中等重要区域
一般比 90%小的值,即占总量 10%的值全部归类为一般区域。

一、主要部分

**预先处理:**需要每个栅格数据都有属性表,没有属性表需要创造属性表,另外还需要新建字段ValueCount和percentage这个字段,前者为长整型后者为双精度。

下面的代码放在代码框中。

# 全局累加器cum=0.0total=0.0# 在计算前先一次性求 total(第一次执行时 total 仍然为 0,因此需要初始化)importarcpy# 获取当前图层(使用 !SHAPE! 触发,则自动是当前表)tbl=arcpy.Describe(arcpy.GetParameterAsText(0)).catalogPathifarcpy.GetParameterAsText(0)elseNone# 兼容 ArcMap,强制使用当前表名iftbl is None: tbl=r"%s"% arcpy.Describe("RWEQ_xh_ly.tif").catalogPath# 这块需要将 RWEQ_xh_ly.tif# 只在 total 还没算的时候执行一次iftotal==0: rows=arcpy.SearchCursor(tbl)forrinrows: total+=r.ValueCount# ValueCount是要算的字段def getCumProp(value): global cum cum+=valuereturncum / total

在想算比例的字段中计算这个值。

getCumProp(!ValueCount!)

**后续分级:**上述的方法是从小到大的,因而分析需要按照相反的方式来划分。(0.1、0.25、0.5、1)

二、探究部分

这里面其实有个问题,就是这个是基于什么排序的?我探索了一下,它并没有指定,在goble环境下,它自动依据value进行降序排序,不管你后面在属性表中进行再排序其结果都是一样的。

具体可以用一个简单的例子来说明。可以用下面的一个例子来进行说明。

cum=0.0def cumValue(v): global cum cum+=vreturncum
cumValue(!ValueCount!)

此外,我还探索了下面两行代码,为什么需要这么写。其实下面就是获得文件的路径。(下面的第一行代码本来就是想获取它当前的路径的,但是在arcmap里面是不成功的。)

# 获取当前图层(使用 !SHAPE! 触发,则自动是当前表)tbl=arcpy.Describe(arcpy.GetParameterAsText(0)).catalogPathifarcpy.GetParameterAsText(0)elseNone# 兼容 ArcMap,强制使用当前表名iftbl is None: tbl=r"%s"% arcpy.Describe("RWEQ_xh_ly.tif").catalogPath# 这块需要将 RWEQ_xh_ly.tif

进一步探索:SearchCursor
这个功能感觉没有啥具体的用处,能算xy和对应的面积。

importarcpy fc='c:/data/base.gdb/well'# For each row, print the Object ID field, and use the SHAPE@AREA# token to access geometry propertieswitharcpy.da.SearchCursor(fc,['OID@','SHAPE@AREA'])ascursor:forrowincursor:print(f'Feature{row[0]}has an area of{row[1]}')

进一步探索:和Describe的相关属性

# 1.使用键值访问特定属性。importarcpy path="C:\\Data\\Venice.gdb\\VeniceStructures"desc=arcpy.da.Describe(path)field_names=[field.nameforfieldindesc["fields"]]if"YEAR_BUILT"notinfield_names:arcpy.management.AddField(path,"YEAR_BUILT","SHORT")# 2.显示返回的 Describe 字典以查看所有可用属性。importarcpyfrompprintimportpprint path="C:\\Data\\Venice.gdb\\VeniceStructures"desc=arcpy.da.Describe(path)pprint(desc)

需要进一步探索的问题:如何进行给定的字段进行排序,这个很重要,又或者说当矢量的时候怎么处理呢?

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进