利用ArcGIS Python批量拼接裁剪遙感影像(arcpy batch processing)

本篇文章將說明如何利用ArcGIS 10.1自帶的Python IDLE進行遙感影像的批量拼接與裁剪。

1.運行環境:ArcGIS10.1 (安裝傳送門)、Python IDLE

2.數據來源:地理空間數據雲 GDEMV2 30M分辨率數字高程數據

3.解決問題:製作山西省的DEM影像

如下圖所示,以30M分辨率數字高程數據爲例,影像皆是固定範圍的經緯度保存在其服務器上,外在表現以小幅正方形影像。如果手動進行拼接,工作量會非常大且容易出錯。

我們的目標:批處理,寫一次代碼,處理多幅影像


1.查找目標範圍的經緯度信息,本文以山西爲例,經緯度範圍在N33-N41, E109-E114直接,所以先將這個範圍內的影像下載後,解壓後放在一個文件夾下。


2.拼接影像

開始菜單-ArcGIS-IDLE(Python GUI) 打開IDLE。File-New Window, 文件以 .py結尾,如MosaicToNewRasters.py

import arcpy
import os

#指定工作目錄,即存放影像的目錄
arcpy.env.workspace = r"E:\Huangkun\arcpyData\shanxi\N34_N35"

#指定該工作空間下的一副影像爲基礎影像,爲後面的參數提取做準備
base = "ASTGTM2_N34E109_dem.tif"

#以下一段代碼是爲執行拼接做參數準備
out_coor_system = arcpy.Describe(base).spatialReference #獲取座標系統
dataType = arcpy.Describe(base).DataType 
piexl_type = arcpy.Describe(base).pixelType 
cellwidth = arcpy.Describe(base).meanCellWidth #獲取柵格單元的的寬度
bandcount = arcpy.Describe(base).bandCount #獲取bandCount

#打印一些信息
print out_coor_system.name
print dataType
print piexl_type
print cellwidth
print bandcount

arcpy.CheckOutExtension("Spatial")

#提取待拼接影像的文件名,且中間以;隔開,例如:a.tif;b.tif;c.tif
rasters = []
for ras in arcpy.ListRasters("*dem.tif"):    #for循環,對wrokspace下的所有以dem.tif結尾的影像進行過濾
    rasters.append(ras)

ras_list = ";".join(rasters)                 #字符串拼接

#打印出來,看看什麼結果吧
print ras_list


#指定輸出文件夾
outFolder = r"E:\Huangkun\arcpyData\shanxi\N34_N35\n34_n35_out"

#執行拼接操作
arcpy.MosaicToNewRaster_management(ras_list, outFolder, "shanxi_n34_n35_dem_data.tif", out_coor_system, "16_BIT_SIGNED", cellwidth, bandcount, "LAST", "FIRST")

RUN-->Run Module F5 執行代碼

這裏用到了arcpy包下面的 MosaicToNewRaster_management()函數

得到如下結果


3.以山西省shp邊界裁剪影像


再新建一個Window,文件命爲BatchExtractByMask.py

import arcpy
import glob
import os

arcpy.CheckOutExtension('Spatial')

#指定先前拼接後的遙感影像所在目錄
inws = r"E:\Huangkun\arcpyData\shanxi\shanxi_regular_dem\shanxi_province_dem"

#指定裁剪後的影響存放目錄
outws = r"E:\Huangkun\arcpyData\shanxi\shanxi_regular_dem\shanxi"

#指定shp範圍邊界文件,即目標區域的邊界
mask = r"E:\Huangkun\arcpyData\shanxi\shanxi_shp\shanxi.shp"

#利用glob包,將inws下的所有tif文件讀存放到rasters中
rasters = glob.glob(os.path.join(inws, "*.tif"))

#循環rasters中的所有影像,進行按掩模提取操作
for ras in rasters:
    outname = os.path.join(outws, os.path.basename(ras).split(".")[0] + "_clp.tif")  #指定輸出文件的命名方式(以被裁剪文件名+_clip.tif命名)
    out_extract = arcpy.sa.ExtractByMask(ras, mask)  #執行按掩模提取操作
    out_extract.save(outname)  #保存數據

執行腳本代碼,裁剪後的影像被存放在outw所指定的文件夾


4.通過ArcMap加載影像,最終結果:


這就實現了批量拼接與裁剪影像的工作,其實拼接與裁剪無所謂先後順序。

如果你覺得本文對你有幫助,是支持讚賞的哦:)



如遇到問題,歡迎通過公衆號留言給作者,以便共同探討。

郵箱:[email protected]

微信公衆號:


發佈了42 篇原創文章 · 獲贊 260 · 訪問量 65萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章