码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • ArcPy自动绘制大量地图并设置地图要素:Python


    合集 - GIS空间分析(55)
    1.地统计学的基本概念及公式详解2023-04-242.单窗算法的地表温度反演:谷歌地球引擎GEE代码2023-04-263.SPSS计算极值、平均值、中位数、方差、偏度、峰度、变异系数2023-05-084.Python忽略NoData计算多张遥感影像的像元平均值:whitebox库2023-05-155.ArcGIS如何自动获得随机采样点?2023-05-176.ENVI手动地理配准栅格图像的方法2023-05-247.ArcMap手动新建矢量要素的方式2023-05-268.ENVI指定像元数量(行数与列数)裁剪栅格图像2023-05-309.Python批量填补遥感影像的无效值NoData2023-06-0110.ArcPy批量对大量遥感影像相减做差2023-06-2511.ArcMap镶嵌数据集的创建、数据导入与数据范围修改方法2023-07-0412.ENVI实现QUAC、简化黑暗像元、FLAASH方法的遥感影像大气校正2023-07-1013.ENVI大气校正方法反演Landsat 7地表温度2023-07-1714.ENVI、ERDAS计算Landsat 7地表温度:单窗算法实现2023-07-3015.全球都有哪些高光谱遥感卫星?2023-08-1916.ArcMap时间滑块绘制遥感影像的动态变化过程2023-08-2017.ENVI+ERDAS实现Hyperion叶绿素含量反演:经验比值法、一阶微分法2023-08-2618.ArcMap用一个面要素擦除另一个面要素的部分2023-08-2719.全局多项式(趋势面)与IDW逆距离加权插值:MATLAB代码2023-09-0220.ArcMap中矢量数据修改标注Label的方法2023-09-0321.回归克里格、普通克里格插值在ArcGIS中的实现2023-09-1022.GIS中的ROI文件可否由.xml格式转为.roi格式?2023-09-1623.地理探测器Geodetector下载、使用、结果分析方法2023-09-1724.ArcGIS将遥感影像的0值设置为NoData2023-09-2225.基于AvaSpe 2048测定物体的光谱曲线2023-09-2426.ArcGIS地图投影与坐标系转换的方法2023-09-2827.下载、安装CAN-EYE植被参数工具2023-10-0728.如何用CAN-EYE获取植被参数数据?2023-10-2229.ArcMap属性表出现乱码情况的解决2023-10-2730.物体三维模型的构建:3DSOM软件实现侧影轮廓方法2023-11-1231.空间三维模型的编码结构光方法实现:基于EinScan-S软件2023-11-2532.MATLAB时间序列数据重建与平滑:HANTS滤波2023-12-0133.无人机影像的空间三维建模:Pix4Dmapper运动结构恢复法2023-12-0934.Pix4Dmapper空间三维模型的应用实例:GIS选址分析2023-12-2335.用ArcGIS模型构建器生成、导出Python转换空间坐标系的代码01-1836.安装MicroStation软件、Terrasolid插件的方法01-2237.在Visual Studio中部署GDAL库的C++版本(包括SQLite、PROJ等依赖)02-0138.C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组02-0339.创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现02-0440.C++ GDAL用CreateCopy()新建栅格并修改波段的个数02-2641.基于Python GDAL为长时间序列遥感图像绘制时相变化曲线图02-2842.Python实现snap:对齐多张遥感影像的空间范围03-0443.Landsat 7的热红外波段有2个该如何选择?03-1044.遥感图像镶嵌拼接:ENVI的Pixel Based Mosaicking工具操作方法03-1145.ENVI为遥感影像设置空间坐标系的方法03-1346.基于R语言的raster包读取遥感影像03-1547.地理探测器R语言实现:geodetector03-1848.Python基于Excel生成矢量图层及属性表信息:ArcPy03-2049.ArcMap的mxd文件没有数据、显示感叹号怎么办?03-2250.基于R语言的GD库实现地理探测器并自动将连续变量转为类别变量03-2551.Linux电脑如何下载QGIS?03-2952.Python基于Excel数据加以反距离加权空间插值并掩膜图层04-1053.ArcMap分别求取矢量要素各区域的面积04-1554.论文研究区域图的制作方法:ArcGIS04-17
    55.ArcPy自动绘制大量地图并设置地图要素:Python04-22
    收起

      本文介绍基于Python语言中ArcPy模块,实现ArcMap自动批量出图,并对地图要素进行自定义批量设置的方法。

    1 任务需求

      首先,我们来明确一下本文所需实现的需求。

      现有通过Python基于Excel数据加以反距离加权空间插值并掩膜图层所绘制的北京市在2019年05月18日00时至23时(其中不含19时)等23个逐小时PM2.5浓度插值数据栅格图层,每小时一个图层,因此共23个图层;以当日10时为例,该时刻的栅格图层如下所示。

    image

      我们希望做到的有两点。首先,我们可以看到前述23个栅格图层的符号系统都为灰度拉伸的状态,因此希望按照一个给定的模板图层文件m.lyr,调整这23个栅格图层的样式(即拉伸的颜色),并分别以.lyr格式导出这23个栅格图层文件;且希望导出图层文件的文件名包含具体的时刻。如下图所示。

      第二点希望做到的是,将每一个栅格图层都设置为彩色后,添加图名、指北针、比例尺等地图要素,并导出为图片格式。以当日10时、20时为例,我们所希望导出的图片如下所示。

      且希望导出图片的文件名同样包含具体的时刻。

    2 代码实现

      了解了需求后,我们就基于Python中的ArcPy模块,进行详细代码的撰写与介绍。

      这里需要说明的是:在编写代码的时候,为了方便执行,所以希望代码后期可以在ArcMap中直接通过工具箱运行,即用到Python程序脚本新建工具箱与自定义工具的方法;因此,代码中对于一些需要初始定义的变量,都用到了arcpy.GetParameterAsText()函数。大家如果只是希望在IDLE中运行代码,那么直接对这些变量进行具体赋值即可。关于Python程序脚本新建工具箱与自定义工具,大家可以查看ArcMap将Python写的代码转为工具箱与自定义工具详细了解。

      上面提到需要初始定义的变量一共有七个,其中arcpy.env.workspace参数表示当前工作空间;mxd_file参数表示后期批量出图时,提供地图要素参考信息的地图文档.mxd文件;lyr_file参数表示后期批量出图时,提供地图着色参考信息的模板图层.lyr文件;mask_path参数表示前述插值栅格图层所保存的路径;new_lyr_path参数表示插值栅格图层经过样式修改,并转为图层文件后的保存路径;png_path参数表示最终出图结果的保存路径;dpi参数表示最终出图结果的图像分辨率,单位为DPI(Dots per Inch)。

      其中,上述第二个参数,即提供地图要素参考信息的地图文档.mxd文件需要由用户自行创建,并在其中配置好图名、图例、指北针、比例尺等地图要素的名称、文本、位置、样式等信息。或许这么说有点不清楚,大家看下面这幅图就能比较容易明白了。

      没错,这个提供地图要素参考信息的地图文档.mxd文件其实就是一个在Layout View中设置好各种地图要素位置、大小、字体、颜色等的地图文档文件;它就相当于是一个模板,这个模板里各种地图要素长什么样子,后期我们批量出图结果图的地图要素就长什么样子。

      此外,不知道为什么,在我的ArcMap中似乎偶尔会出现无法有效执行lyr.visible=False或arcpy.mapping.RemoveLayer(data_frame,new_lyr[0])等代码情况;因此若直接在上述地图文档文件中配置图例,最终出图结果有时会出现多个图例堆叠,不能保证出图结果百分之百完美。基于此,选择将图例格式元素(elm.name==”title”)转换为由一个图片格式元素(elm.name==”pic”)与两个文本格式元素(elm.name==”text”)组成的新元素,从而实现最终结果图中图例的绘制。

      如果大家还是不明白,可以直接下载我的这一.mxd文件;下载链接:https://pan.baidu.com/s/18l0l-kjPfdjV1UYcpkKg-w?pwd=fkxx 。

      具体代码如下。

    # -*- coding: utf-8 -*-
    # @author: ChuTianjia
    
    import arcpy
    
    arcpy.env.workspace=arcpy.GetParameterAsText(0)
    mxd_file=arcpy.GetParameterAsText(1)
    lyr_file=arcpy.GetParameterAsText(2)
    mask_path=arcpy.GetParameterAsText(3)
    new_lyr_path=arcpy.GetParameterAsText(4)
    png_path=arcpy.GetParameterAsText(5)
    dpi=arcpy.GetParameterAsText(6)
    
    my_mxd=arcpy.mapping.MapDocument(mxd_file)
    data_frame=arcpy.mapping.ListDataFrames(my_mxd)[0]
    my_lyr=arcpy.mapping.Layer(lyr_file)
    layer_list=arcpy.mapping.ListLayers(my_mxd)
    
    my_mxd.activeView="PAGE_LAYOUT"
    
    tif_file_list=arcpy.ListRasters("BJ_hour_*","TIF")
    for raster in tif_file_list:
        # Import the mask layer into ArcMap
        raster_file=mask_path+"\\"+raster
        arcpy.MakeRasterLayer_management(raster_file,raster.strip(".tif"))
    
        # Modify the style of the mask layer according to the reference layer
        arcpy.ApplySymbologyFromLayer_management(raster.strip(".tif"),lyr_file)
        new_lyr_file=new_lyr_path+"\\"+raster.strip(".tif")+".lyr"
    
        # Save and import the mask layer after modifying the style
        arcpy.SaveToLayerFile_management(raster.strip(".tif"),new_lyr_file)
        arcpy.AddMessage("{0} has been saved.".format(raster.strip(".tif")+".lyr"))
        
        new_lyr=arcpy.mapping.Layer(new_lyr_file)
        arcpy.mapping.AddLayer(data_frame,new_lyr,"TOP")
    
        # Modify the image name
        for element in arcpy.mapping.ListLayoutElements(my_mxd,"TEXT_ELEMENT"):
            if element.name=="title":
                element.text="Interpolation Map of PM2.5 Concentration\n at {0}:00 on May 18, 2019, Beijing".format(raster[8:10])
    
        new_lyr.visible=True
    
        # Modify the legend (see the program usage document for details)
        max_pixel=arcpy.GetRasterProperties_management(new_lyr,"MAXIMUM").getOutput(0)[0:5]
        min_pixel=arcpy.GetRasterProperties_management(new_lyr,"MINIMUM").getOutput(0)[0:5]
        for element in arcpy.mapping.ListLayoutElements(my_mxd,"TEXT_ELEMENT"):
            if element.name=="MAX":
                element.text="{:0>5.2f}".format(float(max_pixel))
            if element.name=="MIN":
                element.text="{:0>5.2f}".format(float(min_pixel))
    
        # Export to picture format
        png_file=png_path+"\\"+raster.strip(".tif")+".png"
        arcpy.mapping.ExportToPNG(my_mxd,png_file,resolution=dpi)
        arcpy.AddMessage("{0} has been saved.".format(raster.strip(".tif")+".png"))
        
        new_lyr.visible=False
        arcpy.mapping.RemoveLayer(data_frame,new_lyr[0])
    

    3 运行结果

      执行上述代码,具体得到的结果其实在本文开头也就和大家讲了,这里就不再赘述。

      不过还有一点,就是如果大家是在ArcMap中直接通过工具箱运行上述代码,则可以看到代码运行过程中出现的提示——程序运行过程中,对每一个时刻的PM2.5浓度数据分别完成图层格式保存与图片格式保存等2个操作后,均会输出执行结果,方便用户获知程序的执行情况。

      至此,大功告成。

  • 相关阅读:
    SpringBoot配置文件
    js---类
    三、Eclipse 修改字符集
    在中国 ToB 市场,选一个对的供应商太难了
    SQL-去除最大值与最小值求均值的问题
    031:vue子组件向父组件传递多个参数,父组件2种解析方法
    Faster R-CNN---学习笔记
    vr模拟电力场景安全应急培训,电力安全教育培训新方法
    Java并发 | 01.进程与线程概述
    【微信小程序】如何上传uniApp开发的微信小程序?
  • 原文地址:https://www.cnblogs.com/fkxxgis/p/18150594
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号