依据矢量图层批量将栅格图像切分为多个:Python ArcPy
本文介绍基于Python中ArcPy
模块,基于具有多个面要素的要素类,批量分割大量栅格图像的方法。
首先明确一下我们的需求。现在需要基于一个面要素类,对一个栅格遥感影像加以分割;如下图所示。这个面要素类中有3
个部分,我们希望将背景的这个遥感影像也依据这3
个要素的划分方式,进行切割,从而得到3
个小区域对应的栅格数据。同时,我们有很多张同一空间范围的栅格遥感影像,都希望通过这一方式对其加以分割,即需要批量进行上述操作。
其中,如果大家想基于ArcMap软件,不用代码从而实现这一操作,可以基于文章ArcMap执行Split Raster分割栅格后没有结果出现怎么办?(https://www.jianshu.com/p/68c09a56cb92)中提到的分割栅格(Split Raster)工具加以实现。本文就介绍基于代码来实现这一操作的具体步骤。
本文需要用到的代码如下。
# -*- coding: utf-8 -*-
"""
Created on Tue Dec 27 17:19:07 2022
@author: fkxxgis
"""
import arcpy
tif_file_path = r"E:\02_Project\01_Chlorophyll\ClimateZone\Original"
result_file_path = r"E:\02_Project\01_Chlorophyll\ClimateZone\Split"
shp_file_name = r"E:\02_Project\01_Chlorophyll\ClimateZone\SCClimateP.shp"
arcpy.env.workspace = tif_file_path
arcpy.env.parallelProcessingFactor = 0
tif_file_list = arcpy.ListRasters("*", "tif")
for tif_file in tif_file_list:
arcpy.SplitRaster_management(tif_file,
result_file_path,
tif_file.split(".tif")[0],
"POLYGON_FEATURES",
"TIFF",
"BILINEAR",
"#",
"#",
"#",
"#",
"#",
"#",
shp_file_name,
"#",
"#",
"0")
其中,tif_file_path
是保存有我们待分割的栅格图像的路径,result_file_path
是分割后各个结果图像的保存路径,shp_file_name
是分割栅格图像所用矢量面要素的文件路径与名称。
代码整体思路也很简单:首先,我们基于arcpy.ListRasters()
函数,获取tif_file_path
路径下原有的全部.tif
格式的图像文件,并以列表的形式存放于tif_file_list
中;随后,逐一取出tif_file_list
列表中的栅格文件,进行分割处理。
在这里,我们的分割操作是基于arcpy.SplitRaster_management()
函数来实现的。这一函数有很多参数,具体各个参数的含义大家直接参考ArcMap软件软件官网即可,这里就仅对本文中需要用到的参数加以介绍。其中,前两个参数就分别是我们待处理数据和结果数据的保存路径,第三个参数是每一个大的栅格图像(也就是待分割的图像)在被分为多个小图像后,每一个小图像的命名前缀。在这里,我们通过.split()
函数,直接将原有每一个大的栅格图像的名称作为小图像的命名前缀;后面得到多个小图像结果后,程序会自动在这个命名前缀的后面加上对应的数字编号,从而区分每一个小图像。
接下来,第四个参数"POLYGON_FEATURES"
表示我们将通过矢量要素来确定图像分割的范围,第五个参数"TIFF"
表明我们结果图像的格式为.tif
文件,第六个参数"BILINEAR"
表明我们将用双线性插值法来实现切割后图像的重采样;关于不同重采样方法的选择,大家可以参考文章ArcGIS进行栅格重采样并对重采样方法加以合理选择(https://www.jianshu.com/p/8c08bdf466b5)。此外,接下来的几个"#"
表示我们对这些参数暂时不配置;再靠后一个参数就是我们分割栅格图像所用的矢量要素数据。
随后,依然是两个"#"
,表示我们对这些参数暂时不配置;最后一个参数"0"
,表明在大的栅格图像中所有值为0
的像元,在分割后都将作为无效值(NoData值)的像元。
此外,还有一点需要注意的是,上述代码中我们通过arcpy.env.parallelProcessingFactor
参数,将“Parallel Processing”选项设置为0
;如果我们不这么设置的话,大概率这段代码是无法成功运行的;具体为什么要这么设置,大家可以参考文章ArcMap执行Split Raster分割栅格后没有结果出现怎么办?(https://www.jianshu.com/p/68c09a56cb92),这里就不再赘述。
运行上述代码,我们即可在结果保存路径result_file_path
中看到各个栅格图像被分割后所得到的各个结果。
至此,大功告成。