概述
前段时间在学习AE的时候看到一个进行小斑处理的案例,需求大概是这样的:找出面积小于一个定值的图斑,把它合并在与其邻接的面积最大的图斑上(且面积大于定值)。根据博文的思路自己也用AE实现了这个功能;实现之后在思考通过Arcpy如何实现呢?
感觉由AE转换到Arcpy中,思路是差不多,只是一些细节的变化而已,刚刚开始以为不难,可是因为自己对Arcpy不是很熟悉,转换的过程中也遇到很多bug,其中一个bug困惑了我好久,几乎让我一度想放弃;最近在学习Oracle数据库的游标时候得到一点点启发,联想到Arcpy中的游标,才发现导致bug的原因是游标用错了,最终才有了这篇文章。
实现的思路是:通过更新游标结合SQL语句获得面积小于定值的小图斑UpdaCursor与大于定值的大图斑UpdaCursor3、查找游标游标结合SQL语句获得面积大于定值的图斑Searchcursor2;利用for循环遍历小图斑,第一步用UpdaCursor中每一个小图斑与Searchcursor2中每一个大图斑通过touches()函数判断是否邻接,获得与小图斑邻接的大图斑中最大面积的值;第二步通过最大面积的值与UpdaCursor3的大图斑进行匹配获得面积最大的图斑;第三步:小图斑与大图斑合并,大图斑更新,删除小图斑。
这里新建自定义工具箱的过程不再阐述,上一篇文章中也有说到。在自定义工具箱中的代码中尽量不要出现中文,下面的注释只是为了读者更好的理解。
完整代码如下:
#coding=utf-8
import arcpy
tuban=arcpy.GetParameterAsText(0)
MinArea=arcpy.GetParameterAsText(1)
#获得面积小于定值的集合UpdaCursor
UpdaCursor=arcpy.UpdateCursor(tuban,'Shape_Area<='+str(MinArea))
#遍历小图斑
for minrow in UpdaCursor:
mintuban=minrow.shape #获得每一个小图斑几何图形
#获得面积大于定值的图斑
Searchcursor2 = arcpy.SearchCursor(tuban, 'Shape_Area>' + str(MinArea))
areas=[] #与小图斑邻接的图斑的面积列表
# 遍历大图斑,找到与小图斑邻接且面积最大的大图斑的面积
for row in Searchcursor2:
pgeo = row.shape
if (mintuban.touches(pgeo)): # 判断是否邻接
# 在邻接的大图斑中找出面积最大的
areas.append(pgeo.area) # 把邻接图斑的面积添加到列表中
# 小图斑与大图斑进行合并
UpdaCursor3 = arcpy.UpdateCursor(tuban, 'Shape_Area>' + str(MinArea))
if len(areas)>0: #邻接的图斑的个数大于0
Max_area = max(areas) ##找到邻接图斑中的最大面积
for row2 in UpdaCursor3:
if (row2.shape.area == Max_area): # 获得大图斑
row2.shape = row2.shape.union(mintuban)
UpdaCursor3.updateRow(row2)
UpdaCursor.deleteRow(minrow) #删除小图斑
调试:例如这里要把面积小于400的图斑合并
合并前如下图:
图1 其中一个小图斑
图2 邻接大图斑1
图3 邻接大图斑2
工具处理后如下图:
图4 面积小于400的已经删除
图5 其中一个小图斑已与大图斑合并
总结:
这里总结一下前面说到的bug,因为之前没有深入去了解Arcpy的游标,导致在利用游标的时候没有意识到插入,更新游标有锁这个概念;之前的程序我只是用到两个更新游标,想进行面积比较的同时像一般的变量那样进行变量的交换获得面积最大的图斑,因为有“锁”这个概念,导致更新游标的row被锁定,不能进行一般的变换,所以一直找不到面积最大的游标,当时卡在这里的时候,还一直以为是python的数据类型的问题,直到学习了Oracle数据库中的游标,才意识到有可能Arcpy游标的问题,后面的程序添加查找游标后,bug终于排除了。
这就是菜鸟自学初期的郁闷,遇到问题没有人交流与帮助,遇到bug久久不能排除的话真的挺打击人的,有时真的郁闷到怀疑人生,哈哈哈……!这过程虽然有点慢,但是想起一句俗语:“不怕慢,只怕站”!所以希望有更多的人一起交流,缩短排除bug的时间。
不过经过自己努力,解决bug以后还是会有那么一点点的成就感的,这可能就是编程吸引人的地方,不断的遇到bug,不断的寻找办法排除bug,充满不确定性与挑战!
=======================20190315更新===============
在夺命书生412的提醒下,ArcMap下制图综合里的【聚合面】工具可以实现本文类似的功能;有兴趣的可以去了解对比一下。聚合面工具
欢迎大家一起交流,一起学习,一起进步!
最后
以上就是糟糕短靴为你收集整理的arcgis的python编程_基于ArcGIS的python编程 7.小图斑处理的全部内容,希望文章能够帮你解决arcgis的python编程_基于ArcGIS的python编程 7.小图斑处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复