Arcgis小技巧【13】——数据统计(Statistics)相关工具汇总

欢迎关注同名微信公众号,更多文章推送:

在Arcgis中可以通过属性表中字段的【统计】功能或使用统计相关的工具对属性表进行数据统计。

在Arcgis工具箱中有一组【统计分析】工具集,不仅包含对属性数据执行标准统计分析(例如平均值、最小值、最大值和标准差)的工具,也包含对重叠和相邻要素计算面积、长度和计数统计的工具。

这里以统计分析工具集为基础,聊聊Arcgis中的数据统计工具。


一、属性表中字段的【统计】功能

属性表中字段的【统计】功能是最简单的数据统计方式,虽然功能简单,但胜在方便,所以使用率算是挺高的。

打开属性表,在需要统计的字段上右击,即可选择【统计】功能:


二、【汇总统计数据】工具(Statistics)

【汇总统计数据】工具是最常用的一个统计工具,通常用于按字段统计面积等。

下图就是一个典型的按【JQDLBM】字段来统计用地面积的例子:

生成的结果简单明了:

生成表中的【FREQUENCY】是按分类统计的图斑个数,第一行的【36】即【JQDLBM】值为【0101】的图斑有36个的意思。

实际上【统计分析】工具集里的另一个【频数】工具,就是实现这么个功能……,而且在统计类型里也有这么一个选项【COUNT】可以得到同样的结果。其它选项如下:

另一个参数【案例分组字段】就按某组字段来分组的意思,上面的例子以单个字段【JQDLBM】来分。

如果你的图斑是包括多个村庄,你想统计不同村庄的不同用地类型,就可以用2个字段作为分组字段:

工具运行结果如下:


三、【交集制表】工具(TabulateIntersection)

【交集制表】工具和上面的【汇总统计数据】工具有点类似,但应用场景有点不一样。

例如一个村庄可以分为几个片区,但这个分区并不在村庄用地的相关字段里,而是在另一个要素类中定义。

你想统计上图中这两个片区的用地面积,就可以使用【交集制表】工具。需要注意的是,这个分区要素并不一定要和统计要素完全重叠,工具运行的时候只会统计两个要素之间完全重叠的区域。

工具运行结果如下:

这里也会生成一个额外的【PERCENTAGE】字段,意思是该分区统计的面积占分区面积之比。例如南村的用地并没有布满区域,所以这个比值就只有38%。


四、【范围内汇总】工具(SummarizeWithin)

需要说明的是,【范围内汇总】工具是ArcGIS Pro中独有的,从功能上看,相当于【交集制表】工具的加强版,不仅能生成汇总表,还能复制一个分区范围的要素,并且将汇总数据添加到分区范围要素上。

工具位置也在【统计分析】工具集下。

从工具参数可以看出,有2个输出,一个是汇总表,还有一个是输出的分区要素,上面有添加的汇总信息。还有一些汇总参数,像少数、众数什么的,不过感觉用处不大。

【范围内汇总】工具生成的汇总表和【交集制表】工具差不多:

输出的分区要素:

和【交集制表】工具相比,感觉也就是锦上添花吧,说不上有什么特别优秀的地方,可以看情况选用。


五、【数据透视表】工具(PivotTable)

此工具通过在“输入表”中减少记录中的冗余并简化一对多关系来创建表。可以对生成的汇总表进一步处理,特别是用多个分组字段生成的汇总表。

工具位置在【数据管理工具】的【表】工具集下。

以下图的汇总表为例:

这张表的表达不够直观,特别是2个村庄之间的数据对比比较差,我们需要将【所属边界】放到横坐标(字段名)上(相当于Excel里的列)。

工具参数如下:

这几个参数经常搞混,多用几次,熟悉就好了。生成结果如下:

转换后的数据透视表就直观多了,导出Excel后也便于后续处理。


六、【字段统计数据转表】工具(FieldStatisticsToTable)

【字段统计数据转表】工具也是ArcGIS Pro独有的,工具位置在【数据管理工具】的【字段】工具集下。

这个工具怎么说呢,就是花里胡哨……。基本功能也就是【汇总统计数据】工具做的事,只是它能汇总的内容更多更花哨(无聊?)。

统计结果如下:


以上就是ArcGIS中和数据统计相关的内容,最常用的实际上也就是属性表字段的【统计】功能和【汇总统计数据】工具,其它工具也就是在特定场景下才用得上。不过可以看出ArcGIS给我们准备的功能或工具是很齐全的,也可见是个很有深度的软件。


七、自制脚本工具汇总

如果上面的工具都不能满足你的要求,还可以尝试用脚本来实现。

如上图所示,要分组统计的字段有2个,但和汇总工具不同的是,汇总结果并非同时满足2个字段值,而是分开统计,即按字段1、字段2分别统计,再将表合并起来。在实际工作中,你可以得到一级地类和二级地类的统计表格。

用脚本工具是很自由的,你可以再增加一点其它功能,比如说,生成一个【合计值】,即所有地块的总面积,再增加一个字段,统计各类用地占总用地面积的【比例】。

甚至还可以对【面积单位进行转换】,如转成公顷、平方公里等,以及保留【固定的小数位数】。

生成的示例结果如下:

脚本工具参数设置如下:

限于篇幅,具体代码不详细说了,直接贴上:

# -*- coding: utf-8 -*-
import arcpy
import os

input_table = arcpy.GetParameterAsText(0)       # 输入表
input_field = arcpy.GetParameterAsText(1)       # 输入要统计的字段
input_sta = arcpy.GetParameterAsText(2)         # 输入合计字段值(可选)
is_ha = arcpy.GetParameter(3)                   # 是否转成公顷
is_round = arcpy.GetParameter(4)                # 是否保留2位小数
output_table = arcpy.GetParameterAsText(5)      # 输出表

# 获取文档位置
default_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))  # D:\【软件资料】\GIS相关\GisPro工具箱
tem_gdb = default_path + r'\3-默认数据库\GisPro工具箱.gdb'  # 临时数据库

# 汇总多个字段
def MultyStatic():
    # 解析字段列表
    list_field = input_field.split(';')
    # 汇总多个字段
    list_table = []
    for i in range(len(list_field)):
        area_static = arcpy.Statistics_analysis(input_table, tem_gdb + r'\area_static_' + str(i), [['Shape_Area', "SUM"]], [list_field[i]])
        arcpy.AddField_management(area_static, '统计字段', "TEXT")   # 添加公共字段
        arcpy.CalculateField_management(area_static, '统计字段',expression='!' + list_field[i] + '!')    # 计算公共字段
        list_table.append(area_static)
    # 汇总总量
    area_total = arcpy.Statistics_analysis(input_table, tem_gdb + r'\area_static_total', [['Shape_Area', "SUM"]])
    arcpy.AddField_management(area_total, '统计字段', "TEXT")  # 添加公共字段
    arcpy.CalculateField_management(area_total, '统计字段', expression='\'' + input_sta + '\'')  # 计算公共字段
    list_table.append(area_total)
    # 合并表格
    area_all = arcpy.Merge_management(list_table, tem_gdb + r'\yd_all')
    # 去除空值,输出table
    arcpy.TableSelect_analysis(area_all, output_table, where_clause="统计字段 IS NOT NULL")
    # 添加统计值和比例字段
    arcpy.AddField_management(output_table, '统计值', 'FLOAT')
    arcpy.AddField_management(output_table, '比例', 'FLOAT')
    # 计算统计值和比例字段
    arcpy.CalculateField_management(output_table, '统计值', expression='!SUM_SHAPE_Area!')
    total = float(str(GetFieldValue(output_table, '统计值', "统计字段 = '" + input_sta + "'")))
    fields = ['统计值', '比例']
    with arcpy.da.UpdateCursor(output_table, fields) as cursor:
        for row in cursor:
            row[1] = row[0]/total*100
            if is_ha is True:               # 转换成公顷
                row[0] = row[0]/10000
            cursor.updateRow(row)
    # 判断是否保留2位小数
    with arcpy.da.UpdateCursor(output_table, fields) as cursor:
        for row in cursor:
            if is_round is True:
                row[0] = round(row[0], 2)
                row[1] = round(row[1], 2)
            cursor.updateRow(row)
    # 删除中间字段
    arcpy.DeleteField_management(output_table, list_field)
    arcpy.DeleteField_management(output_table, ['FREQUENCY', 'SUM_SHAPE_Area'])
    # 删除中间要素
    arcpy.Delete_management(area_static)
    arcpy.Delete_management(area_total)
    arcpy.Delete_management(area_all)

# 获取要素或表的某一个字段的第一个值,默认字段为Shape_Area。筛选表达式为:keyField=key
def GetFieldValue(input_table, value_field, sql):
    # 按sql语句筛选出所要的表格
    table = arcpy.TableSelect_analysis(input_table, r'memory\table_sel', sql)
    # 定义一个空值,用于储存返回的结果
    filedValue = '0'
    # 读取值【如果筛选值有多个,只取第一个值】
    with arcpy.da.SearchCursor(table, [value_field]) as cursor:
        for row in cursor:
            filedValue = row[0]
            break
    arcpy.SetParameterAsText(3, str(filedValue))


if __name__ == '__main__':
    MultyStatic()
  • 13
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实习内容: 练习1:使用缺省参数创建一个表面 练习2:数据检查 练习3:制作臭氧浓度图 练习4:模型比较 练习5:制作超出某一临界值的臭氧概率图 练习6:生成最终成果图 预备知识: 利用地统计分析模块,你可以根据一个点要素层中已测定 采样点、栅格层或者利用多边形质心,轻而易举地生成一个连续表面。这些采样点的值可以是海拔高度、地下水位的深度或者污染值浓度等。当与ArcMap一起使用时,地统计分析模块提供了一整套创建表面的工具,这些表面能够用来可视化、分析及理解各种空间现象。 美国环保局负责对加利佛尼亚州的大气臭氧浓度进行监测。臭氧浓度值是通过遍布全州的监测站来测定的。已经知道所有监测站的臭氧值浓度,但是我们还想知道加利佛尼亚州其他任一地方的臭氧浓度值,但是考虑到费用以及实用性问题,我们不可能在任何地方都建立监测站。地统计分析模块提供了许多工具,通过检测所有采样点之间的关系,生成一个关于臭氧浓度值、预测标差(不确定性)以及超出临界值的概率的连续表面,从而使对其他点的浓度值进行最佳预测成为可能。 在地统计分析模块的安装盘上,附有本次联系所需要的数据。这些数据包括: 数据集 描述 Ca_outline 加州轮廓图 Ca_ozone_pts 臭氧采样点数据(单位:ppm) Ca_cities 加州主要城市位置图 Ca_hilshade 加州山体阴影图 臭氧数据集(Ca_ozone_pts)表示的是1996年中每八个小时时段内的臭氧平均浓度的最大值,以ppm为单位。根据这些臭氧采样点的测量值,你可以生成两个连续表面(或地图),以现有的采样点数据为基础来预测加洲任意地方的臭氧浓度值。创建第一张图时你只需要简单地使用缺省选项即可,你会看到根据采样点数据生成表面是多么容易的事情。生成第二张图时,你可以较多的考虑采样点之间存在的空间关系,这时,你将要用到ESDA(空间数据探索分析)工具来检查你的数据。你还会学习到一些地统计选项,利用这些选项,你可以创建诸如剔除趋势并且模拟空间自相关的表面。利用ESDA工具,通过对各种地统计参数的操作,你可以创建出更加精彩的表面。 很多时候,我们关心的并不是那些有损于健康的风险的实际值,而是它是否超出某一有毒水平,如果确实超出,必须采取行动。你创建的第三个表面将用来评估臭氧浓度超过临界值的概率。 对于本次练习,临界值规定如下:如果最大值超过0.12ppm,那么这个地方就应该被严密监测。利用这个标准,你可以利用地统计分析模块来预测臭氧浓度超出临界值的概率大小。本练习被分为各个单独的任务,你可以根据自己的学习进度来逐步熟悉地统计分析模块个各项功能。 练习1带你进入地统计分析模块,通过创建臭氧浓度表面的过程,你会发现使用缺省参数创建表面是一件很容易的事情。 练习2教你创建表面之前如何对数据进行检查。数据检查的目的是为了找出数据中那些离群值并且发现数据中存在的趋势。 练习3你将创建第二个表面,这个表面更多地考虑了练习2中数据分析发现的空间关系,并且对练习1中生成的表面进行了改进。该练习还将向你介绍地统计学中的一些基本概念。 练习4教你如何对练习1和练习3中创建的表面进行比较,并判断哪个表面对未知值的预测更好。 练习5指导你创建臭氧浓度超出临界值的概率图,从而生成第三个表面。 练习6告诉你怎样利用ArcMap的功能将你在练习3和练习5中创建的表面放在一起做最终的显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

规划GIS会

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

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

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

打赏作者

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

抵扣说明:

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

余额充值