【教你用ArcPy批量输出图片并生成Mxd(零门槛小白版)】

如何快速批量出图是GISer需要解决的问题,要实现逐栅格图层或矢量图斑的出图则是师妹最近期末作业遇到的难题。还好,Gemini回归,通过不断调试解决这个需求。希望能转发给更多的伙伴!

难点1

通过现有的Mxd工作空间能够实现逐栅格图层或矢量图斑的输出,但是不能保证每个栅格图层或矢量图斑出现在整个输出图幅的正中间。

已解决!!!(居中,且比例尺为动态)

难点2

如何将对应矢量数据与栅格数据同时输出,比如,在市域尺度上的栅格数据,叠加市域尺度的矢量数据作为边界。

已解决!!!(需要在图层中添加Shp,即矢量格式,空白填充,红色,1磅大小,里面包含要输出tif的name字段,如输出石家庄_Lucc.tif,矢量图层中name字段必须也有这个“石家庄” )

难点3

如何如何动态调整经纬度范围,且图名随文件进行变化。

已解决!!!经纬度范围也能够动态进行调整(唯一遗憾是不能自动调整经纬网的疏密)

现有状况,ArcGIS大多数数据驱动页面工具来实现批量出图,出图效果很难满足需要

出图模版

代码如下

(可直接在ArcGIS,Python中运行)

# -*- coding: utf-8 -*-import arcpyimport osimport sys# 强制环境编码reload(sys)sys.setdefaultencoding('utf-8')# --- 1. 参数配置 ---input_folder = r"D:\try\try"mxd_template_path = r"D:\try\try.mxd"output_root = r"D:\try\results"# 图层名称(务必与 MXD 中的 TOC 列表名完全一致)raster_lyr_name = u"石家庄_Lucc2000_reclass.tif"vector_lyr_name = u"京津冀_市级"match_field = "name"# 样式设置FONT_SIZE = 20LEFT_SHIFT = 2.12 # 20磅字偏左3个字的距离Y_OFFSET_FROM_TOP = 1.5 # 距离顶部的间距dpi = 300# --- 2. 文件夹初始化 ---output_jpg_folder = os.path.join(output_root, "JPG_Files")output_mxd_folder = os.path.join(output_root, "MXD_Files")for folder in [output_jpg_folder, output_mxd_folder]:if not os.path.exists(folder):os.makedirs(folder)def batch_process():try:# 获取所有 TIF 文件列表arcpy.env.workspace = input_folder# 同时匹配大写和小写后缀rasters = arcpy.ListRasters("*", "TIF") + arcpy.ListRasters("*", "tif")rasters = list(set(rasters)) # 去重total_count = len(rasters)# --- 调试信息:看看究竟抓到了几个文件 ---print "--------------------------------------------------"print u"正在扫描文件夹: {}".format(input_folder)print u"找到 TIF 文件数量: {}".format(total_count)if total_count > 0:for r in rasters: print " -> " + rprint "--------------------------------------------------"if total_count == 0:print u"错误:文件夹里没找到 TIF 文件,请检查路径或后缀名!"return# --- 开始循环处理 ---for index, raster_name in enumerate(rasters):# 重要:每次循环都重新打开一次模板,保证图层对象是新鲜的mxd = arcpy.mapping.MapDocument(mxd_template_path)df = arcpy.mapping.ListDataFrames(mxd)[0]# 1. 解析文件名if "_" in raster_name:city_key = raster_name.split("_")[0]else:city_key = os.path.splitext(raster_name)[0]raster_base_name = os.path.splitext(raster_name)[0]# 2. 获取图层对象# 放在循环内获取,防止对象失效raster_layer = arcpy.mapping.ListLayers(mxd, raster_lyr_name, df)[0]vector_layer = arcpy.mapping.ListLayers(mxd, vector_lyr_name, df)[0]# 3. 切换数据源raster_layer.replaceDataSource(input_folder, "RASTER_WORKSPACE", raster_base_name, True)# 4. 矢量匹配与缩放query = "{} = '{}'".format(match_field, city_key)vector_layer.definitionQuery = queryarcpy.SelectLayerByAttribute_management(vector_layer, "NEW_SELECTION", query)if int(arcpy.GetCount_management(vector_layer).getOutput(0)) > 0:df.extent = vector_layer.getSelectedExtent()df.scale = df.scale * 1.15else:df.extent = raster_layer.getExtent()arcpy.SelectLayerByAttribute_management(vector_layer, "CLEAR_SELECTION")# 5. 更新标题并精确定位 (保护底部文字)all_texts = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT")# 再次寻找最高文本作为标题target_elm = all_texts[0]max_y = target_elm.elementPositionYfor elm in all_texts:if elm.elementPositionY > max_y:max_y = elm.elementPositionYtarget_elm = elm# 计算坐标df_center_x = df.elementPositionX + (df.elementWidth / 2.0)final_title_x = df_center_x - LEFT_SHIFTdf_top_y = df.elementPositionY + df.elementHeightfinal_title_y = df_top_y - Y_OFFSET_FROM_TOPtarget_elm.text = city_key + u"土地利用分布图"target_elm.fontSize = FONT_SIZEtarget_elm.elementPositionX = final_title_xtarget_elm.elementPositionY = final_title_y# 6. 执行导出arcpy.RefreshActiveView()out_jpg = os.path.join(output_jpg_folder, raster_base_name + ".jpg")arcpy.mapping.ExportToJPEG(mxd, out_jpg, resolution=dpi)out_mxd = os.path.join(output_mxd_folder, raster_base_name + ".mxd")mxd.saveACopy(out_mxd)print u"[{}/{}] 成功生成: {}".format(index + 1, total_count, raster_base_name)# 释放当前 MXD 对象,为下一个循环腾出内存del mxdprint "=================================================="print u"全部完成!JPG 存放在: " + output_jpg_folderprint u"MXD 存放在: " + output_mxd_folderprint "=================================================="except Exception as e:import tracebackprint u"运行出错,详细信息如下:\n" + traceback.format_exc()if __name__ == "__main__":batch_process()

成果图展示

其中第二个的图层不包括tif数据仅输出对应石家庄名称的shp,效果更为明显。(批量输出矢量数据的代码后续也会更新,整体上删除批量遍历栅格数据的过程)

原工程空间及案例数据获取方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1132099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数智孪生,金流·物流全透视:构建某银行制造业贷后风控新范式—— 基于领码 SPARK 融合平台的技术解决方案

摘要 本报告旨在为某银行(指贵州银行、渤海银行等合作银行)设计一套针对制造企业的贷前、贷后一体化风控管理系统。传统信贷风控高度依赖静态财报和抵押物,信息不对称问题显著,风险识别滞后。本方案以“领码 SPARK 融合平台”为数…

四川西昌电器门店:30年本地老店,5大优势让你买电器不踩坑!

【四川西昌京东家电】哪家好:专业深度测评开篇:定下基调随着西昌市民对家电品质与服务需求的提升,选择一家靠谱的家电门店成为关键。本次测评聚焦四川西昌家电市场,旨在通过客观数据与真实体验,为消费者提供权威选购参…

springboot事务触发滚动与不滚蛋

事务触发滚动与不滚蛋代码:MyBatisConfig 类package org.example.testproduct;import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.context.annota…

​ ⛳️赠与读者[特殊字符]1 概述基于城市场景下无人机三维路径规划的导航变量的多目标粒子群优化算法(NMOPSO)研究摘要随着无人机应用场景的复杂化,城市场景下的三维路径规划需同时优化

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Python 内置函数:那些你见过但未必真正了解的“老朋友“

一、bin():数字的"二进制身份证" 基本用法: # 将整数转换为二进制字符串 print(bin(10)) # 0b1010 print(bin(255)) # 0b11111111实际应用场景: # 1. 权限系统:用二进制位表示权限 READ_PERMISSION 0b001 # 1 WRIT…

鸿蒙PC上Qt原生应用开发:从零搭建开发环境到部署实战,附HarmonyOS SDK配置与避坑指南(C++实现)

鸿蒙PC上Qt原生应用开发:从零搭建开发环境到部署实战,附HarmonyOS SDK配置与避坑指南(C实现)摘要:本文记录了我在鸿蒙PC平台上开发Qt原生应用的完整实战过程。通过两周的深度适配,成功将Qt6.7应用迁移到Ope…

鸿蒙PC Qt开发环境配置全攻略:从零搭建到第一个原生应用实战

鸿蒙PC Qt开发环境配置全攻略:从零搭建到第一个原生应用实战摘要:本文详细记录在鸿蒙PC环境下搭建Qt开发环境的完整过程,从开发机选择到环境配置,再到首个原生应用的开发与部署实战。内容涵盖鸿蒙PC特性解析、Qt框架适配要点、分布…

基于Java+SpringBoot+SSM合同信息管理系统(源码+LW+调试文档+讲解等)/合同管理信息系统/合同信息管理平台/合同管理系统/信息管理系统/合同管理软件/合同资料管理系统

博主介绍 💗博主介绍:✌全栈领域优质创作者,专注于Java、小程序、Python技术领域和计算机毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2025-2026年最新1000个热门Java毕业设计选题…

鸿蒙PC开发指南:从零配置Qt环境到实战部署完整流程

鸿蒙PC开发指南:从零配置Qt环境到实战部署完整流程摘要:本文将以第一人称视角记录在开源鸿蒙PC平台上从零搭建Qt开发环境到实战部署的全过程。你将获得:鸿蒙PC开发环境配置的保姆级教程、Qt应用迁移的核心适配方案、解决跨平台兼容性问题的实…

鸿蒙PC版Electron开发指南:手把手教你搭建环境并打包跨端应用

鸿蒙PC版Electron开发指南:手把手教你搭建环境并打包跨端应用 摘要:本文为开发者提供鸿蒙PC平台上的Electron应用开发完整解决方案。通过实战案例,你将掌握Electron应用在OpenHarmony PC环境的适配要点、环境搭建全流程、API兼容性处理技巧&a…

鸿蒙PC上Electron原生应用开发:从零到部署的实战避坑指南

鸿蒙PC上Electron原生应用开发:从零到部署的实战避坑指南摘要:本文记录了笔者将Electron应用迁移至开源鸿蒙PC平台的全过程。通过真实项目案例,详解Electron与鸿蒙Native API的融合方案,涵盖环境搭建、窗口管理、剪贴板适配等核心…

从零到一:基于Qt on HarmonyOS的鸿蒙PC原生应用开发实战与性能优化指南

从零到一:基于Qt on HarmonyOS的鸿蒙PC原生应用开发实战与性能优化指南摘要:本文以真实项目迁移案例为背景,详细拆解Qt应用在开源鸿蒙PC平台的完整开发流程。你将获得:1)鸿蒙PC开发环境搭建指南(含DevEco S…

《实战指南:Electron框架鸿蒙PC化,跨端迁移的完整配置与核心代码解析》

实战指南:Electron框架鸿蒙PC化,跨端迁移的完整配置与核心代码解析 摘要:本文记录了将Electron应用迁移到鸿蒙PC平台的全过程,包含环境配置、架构适配、核心模块重构等关键技术细节。通过5个实战代码段和3个架构图,详细…

鸿蒙PC原生应用开发避坑指南:Qt 6.6与Electron 28兼容性问题全解析

鸿蒙PC原生应用开发避坑指南:Qt 6.6与Electron 28兼容性问题全解析 摘要:本文基于作者在鸿蒙PC平台的实际迁移经验,深度剖析Qt 6.6与Electron 28框架在鸿蒙PC环境下的兼容性问题。通过真实案例展示OpenGL渲染异常、Node.js模块加载失败等典型…

1. 数据存储结构

一、核心原理 1. 数据存储结构 // 每个 Thread 对象内部都有一个 ThreadLocalMap ThreadLocal.ThreadLocalMap threadLocals null; // ThreadLocalMap 内部使用 Entry 数组&#xff0c;Entry 继承自 WeakReference<ThreadLocal<?>> static class Entry extends…

实时数字信号处理——AM发射器

AM&#xff08;DSB-LC&#xff09;调制过程1. 引入与方法概述&#xff08;原文要点整理与解释&#xff09;原文&#xff08;要点&#xff09;&#xff1a;有几种方法可以产生 AM&#xff08;DSB-LC&#xff09;。一种特别容易解释的方法使用两个步骤&#xff1a; ① 通过添加 D…

在日常里也要制造积极情绪

有两种工程师。一种是技术很强,但总是自己闷头干活,遇到问题也不爱说。另一种技术可能差不多,但特别爱交流,碰到点小进展就要跟旁边的人分享一下。猜猜哪种人最后做得更好?debug是个特别磨人的活。有时候一个timing violation能让人盯着屏幕看一整天,脑子都要炸了。这时候,如果…

前后端分离海滨体育馆管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

&#x1f4a1;实话实说&#xff1a; CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价。我就是个在校研究生&#xff0c;兼职赚点饭钱贴补生活费&…

墙绘产品展示交易平台信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价。我就是个在校研究生&#xff0c;兼职赚点饭钱贴补生活费&…

5. enum(枚举)关键字在C/C++中的作用

enum&#xff08;枚举&#xff09;关键字本质是用来定义一组有名字的整数常量&#xff0c;替代直接使用魔法数字&#xff08;比如 0、1、2&#xff09;&#xff0c;让代码更易读、易维护。 1. 什么是enum&#xff1f;&#xff08;核心概念&#xff09; enum&#xff08;枚举类型…