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 小时前
Kotlin函数由易到难
开发语言·python·kotlin
魔道不误砍柴功4 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
_.Switch4 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
测开小菜鸟5 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
萧鼎7 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸7 小时前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农7 小时前
Python 继承、多态、封装、抽象
开发语言·python
Python大数据分析@7 小时前
python操作CSV和excel,如何来做?
开发语言·python·excel
黑叶白树7 小时前
简单的签到程序 python笔记
笔记·python
Shy9604187 小时前
Bert完形填空
python·深度学习·bert