2026/5/21 15:50:01
网站建设
项目流程
成都专业建站推广公司,中南建设集团招标网站,网站开发学生鉴定表,网站页面跳转怎么做如何快速批量出图是GISer需要解决的问题#xff0c;要实现逐栅格图层或矢量图斑的出图则是师妹最近期末作业遇到的难题。还好#xff0c;Gemini回归#xff0c;通过不断调试解决这个需求。希望能转发给更多的伙伴#xff01;难点1通过现有的Mxd工作空间能够实现逐栅格图层或…如何快速批量出图是GISer需要解决的问题要实现逐栅格图层或矢量图斑的出图则是师妹最近期末作业遇到的难题。还好Gemini回归通过不断调试解决这个需求。希望能转发给更多的伙伴难点1通过现有的Mxd工作空间能够实现逐栅格图层或矢量图斑的输出但是不能保证每个栅格图层或矢量图斑出现在整个输出图幅的正中间。已解决居中且比例尺为动态难点2如何将对应矢量数据与栅格数据同时输出比如在市域尺度上的栅格数据叠加市域尺度的矢量数据作为边界。已解决需要在图层中添加Shp即矢量格式空白填充红色1磅大小里面包含要输出tif的name字段如输出石家庄_Lucc.tif矢量图层中name字段必须也有这个“石家庄” 难点3如何如何动态调整经纬度范围且图名随文件进行变化。已解决经纬度范围也能够动态进行调整唯一遗憾是不能自动调整经纬网的疏密现有状况ArcGIS大多数数据驱动页面工具来实现批量出图出图效果很难满足需要出图模版代码如下可直接在ArcGISPython中运行# -*- coding: utf-8 -*-import arcpyimport osimport sys# 强制环境编码reload(sys)sys.setdefaultencoding(utf-8)# --- 1. 参数配置 ---input_folder rD:\try\trymxd_template_path rD:\try\try.mxdoutput_root rD:\try\results# 图层名称务必与 MXD 中的 TOC 列表名完全一致raster_lyr_name u石家庄_Lucc2000_reclass.tifvector_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, resolutiondpi)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 uMXD 存放在: output_mxd_folderprint except Exception as e:import tracebackprint u运行出错详细信息如下\n traceback.format_exc()if __name__ __main__:batch_process()成果图展示其中第二个的图层不包括tif数据仅输出对应石家庄名称的shp效果更为明显。批量输出矢量数据的代码后续也会更新整体上删除批量遍历栅格数据的过程原工程空间及案例数据获取方式