前段時間在學習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的圖斑合併

合併前如下圖:

基於ArcGIS的python程式設計 7.小圖斑處理

圖1 其中一個小圖斑

基於ArcGIS的python程式設計 7.小圖斑處理

圖2 鄰接大圖斑1

基於ArcGIS的python程式設計 7.小圖斑處理

圖3 鄰接大圖斑2

工具處理後如下圖:

基於ArcGIS的python程式設計 7.小圖斑處理

圖4 面積小於400的已經刪除

基於ArcGIS的python程式設計 7.小圖斑處理

圖5 其中一個小圖斑已與大圖斑合併

總結:

這裡總結一下前面說到的bug,因為之前沒有深入去了解Arcpy的遊標,導致在利用遊標的時候沒有意識到插入,更新遊標有鎖這個概念;之前的程式我只是用到兩個更新遊標,想進行面積比較的同時像一般的變數那樣進行變數的交換獲得面積最大的圖斑,因為有“鎖”這個概念,導致更新遊標的row被鎖定,不能進行一般的變換,所以一直找不到面積最大的遊標,當時卡在這裡的時候,還一直以為是python的資料型別的問題,直到學習了Oracle資料庫中的遊標,才意識到有可能Arcpy遊標的問題,後面的程式新增查詢遊標後,bug終於排除了。

這就是菜鳥自學初期的鬱悶,遇到問題沒有人交流與幫助,遇到bug久久不能排除的話真的挺打擊人的,有時真的鬱悶到懷疑人生,哈哈哈……!這過程雖然有點慢,但是想起一句俗語:“不怕慢,只怕站”!所以希望有更多的人一起交流,縮短排除bug的時間。

不過經過自己努力,解決bug以後還是會有那麼一點點的成就感的,這可能就是程式設計吸引人的地方,不斷的遇到bug,不斷的尋找辦法排除bug,充滿不確定性與挑戰!

=======================20190315更新===============

在奪命書生412的提醒下,ArcMap下製圖綜合裡的【聚合面】工具可以實現本文類似的功能;有興趣的可以去了解對比一下。

基於ArcGIS的python程式設計 7.小圖斑處理

聚合面工具

專欄文章會同步到微信公眾號【

GIS學習交流

歡迎大家關注公眾號一起交流,一起學習,一起進步!