本篇文章將說明如何利用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加載影像,最終結果:
這就實現了批量拼接與裁剪影像的工作,其實拼接與裁剪無所謂先後順序。
如果你覺得本文對你有幫助,是支持讚賞的哦:)
如遇到問題,歡迎通過公衆號留言給作者,以便共同探討。
微信公衆號: