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

1 任务需求

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

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

  我们希望做到的有两点。首先,我们可以看到前述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=Falsearcpy.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个操作后,均会输出执行结果,方便用户获知程序的执行情况。

  至此,大功告成。

ArcPy自动绘制大量地图并设置地图要素:Python的更多相关文章

  1. ArcGIS API For JavaScript 加载地图,设置地图中心点

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. ArcGIS api for javascript——用第二个服务的范围设置地图范围

    描述 本例展示了如何设置地图的范围为地图其中一个图层的范围.本例有两个图层:ArcGIS Online上的世界地图图层ArcGISTiledMapServiceLayer和堪萨斯州的要素的图层ArcG ...

  3. js调用百度地图API创建地图,搜索位置

    实现代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <met ...

  4. 百度地图api根据地图缩放等级显示不同的marker点,功能二

    功能一里面有marker点后台的代码 根据地图的缩放等级显示不同marker点的坐标JSP代码 <%@ page language="java" contentType=&q ...

  5. 百度地图API自定义地图

    http://api.map.baidu.com/lbsapi/creatmap/index.html http://developer.baidu.com/map/index.php?title=w ...

  6. 网页嵌入百度地图和使用百度地图api自定义地图的详细步骤

    在网页中插入百度地图 如果想在自己的网页上面加入百度地图的话,可以用百度地图的api.具体使用方法如下: 第一步:进入百度创建地图的网站http://api.map.baidu.com/lbsapi/ ...

  7. iOS:实现MKAnnotation协议,在地图上设置大头针,点击显示具体的位置信息

    如何添加大头针(地标): 通过MapView的addAnnotation方法可以添加一个大头针到地图上 通过MapView的addAnnotations方法可以添加多个大头针到地图上 –(void)a ...

  8. ArcGIS for qml -设置地图和视域中心

    源码:https://github.com/sueRimn/ArcGIS-for-qml-demos 作者: 狐狸家的鱼 Github: 八至 版权声明:如需转载请获取授权和联系作者 ArcGIS R ...

  9. Vue3 + Echarts 5 绘制带有立体感流线中国地图,建议收藏

    本文绘制的地图效果图如下: 一.Echarts 使用五部曲 1.下载并引入 echarts Echarts 已更新到了 5.0 版本,安装完记得检查下自己的版本是否是 5.0 . npm instal ...

  10. 百度地图API示例之根据城市名设置地图中心点

    代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" con ...

随机推荐

  1. Mysql数据库未添加索引引发的生产事故

    最近开发的新功能主要是首页的红点提示功能,某个用户登录系统app,然后进入某一个功能模块, 在该功能下面有很多地方可以操作,新功能就是根据用户信息查询当月是否存在新的数据.总共有四五 个地方如果出现增 ...

  2. [win10] 开始-设置 / 右键-显示设置 / 右键个性化 等都不好使了。。 ms-settings:display

    现象: 各种win10自带的都打不开了. 发现: 最近总是断网,重启下就好了,然后点击网络,就一直出不来.后来发现所有win10的窗口都出不来了.控制面板等等. 解决:好消息是最后解决了.坏消息是没有 ...

  3. ThinkPHP 3.2.3

    说明手册 https://www.kancloud.cn/manual/thinkphp/1706 下载地址 https://gitee.com/liu21st/thinkphp32 thinkPHP ...

  4. C#实现软件开机自启动(不需要管理员权限)

    目录 原理简介 使用方法 完整代码 原理简介 本文参考C#/WPF/WinForm/程序实现软件开机自动启动的两种常用方法,将里面中的第一种方法做了封装成AutoStart类,使用时直接两三行代码就可 ...

  5. 投屏Sink端音频底层解码并用OpenSLES进行播放

    一.代码分析 在公司项目中,音频解码及播放是把数据传到Java层进行解码播放的,其实这个步骤没有必要,完全可以在底层进行处理. 通过代码发现其实也做了在底层进行解码,那么为啥不直接使用底层解码播放呢, ...

  6. View之Canvas,Paint,Matrix,RectF等介绍

    目录介绍 1.Paint画笔介绍 1.1 图形绘制 1.2 文本绘制 2.Canvas画布介绍 2.1 设置属性 2.2 画图[重点] 2.3 Canvas对象的获取方式 2.4 Canvas的作用 ...

  7. Jest快速使用指南

    1. 引言 写了几个函数,怎么知道写得对不对呢? 可以通过测试函数,当然开发中测试的意义不只是这个 Jest是常用的JavaScript测试框架 官网为:Jest · Delightful JavaS ...

  8. 记录--详解 XSS(跨站脚本攻击)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言:我们知道同源策略可以隔离各个站点之间的 DOM 交互.页面数据和网络通信,虽然严格的同源策略会带来更多的安全,但是也束缚了 Web. ...

  9. 记录--对于$off,Exclude 和 Extract的一点理解

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.typescript 高阶类型 Exclude 和 Extract Exclude<T, U> TypeScript 2. ...

  10. C++关于栈对象返回的问题

    本次实验环境 环境1:Win10, QT 5.12 环境2:Centos7,g++ 4.8.5 一. 主要结论 可以返回栈上的对象(各平台会有不同的优化),不可以返回栈对象的引用. 二.先看看函数传参 ...