gis python 要素赋值_基于ArcGIS的python编程 14、把属性值相同的要素融合为一个(后面发现是瞎搞)...

太久没有用Arcpy,发现Arcpy陌生了许多。最近都在忙工作的事情,因为工作上很少用到Arcpy,所以很久很久都没有更新专栏的文章了。前段时间项目经理叫我处理一个市的行政区数据,最后发现有很多行政区被分为多个图形(飞入地情况),需要把属于同一个行政区的所有图形融合为一个;因为自己很少做数据处理的工作,对于Arcmap也不是很熟悉,所以问了一下项目经理怎么处理比较方便,然后他说在编辑状态下,选中同一个行政区的图形然后融合;当时我就想骂人,几百个要素需要融合,这样手动融合,弄到什么猴年马月,不是他处理当然说的轻松。

后面想了一下,不管怎样都不能手动去处理,要是再来同样的几个任务,岂不是把我累死;于是重新拿起Arcpy神器,看看如何去实现把某字段属性值相同的图形融合为一个图形。

当时理了一下思路,要实现这个功能大概分为两步:1、找到某字段值重复的字段值;2、遍历这些字段值重复的要素,把字段值相同的要素融合为一个要素。

通过查找系统工具箱,发现【汇总统计】工具可以为我们统计出字段值重复的要素;【汇总统计】工具的帮助文档中的用法如下:详情可见在线帮助文档

用法输出表将由包含统计运算结果的字段组成。

以下统计运算可用于此工具:总和、平均值、最大值、最小值、范围、标准差、计数、第一个和最后一个。中值运算不可用。

将使用以下命名约定为每种统计类型创建字段:SUM_、MAX_、MIN_、RANGE_、STD_、FIRST_, LAST_、COUNT_(其中 是计算统计数据的输入字段的名称)。当输出表是 dBASE 表时,字段名称会被截断为 10 个字符。

如果已指定案例分组字段,则单独为每个唯一属性值计算统计数据。如果未指定案例分组字段,则输出表中将仅包含一条记录。如果已指定一个案例分组字段,则每个案例分组字段值均有一条对应的记录。

空值将被排除在所有统计计算之外。例如,10、5 和空值的 AVERAGE 为 7.5 ((10+5)/2)。COUNT 工具可返回统计计算中所包括值的数目,如本例中为 2。

统计字段参数添加字段按钮仅可以在“模型构建器”中使用。在模型构建器中,如果先前的工具尚未运行或其派生数据不存在,则可能不会使用字段名称来填充统计字段参数。添加字段按钮可用于添加所需字段,以完成“汇总统计数据”对话框并继续构建模型。

使用图层时,仅使用当前所选要素计算统计数据。

需要融合的数据属性表如下:这里通过【TYPE】字段把字段值相同的要素进行融合。属性表

通过【汇总统计】工具处理得到的统计表如下:从表中我们可以看到字段【TYPE】只有三个唯一值:空值,桔,天然草地;个数分别是112,29,23;汇总统计结果

有了汇总统计表,我们就可以根据表的数据,先获取要素的个数大于1的字段值→根据这个字段值在图层中找到字段值相同的要素→把这些要素融合为一个。

处理的代码如下:

#coding=utf-8

import arcpy

import os

in_FeaCls=arcpy.GetParameterAsText(0) #需要融合的图层

Statistics_Filed=arcpy.GetParameterAsText(1) #融合的字段

table=os.getcwd()+"\\Statistics4.dbf" #汇总统计表路径;os.getcwd()表示当前程序运行的路径

#进行汇总统计处理

arcpy.Statistics_analysis(in_FeaCls,table,[[Statistics_Filed,"COUNT"]],Statistics_Filed)

#Field_new为汇总统计表中的个数字段:例如:COUNT_TYPE

Field_new="COUNT_"+Statistics_Filed

#获取要素个数大于1的游标

SearcCursor=arcpy.SearchCursor(table,Field_new+" > 1")

for row in SearcCursor:

#因为图层数据的中文编码为unicode,所以这里需要通过encode("utf-8")转为utf-8编码

xzqh=(row.getValue(Statistics_Filed)).encode("utf-8") #获取要素个数大于1的字段值

count=int(row.getValue(Field_new)) #获取要素个数

sql="{0} = '{1}'".format(Statistics_Filed,xzqh) #构建SQL语句

UpdateCursor=arcpy.UpdateCursor(in_FeaCls,sql) #更新游标,用于融合

i=1

Row1=None

Geo=None

for updateRow in UpdateCursor:

if i==count:

Geo = Geo.union(updateRow.shape) #图形进行融合

updateRow.shape=Geo

UpdateCursor.updateRow(updateRow)

elif i==1:

Geo=updateRow.shape

UpdateCursor.deleteRow(updateRow)

else:

Geo = Geo.union(updateRow.shape) #图形进行融合

UpdateCursor.deleteRow(updateRow)

i=i+1

del UpdateCursor

del SearcCursor

代码处理后的结果如下:已经把字段值相同的要素融合为一个。处理后的结果

当我为自己的“聪明才智”感动开心的时候,发现Arcmap自带的【融合】工具就可以实现根据字段值进行融合的功能。真TM瞎搞,花费了那么多时间。系统自带的融合工具

虽然是瞎搞,但是也有收获,至少又熟悉了【汇总统计】工具;经过这次教训,有什么不懂的要先去网上看一下有没有什么可以值得借鉴的案例,这样可以少走一些弯路。

专栏文章会同步到微信公众号【GIS学习交流】

欢迎大家关注公众号一起交流,一起学习,一起进步!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值