標籤:

Arcpy:柵格批量裁剪工具製作(01)

平時在學習生活中,經常會出現「給你一套省/市的衛星影像圖,要求你分別裁剪出各個市/縣」的要求,這種重複性高又比較枯燥的工作,完全可以交由小工具來實現。這次的實驗,旨在利用已有的要素類對衛星影像數據進行批量裁剪(1:1的關係),最終得到裁剪後的8張小圖。

由於是第一次利用Arcpy製作腳本工具,所以思路上、編碼上多有缺漏,歡迎指點。

  1. 腳本工具

在Arcgis中,基於【我的工具箱】可以實現如下操作:

外加上利用Add_in製做Arcgis載入項,我們編寫工具的常見選擇就有腳本工具(.py)、Arcgis載入項和模型。

這裡我用的是腳本工具。

2. 製作流程

在開始之前,我們要清楚我們的目的是什麼:用一個要素類對衛星影像圖進行批量裁剪。因此首先想到的是用什麼樣的工具。

在ArcMap中,我們用的是【數據管理工具】|【柵格】下的【裁剪】工具,其函數是:

Clip_management (in_raster, rectangle, out_raster, {in_template_dataset},{ nodata_value}, {clipping_geometry}, {maintain_clipping_extent})

該函數一共有三個必要參數和四個可選參數,其中,in_raster, rectangle和 out_raster為必要參數。

之後,根據確定好的參數,考慮其實現方式有哪些,應如何將草稿紙上的導入變成代碼。

最後,才是進行代碼編寫、運行和調試。

基本流程如下:

03 代碼

(1)根據最終實現功能及裁剪函數Clip_management ,確定需要用戶輸入的內容有:輸入柵格、輸入裁剪要素、輸出柵格三大塊。其中「輸出柵格」部分主要由 「存放文件夾+文件名+柵格格式」三部分組成。

我們使用函數GetParameterAsText()函數來獲取用戶輸入信息。

GetParameterAsText():按照指定參數的索引在參數列表中的位置來獲取該參數。

(2)對要素類基於屬性表記錄進行迭代,利用循環所得的每個要素對柵格進行裁剪。這是最外層的結構,代碼如下(省略號處是之後函數參數的設置):

其中,SearchCursor(arcpy.da) 用於建立從要素類或表中返回的記錄的只讀訪問許可權;返回一組迭代的元組,元組中值的順序與 field_names 參數指定的欄位順序相符。

我們利用該函數對要素類屬性表進行遍歷,設置「要素層」為用戶輸入的要素;欄位名選擇SHAPE@,表示要素的幾何對象以獲取每一個要素。

(3)根據裁剪函數Clip_management參數,對迭代內容進行補充和完善。

第一個參數 「輸入柵格數據集」由用戶輸入獲取;

第二個參數要求輸入要素類四至點坐標;

第三個參數要求輸入「輸出路徑」;

第四個參數選擇矢量圖層作為裁剪範圍,已由遍歷要素類記錄獲得;

第五個參數設置默認值0;

最後一個參數用於判斷是否利用要素類的範圍或周長來裁剪柵格要素。

因此需要完善的參數主要包括:

獲取四至點(利用extent函數):

設置輸入路徑:

04 在ArcMap中使用工具

代碼編寫完成後,打開arcmap,在【目錄樹】下打開【工具箱】|【我的工具箱】,右鍵新建一個工具箱;再在工具箱右鍵,【添加】一個腳本,在彈出來的【添加腳本】嚮導中進行參數設置。

(1)設置腳本名稱、標籤和描述,單擊下一步。

(2)添加腳本文件,選擇已經寫好的腳本文件。這裡要注意,arcmap中所添加的腳本文件必須是以.py為後綴,否則程序出錯。單擊下一步。

(3)對工具的交互界面參數進行設置。這裡需要注意的是每個參數對應的「數據類型」以及它們的輸出輸入方向。

其中,根據柵格裁剪函數在幫助中的描述,我們設置「存儲格式」屬性時,將其「過濾器」設置為「值列表」。

(4)單擊確定完成工具設置,運行工具,獲得裁剪為8張的衛星影像圖。

05 一些要注意的地方

(1)注意函數大小寫

(2)路徑中文件名不能有空格

06 以下是完整代碼:

import sys

reload(sys)

sys.setdefaultencoding( "utf-8" )

import arcpy

# 獲取用戶輸入:

in_raster =arcpy.GetParameterAsText(0) # 輸入柵格數據集:柵格

in_template_dataset = arcpy.GetParameterAsText(1) # 裁剪要素:矢量

out_management = arcpy.GetParameterAsText(2) # 輸出文件夾

field = arcpy.GetParameterAsText(3) # 命名欄位:矢量

out_type = arcpy.GetParameterAsText(4) # 存儲類型

# 迭代編寫

# 獲取輸入要素類的游標

cursor = arcpy.da.SearchCursor(in_template_dataset,["SHAPE@",field])

for row in cursor: #遍歷輸入的圖層:每一條記錄

# 設置裁剪函數中rectangle的值,利用Extent獲取最小外界矩形的四至坐標

sed_fearture = row[0]

# 遍歷要素並獲取每個幾何的四至坐標。

rectangle_axtent=str(sed_fearture.extent.XMin)+" "+str(sed_fearture.extent.YMin)+" "+str(sed_fearture.extent.XMax)+" "+str(sed_fearture.extent.YMax)

# 設置輸出路徑

out_raster = out_management+""+str(row[1])+out_type

# 執行批量裁剪

arcpy.Clip_management(in_raster,rectangle_axtent,out_raster,sed_fearture, "0","ClippingGeometry")

推薦閱讀:

【數據運用】基於時空圈測度的京津冀城市群研究
『規劃師的ArcGIS應用手冊』- 遙感影像的用地解譯
QGIS 和 ArcGIS 的區別和優缺點有哪些呢?
ArcGIS Pro 2.0的發布意味著什麼?
請問蘋果系統可以使用arcgis或者envi這一類軟體么?

TAG:ArcGIS |