ArcGIS arcpy代码工具——批量要素裁剪栅格影像

系列文章目录

ArcGIS arcpy代码工具------批量对MXD文件的页面布局设置修改
ArcGIS arcpy代码工具------数据驱动工具批量导出MXD文档并同步导出图片
ArcGIS arcpy代码工具------将要素属性表字段及要素截图插入word模板
ArcGIS arcpy代码工具------定制属性表字段输出表格
ArcGIS arcpy代码工具------批量栅格转点文件导出属性表
ArcGIS arcpy代码工具------关于标识码的那些事(查找最大标识码、唯一性检查、重排序、空值赋值)


文章目录

  • 系列文章目录
  • 功能说明
  • [1 准备工作](#1 准备工作)
  • [2 代码分段](#2 代码分段)
      • [(1) 多要素 拆分 过程层](#(1) 多要素 拆分 过程层)
      • [(2) 遍历 栅格文件](#(2) 遍历 栅格文件)
      • [(3) 单要素 裁剪 单栅格](#(3) 单要素 裁剪 单栅格)
  • [3 完整框架](#3 完整框架)
  • [4 后记](#4 后记)

功能说明

要素裁剪栅格影像,日常工作之一,一般情况都是某一个要素范围裁剪年度影像,arcgis自带的工具操作如下图:

首先输入栅格,接着输入裁剪范围(即要素图形),之后设置输出栅格名称,可选是否使用输入要素裁剪几何(即按边界裁剪、按要素包围矩形裁剪),完成裁剪操作。

如果裁剪范围是多个要素的图层,直接使用上面的工具,裁切的结果是多个要素范围连在一起的栅格影像,并不能像多部件要素那样直接分解炸开。

如果栅格影像是多个年度的栅格影像图,需要对每个年度影像裁剪一次。

所以,多要素 裁剪 多栅格,实现起来就非常繁琐了。

本代码目标为:

  • 1 对多个栅格影像裁剪
  • 2 实现多个要素范围批量处理
  • 3 以要素唯一标识字段+栅格影像名,作为裁剪后的栅格命名
  • 4 可选是否按要素边界裁剪
  • 5 操作简便

1 准备工作

(1)将多个栅格影像放入同一个文件夹内,方便批量读取;

(2)准备裁切的要素图层,格式为shape层,可以有多个要素,要求有唯一标识字段,如图斑编号、地块名称等,方便裁切栅格的命名;

注意: 要素图层的坐标系统要与栅格影像的坐标系统一致,且要素需要坐落在栅格影像范围内,这样才能进行要素裁切栅格,否则会错误提示:裁剪要素超出了栅格范围

(3)准备一个文件夹用于保存裁剪后栅格文件。

我准备的基础数据如下:

python 复制代码
    raster_path = "D:/mulu/XXXXXX行政区"    # 栅格目录,有2个栅格影像
    clip_feature = "D:/mulu/feature/pc.shp"  # 要素图层,有2个要素 
    field_name = "ZLDWMC"                    # 唯一标识字段 
    output_path = "D:/mulu/ok"               # 保存裁切栅格的目录

我使用的arcgis软件版本为 10.8.2 版本。

2 代码分段

思路:多要素 裁剪 多栅格,不能直接实现,需要分解步骤,分解为 单要素 裁剪 单栅格。

我的思路如下:

  1. 多要素 拆分为 单要素
  2. 遍历栅格文件
  3. 调用 单要素 裁剪 单栅格

最初的想法 是:

遍历 多要素图层,根据唯一字段值来建立选择集,使用当前选择集要素来裁剪栅格。但是以失败告终,在对要素集进行属性选择时,总是报错:The value cannot be a feature 该值不能是要素类。应该是 shape层 clip_feature确实不应该是直接作为一个要素类被SelectLayerByAttribute_management函数处理,而是应该存在于地图文档中作为一个图层。

改变思路:尝试多次后,我放弃上述方案,改变思路,将多要素 拆分为 单要素一个过程图层,用该过程图层 裁剪栅格,最后再删除过程图层。

(1) 多要素 拆分 过程层

如何实现对多要素拆分?

可以曲线实现:新建图层------根据属性选择要素------插入新建过程图层中

这样就可以遍历 多要素图层,通过不同的属性字段值选择插入,来实现生成单要素。

新建要素 CreateFeatureclass_management() 方法,有几个参数:

  • out_path: 输出目录
  • out_name: 输出图层名称
  • geometry_type: 输出要素类型:点 线 面 注记
  • template:模板,即图层的字段参考模板建立
  • spatial_reference:输出图层指定的空间参考,这里应该使用 裁剪要素clip_feature空间参考,保持一致。

获取裁剪要素clip_feature空间参考,
关键代码:

python 复制代码
spatial_reference = arcpy.Describe(clip_feature).spatialReference

根据属性选择要素,插入新建要素图层中,InsertCursor() 方法。

可以在遍历 clip_feature时,获取属性字段值,再根据属性值插入到新建过程图层temp_output_path。

关键代码:

python 复制代码
with arcpy.da.SearchCursor(clip_feature, field_name) as cursor:
	for row in cursor:
		with arcpy.da.InsertCursor(temp_output_path, field_name) as insert_cursor:
			insert_cursor.insertRow(row)

(2) 遍历 栅格文件

先遍历栅格文件,之后在遍历的过程中 进行裁剪栅格操作,不限栅格文件的格式,故 ALL表示匹配所有类型。

关键代码:

python 复制代码
for raster_file in arcpy.ListRasters("*", "ALL"):
	......
	arcpy.Clip_management()
	......

(3) 单要素 裁剪 单栅格

裁剪栅格,使用Clip_management() 方法,有几个参数如下:

  • in_raster: 输入栅格,指定需要裁剪的栅格文件
  • in_template_dataset: 指定用于裁剪的矢量图形文件路径
  • out_raster: 指定裁剪后的栅格文件输出路径
  • nodata_value:指定栅格的无效值处理方式,NONE 为不使用无效值
  • clipping_geometry:指定是否按要素边界裁剪, ClIPPINGGEOMETRY ,使用选定要素类的几何来裁剪数据; NONE,使用最小外接矩形来裁剪数据。
  • maintain_clipping_extent :保持裁剪范围,MAINTAIN_EXTENT ,将保留输入栅格的像元对齐,并相应地调整输出范围; NO_MAINTAIN_EXTENT,将保留输入栅格的像元对齐,并相应地调整输出范围。

clipping_geometry 如果按照要素边界裁剪,即参数值为ClIPPINGGEOMETRY,效果如下图:

如果不按照要素边界裁剪,即参数值为 NONE,效果如下图:

3 完整框架

代码经过整理,可以概况为两个函数:

  1. 裁剪栅格函数一 , clip_rasters_with_attribute()
  2. 拆分多要素,创建 过程图层函数二,copy_features_to_individual_files()
  3. 在函数二中,创建的过程图层,然后 调用 函数一,实现裁剪栅格操作。

关键代码框架:

python 复制代码
def clip_rasters_with_attribute(input_workspace, clip_feature_path, output_folder, identifier_field, trim_by_boundarys):
	......
	for raster_file in arcpy.ListRasters("*", "ALL"):
		arcpy.Clip_management()
		......
		
def copy_features_to_individual_files(raster, input_feature, output_folder, fields_to_keep, trim_by_boundarys):
	......
    with arcpy.da.SearchCursor(input_feature, fields_keep) as cursor:
        for row in cursor:
        ......
		arcpy.CreateFeatureclass_management()
		......
		with arcpy.da.InsertCursor(unique_output_path, fields_keep) as insert_cursor:
			insert_cursor.insertRow(row)
		......
		clip_rasters_with_attribute(raster, unique_output_path, output_folder, fields_to_keep, trim_by_boundarys)
		......
		
if __name__ == "__main__":
	......
	copy_features_to_individual_files(raster_path, clip_feature, output_path, field_name, trim_by_boundary)

我制作了arcgis工具箱工具 高效栅格裁剪工具:指定要素范围批量裁切栅格 ,有需要的可以去下载使用,下图是运行界面:

运行效果如下图:

4 后记

编写代码在pycharm中可以运行,封装设计为arcgis工具需要加载到GIS工作空间中,根据需要选择定制。

关于工具箱有版本的要求,我的工具是在 ArcGIS10.8.2 版本下创建的,经过测试 在10.2.2版本下无法使用,这是GIS软件版本升级造成的,如果 AutoCAD软件,低版本软件无法读取高版本文件。

相关推荐
.生产的驴3 小时前
SpringBoot AOP切入点表达式
spring boot·后端·python
逆水寻舟4 小时前
算法学习记录2
python·学习·算法
B站计算机毕业设计超人4 小时前
计算机毕业设计Python深度学习美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js
大数据·python·深度学习·机器学习·数据分析·课程设计·推荐算法
码农超哥同学4 小时前
Python面试题:请解释 `lambda` 函数是什么,并举一个例子
开发语言·python·面试·编程
sssjjww4 小时前
python输出日志out.log相关问题(缓存机制)
java·python·缓存
Uluoyu4 小时前
python爬虫爬取中国国际招标有限公司
开发语言·爬虫·python
Python私教5 小时前
zdppy+onlyoffice+vue3解决文档加载和文档强制保存时弹出警告的问题
vue.js·python
菜鸟赵大宝5 小时前
【Python】Python中TODO的用法解析
python·pycharm
Narutolxy5 小时前
如何高效管理和迁移Python开发环境:从Conda到纯Python的转换指南
开发语言·python·conda
萌狼蓝天5 小时前
[python]Markdown图片引用格式批处理桌面应用程序
开发语言·python