徐汇做网站,微信网页编辑器,新闻发布会策划,做一个电商网站要多少钱系列文章目录
ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改 ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片 ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板 ArcGIS arcpy代码工具——定制属性表字段输出表格 ArcGIS arc…系列文章目录
ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改 ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片 ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板 ArcGIS arcpy代码工具——定制属性表字段输出表格 ArcGIS arcpy代码工具——批量栅格转点文件导出属性表 ArcGIS arcpy代码工具——关于标识码的那些事查找最大标识码、唯一性检查、重排序、空值赋值 文章目录 系列文章目录功能说明1 准备工作2 代码分段(1) 多要素 拆分 过程层(2) 遍历 栅格文件(3) 单要素 裁剪 单栅格 3 完整框架4 后记 功能说明
要素裁剪栅格影像日常工作之一一般情况都是某一个要素范围裁剪年度影像arcgis自带的工具操作如下图 首先输入栅格接着输入裁剪范围即要素图形之后设置输出栅格名称可选是否使用输入要素裁剪几何即按边界裁剪、按要素包围矩形裁剪完成裁剪操作。
如果裁剪范围是多个要素的图层直接使用上面的工具裁切的结果是多个要素范围连在一起的栅格影像并不能像多部件要素那样直接分解炸开。
如果栅格影像是多个年度的栅格影像图需要对每个年度影像裁剪一次。
所以多要素 裁剪 多栅格实现起来就非常繁琐了。
本代码目标为
1 对多个栅格影像裁剪2 实现多个要素范围批量处理3 以要素唯一标识字段栅格影像名作为裁剪后的栅格命名4 可选是否按要素边界裁剪5 操作简便
1 准备工作
1将多个栅格影像放入同一个文件夹内方便批量读取
2准备裁切的要素图层格式为shape层可以有多个要素要求有唯一标识字段如图斑编号、地块名称等方便裁切栅格的命名
注意 要素图层的坐标系统要与栅格影像的坐标系统一致且要素需要坐落在栅格影像范围内这样才能进行要素裁切栅格否则会错误提示裁剪要素超出了栅格范围。
3准备一个文件夹用于保存裁剪后栅格文件。
我准备的基础数据如下 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 代码分段
思路多要素 裁剪 多栅格不能直接实现需要分解步骤分解为 单要素 裁剪 单栅格。 我的思路如下
多要素 拆分为 单要素遍历栅格文件调用 单要素 裁剪 单栅格
我最初的想法是 遍历 多要素图层根据唯一字段值来建立选择集使用当前选择集要素来裁剪栅格。但是以失败告终在对要素集进行属性选择时总是报错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空间参考 关键代码
spatial_reference arcpy.Describe(clip_feature).spatialReference根据属性选择要素插入新建要素图层中InsertCursor() 方法。 可以在遍历 clip_feature时获取属性字段值再根据属性值插入到新建过程图层temp_output_path。
关键代码
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表示匹配所有类型。
关键代码
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 完整框架
代码经过整理可以概况为两个函数
裁剪栅格函数一 , clip_rasters_with_attribute()拆分多要素创建 过程图层函数二copy_features_to_individual_files(在函数二中创建的过程图层然后 调用 函数一实现裁剪栅格操作。
关键代码框架
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软件低版本软件无法读取高版本文件。