Advertisement

arcmap 影像坐标批处理 python_利用ArcGIS Python批量拼接裁剪遥感影像(arcpy batch processing)...

阅读量:

本文旨在介绍如何运用ArcGIS 10.1内置的Python IDLE进行遥感影像的批量拼接与裁剪操作;同时提供相关代码示例。

1.运行环境:ArcGIS10.1 (安装传送门)、Python IDLE服务器

2.数据来源:地理空间数据云 GDEMV2 30M分辨率数字高程数据微信

3.解决问题:制做山西省的DEM影像微信开发

如图所示,在采用30M空间分辨率的数字高程数据为例时,在其服务器上存储的是确定的空间范围内的经纬度坐标图片。手动拼接这些影像,则工作量较大且容易出现错误。app

咱们的目标:批处理,写一次代码,处理多幅影像函数

45315920920a2e2c93ae631261f9defc.png

获取研究区域的经纬度信息,并以山西为例进行说明。具体而言,在N33至N41纬度和E109至E114经度范围内直接给出了具体的经纬度数值。因此需要先下载并解压该范围内的影像数据,并将其归集到特定文件夹中。

d67ff1676723dcc265f20c20647dd090.png

2.拼接影像.net

ArcGIS IDLE (Python GUI) 是用于启动 IDLE 的工具。在 ArcGIS IDLE (Python GUI) 中执行以下操作:新建窗口(File-New Window),并将文件命名为以 .py 结尾(如 MosaicToNewRasters.pycode)作为模板进行操作。

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 = []

该代码段将遍历wrokspace中的所有以dem.tif为后缀的栅格文件,并进行相应的过滤处理。

rasters.append(ras)

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

#打印出来,看看什么结果吧

print ras_list

#指定输出文件夹

outFolder = r"E:\Huangkun\arcpyData\shanxi\N34_N35\n34_n35_out"

#执行拼接操做

MosaicToNewRaster管理模块(ras_list)将被用于将多个栅格图层(ras_list)合并至指定的目标文件夹(outFolder)中,并生成名为"shanxi_n34_n35_dem_data.tif"的输出地理信息系统数据集(output file)。该操作将使用指定的空间参考系统(output coordinate system)、无符号16位整数类型的栅格数据(data type)、单元格宽度(cell width)、以及波段数量(number of bands)。Mosaic顺序设置为从最后一个栅格开始并依次向前覆盖前面的栅格(Mosaic order),最终生成的第一张栅格将被选为输出结果的第一个栅格(First output raster)。

这里用到了arcpy包下面的 MosaicToNewRaster_management()函数blog

获得以下结果

17b0ef03a4d8dbd678e3553325302dc1.png

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

deb2b76434d17d2ac1bb0a7fe6a6db93.png

再新建一个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所指定的文件夹

f497ef8e3696a29efbcaabadc30d3e4a.png

4.经过ArcMap加载影像,最终结果:

c3159387e90b5dea954de2dfa85d2107.png

这就是完成了批量拼接与影像剪辑的工作流程,并且无论先执行拼接还是剪辑都不会影响最终结果

若是你以为本文对你有帮助,是支持赞扬的哦:)

79fdf0b45f65846fb6b82e4f0d9e22e0.png

如遇到问题,欢迎经过公众号留言给做者,以便共同探讨。

邮箱:thinkingingis@qq.com

微信公众号:

f19a15a9c9cd6e208a0c7c981ea9326f.png

全部评论 (0)

还没有任何评论哟~