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

news2024/12/23 15:07:49

在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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

理解时序数据库的时间线

在当今数据爆炸的时代,时序数据已经成为企业和组织中不可或缺的一部分。它们包括了从传感器、监控设备、日志记录系统和金融交易等多种来源的大量数据,这些数据按照时间顺序排列,记录了各种事件和活动的发生和变化。时序数据的分析和处理对于…

通过python封装1688图片搜索商品数据接口,拍立淘API接口

1688图片搜索API封装接口是一个可以帮助用户快速使用1688图片搜索API的接口封装库。该接口封装库可以帮助用户快速引入1688图片搜索API,并提供各种参数配置和封装的API调用方法,以方便用户快速实现自己的图片搜索需求。 该接口封装库将1688图片搜索API的…

Redis Hash(散列表)实现原理看这篇就够了

1. 是什么 Redis Hash(散列表)是一种 field-value pairs(键值对)集合类型,类似于 Python 中的字典、Java 中的 HashMap。一个 field 对应一个 value,你可以通过 field 在 O(1) 时间复杂度查 field 找关联的…

Qt+QtWebApp开发笔记(四):http服务器使用Session和Cookie实现用户密码登录和注销功能

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130921152 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

信号量对象没有所有者

相较于互斥对象(Mutex)和临界区对象(Critical Section) ,信号量没有所有者,它们只有计数。 ReleaseSemaphore 函数将会以指定的数量增加对应信号量对象的计数。 (增加计数这个动作,可能会释放正在等待的线程)但是释放信号量的线程…

metaIPC2.0 SDK实现webRTC对讲IPC

概述 metaRTC新推出P2P版metaIPC2.0 sdk版本,基于mqtt通信,同时支持windows/linux/android操作系统,支持国内如海思/君正/瑞芯微/MSTAR等主流芯片。 metaIPC2.0支持linux/android/windows IPC,客户端支持浏览器/APP/windows和li…

【JavaSE】Java基础语法(二十七):Set集合和 TreeSet

文章目录 1. Set集合1.1Set集合概述和特点【应用】1.2Set集合的使用【应用】 2.TreeSet集合2.1TreeSet集合概述和特点【应用】2.2TreeSet集合基本使用【应用】2.3自然排序Comparable的使用【应用】2.4比较器排序Comparator的使用【应用】2.4两种比较方式总结 1. Set集合 1.1Se…

数据库必备知识:脏读和幻读的定义及应对策略

随着数据库应用的广泛使用,数据库并发性和一致性的问题成为了引起重视的问题之一。其中,脏读(Dirty Read)和幻读(Phantom Read)是常见的并发访问问题,本文将对脏读、幻读进行详细介绍&#xff0…

炸裂!GPT-4 开始自主进化,打造一个虚拟世界!

公众号关注 “GitHubDaily” 设为 “星标”,每天带你逛 GitHub! 此前 GitHub 曾诞生过一个名为 Auto-GPT 的开源项目,让 AI 能够根据人类给出的目的,自动设定任务的优先级,尝试自行优化代码、自动改 Bug 等操作。不得不…

2024考研408-计算机组成原理第一章-计算机系统概述

文章目录 起步:认识计算机一、计算机发展历程1.1、什么是计算机系统1.2、计算机硬件的发展1.2.1、总览四代发展1.2.2、四代发展详细介绍1.2.3、计算机硬件的发展历史1.2.4、摩尔定律介绍 1.3、计算机软件的发展1.3.1、软件的发展1.3.2、目前的发展趋势 知识回顾与重…

Redis中的Reactor模型和执行命令源码探索

文章目录 摘要1、 了解Linux的epoll2、了解Reactor模型 一、Redis初始化1.1、配置初始化1.2、服务初始化1.3、网络监听初始化1.4、Reactor线程池初始化1.5、Reactor事件主循环 二、Reactor2.1、Reactor事件处理器2.2、读事件2.2.1、第一次读事件(accept)…

基于MATALB编程的深度信念网络DBN的01分类编码三分类预测,DBN算法详细原理

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) DBN的语音分类识别 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,是一种非常好的分类算法,本文将DBN算法对数据采用01编码分析…

【数据湖仓架构】数据湖和仓库:Azure Synapse 视角

是时候将数据分析迁移到云端了。我们将讨论 Azure Synapse 在数据湖和数据仓库范式规模上的定位。 在本文中,我们将讨论 Microsoft 的 Azure Synapse Analytics 框架。具体来说,我们关注如何在其中看到数据仓库和数据湖范式的区别。为了熟悉这个主题&…

【Linux】Linux环境基础工具的基本使用及配置(yum、vim)

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯长路漫漫浩浩,万事皆有期待 文章目录 Linux软件包管理器 - y…

60分钟吃掉detectron2

本范例演示使用非常有名的目标检测框架detectron2 🤗🤗 在自己的数据集(balloon数据)上训练实例分割模型MaskRCNN的方法。 detectron2框架的设计有以下一些优点: 1,强大:提供了包括目标检测、实例分割、全景分割等非常…

Spring Boot启动流程

1 Springboot 启动流程 创建一个StopWatch实例,用来记录SpringBoot的启动时间。 通过SpringFactoriesLoader加载listeners:比如EventPublishingRunListener。 发布SprintBoot开始启动事件(EventPublishingRunListener#starting()&#xff0…

性能测试——基本性能监控系统使用

这里写目录标题 一、基本性能监控系统组成二、环境搭建1、准备数据文件 type.db collectd.conf2、启动InfluxDB3、启动grafana4、启动collectd5、Grafana中配置数据源 一、基本性能监控系统组成 Collectd InfluxdDB Grafana Collectd 是一个守护(daemon)进程,用来…

【数据结构】时间复杂度与空间复杂度

目录 前言一、算法效率1. 算法效率的定义 二、时间复杂度1. 时间复杂度的定义2. 时间复杂度的计算 三、空间复杂度1. 空间复杂度的定义2. 空间复杂度的计算 四、时间复杂度曲线图结尾 前言 在学习C语言的时候,大多数的小伙伴们并不会对算法的效率了解,也…

视频采集到录制 - 音频采集到降噪

继续上篇的视频采集到录制 视频采集相对来说还是算正常,如果资源够用,使用第三方库也是种解决办法 但音频采集网上资料相对也少,走了一遍,也发现存在很多坑 1. 音频采集 一般来说,采用MIC采集,采集出来的格…

内存泄露的循环引用问题

内存泄漏一直是很多大型系统故障的根源,也是一个面试热点。那么在编程语言层面已经提供了内存回收机制,为什么还会产生内存泄漏呢? 这是因为应用的内存管理一直处于一个和应用程序执行并发的状态,如果应用程序申请内存的速度&…