php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 498|回复: 0

基于python的arcgis 批量动态出图

[复制链接]

3146

主题

3156

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7966
贡献
0
注册时间
2021-4-14
最后登录
2024-11-23
在线时间
763 小时
QQ
发表于 2022-7-6 23:05:00 | 显示全部楼层 |阅读模式
[mw_shl_code=python,true]#coding:utf-8
#基于已有mxd模板,遍历gdb文件里图层,替换第一个图层数据的数据源,修改出图的标题,并导成图片。
#2020年9月1日
import arcpy
import os
import xlwt #操作Excel
import time  # 引入time模块
reload(sys)
sys.setdefaultencoding("utf-8")

res = 100  #出图的像素300dpi
mapfile="D:/wjly.mxd" #mxd文件地址
FILEGDB_path="D:/01_刘艳民办公资料/01_水利/15_长江生态环境保护修复智慧决策平台(一期)/03_制图工具包/PLZTCOD20200831/test.gdb"
FILEGDB_pathQY="D:/01_刘艳民办公资料/01_水利/15_长江生态环境保护修复智慧决策平台(一期)/05_长江流域流域确定/长江流域制图/区域图层.gdb"
workspaceGDB_pathQY= r"D:\01_刘艳民办公资料\01_水利\15_长江生态环境保护修复智慧决策平台(一期)\05_长江流域流域确定\长江流域制图\区域图层.gdb"
workspaceGDB_path= r"D:\01_刘艳民办公资料\01_水利\15_长江生态环境保护修复智慧决策平台(一期)\03_制图工具包\PLZTCOD20200831\test.gdb"
RowNum=1#excel行从1开始;excel行和列是从0开始

mapdoc = arcpy.mapping.MapDocument (mapfile)#中文的mxd文件不知道为什么报错
dflist = arcpy.mapping.ListDataFrames (mapdoc) #默认dataFrames
lyr = arcpy.mapping.ListLayers (mapdoc, "", dflist[0])[0] #第一个图层
lyrQY = arcpy.mapping.ListLayers (mapdoc, "", dflist[0])[3] #第四个图层,流域范围
#-------------建立Excel--------------
ExcelFile = xlwt.Workbook(encoding = 'utf-8') #;设置这个不会出现保存时候报错
sheet1 = ExcelFile.add_sheet(u'sheet1',cell_overwrite_ok=True)
sheet1.write(0,0,'序号')
sheet1.write(0,1,'图层名称')
sheet1.write(0,2,'图片名称')
sheet1.write(0,3,'生成时间')
#-------------建立Excel--end--------------

arcpy.env.workspace = workspaceGDB_pathQY
datasetsQY = arcpy.ListDatasets(feature_type='feature')
datasetsQY = [''] + datasetsQY if datasetsQY is not None else []
for dsQY in datasetsQY:
    for fcQY in arcpy.ListFeatureClasses(feature_dataset=dsQY):
        path = os.path.join(arcpy.env.workspace, dsQY, fcQY)
        lyrNameQY=os.path.join(fcQY)
        print(lyrNameQY)
        
        lyrQY.replaceDataSource(FILEGDB_pathQY, "FILEGDB_WORKSPACE", lyrNameQY)#替换区域范围图层
        dflist[0].panToExtent(lyrQY.getExtent()) #获得新图层区域范围,定位到区域位置
        sourceLayer = arcpy.mapping.Layer(r"D:\乌江水系.lyr")#需要在arcgis中把图层及样式导出为lyr
        arcpy.mapping.UpdateLayer(dflist[0],lyrQY,sourceLayer,True)#调用UpdateLayer()函数来更新符号系统。
        
        arcpy.env.workspace = workspaceGDB_path
        datasets = arcpy.ListDatasets(feature_type='feature')
        datasets = [''] + datasets if datasets is not None else []
        for ds in datasets:
            for fc in arcpy.ListFeatureClasses(feature_dataset=ds):
                path = os.path.join(arcpy.env.workspace, ds, fc)
                #print(path)
                lyrName=os.path.join(fc)
                print(lyrName)
                lyr.replaceDataSource(FILEGDB_path, "FILEGDB_WORKSPACE", lyrName)#更换数据
                title = arcpy.mapping.ListLayoutElements(mapdoc, "TEXT_ELEMENT", "Maptitle")[0] #修改地图的标题,地图标题的element Name填写为Maptitle
                title.text=lyrNameQY+lyrName#按照图层的名称修改生成专题图图片的名称
                arcpy.RefreshActiveView()
                arcpy.RefreshTOC()
                arcpy.mapping.ExportToJPEG(mapdoc,"D://MapExpoort20200901//" +lyrNameQY+lyrName+".jpg",resolution = res) #先建立一个文件夹,否则要报错;
                sheet1.write(RowNum,0,RowNum)#写第一列序号
                sheet1.write(RowNum,1,lyrNameQY+lyrName)#写第二列图层名称
                sheet1.write(RowNum,2,lyrName+".jpg")#写第三列图片名称
                sheet1.write(RowNum,3,time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))#写第三列图片名称
                RowNum=RowNum+1
                #print lyr.name
ExcelFile.save('D://MapExpoort20200901//test.xls')
del mapdoc                                                                                                               

[/mw_shl_code]

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-23 20:31 , Processed in 0.264687 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表