ArcPy自动绘制大量地图并设置地图要素:Python

这篇具有很好参考价值的文章主要介绍了ArcPy自动绘制大量地图并设置地图要素:Python。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1 任务需求

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

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

ArcPy自动绘制大量地图并设置地图要素:Python

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

ArcPy自动绘制大量地图并设置地图要素:Python

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

ArcPy自动绘制大量地图并设置地图要素:Python

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

ArcPy自动绘制大量地图并设置地图要素:Python

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文件需要由用户自行创建,并在其中配置好图名、图例、指北针、比例尺等地图要素的名称、文本、位置、样式等信息。或许这么说有点不清楚,大家看下面这幅图就能比较容易明白了。

ArcPy自动绘制大量地图并设置地图要素:Python

  没错,这个提供地图要素参考信息的地图文档.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

  至此,大功告成。文章来源地址https://www.toymoban.com/news/detail-855348.html

到了这里,关于ArcPy自动绘制大量地图并设置地图要素:Python的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【QT--使用百度地图API显示地图并绘制路线】

    先吐槽一下下,本身qt学的就不咋滴,谁想到第一件事就是让写一个上位机工具,根据CAN总线传来的位置信息,在地图上去绘制路线,并获取当前路段的限速信息等。当听到这个需求的时候,第一时间是有点懵逼的。自己原本是没接触过这方面的知识,而且qt学的也特别的垃圾

    2024年01月24日
    浏览(28)
  • Python 地图篇 - 使用pyecharts绘制世界地图、中国地图、省级地图、市级地图实例详解

    [ 系列文章篇 ] 2022 见证中国崛起从 Python 绘制中国地图开始:使用 pyecharts 最新版本绘制中国地图实例详解,个性化地图定制及常用参数解析 [ 专栏推荐 ] Python 短视频自动化发布,包含抖音、快手、 bilibili 、小红书、微视、好看视频、西瓜视频、视频号等 10 余种平台 先给大

    2024年02月03日
    浏览(39)
  • Python绘制世界疫情地图

    世界疫情数据下载: 方法一:关注微信公众号 大数据智库 (公众号二维码在我的主页左下角),回复疫情数据,即可获取网盘链接 方法二:在gitee上面下载》》点击:疫情数据下载 注:此数据是2022年3月12号的结果,其中透明的地方代表确诊人数小于10万人,白色的地方代表

    2023年04月27日
    浏览(24)
  • Python绘制中国地图

     1. 导入库 2. 导入数据 3. 南海九段线部分数据预处理 开始绘图之前需进行数据选择,即中国区域的数据,特别是绘制南海小地图的更需要,可避免一些问题(小地图上方出现完整地图) 4. 定义掩膜方法,从全球的nc数据中,裁出中国地图部分的数据(根据shp文件裁剪nc数据)

    2024年02月06日
    浏览(30)
  • echarts绘制3D地图

    echarts绘制3D地图实现平移、缩放 所需依赖  准备工作:main.js中引入依赖   先上图 代码直接复制粘贴就可以使用了,根据自己需求稍作修改就可以使用了  html代码部分 js代码部分 绘制3D地图可能会引起地图上标注点,跟所需点有偏差的情况,这样需要去修改引用的json文件

    2024年02月11日
    浏览(30)
  • 高德地图绘制 GPX 数据路线

    重要! 高德地图 js api 文档: https://lbs.amap.com/api/javascript-api-v2/documentation 你所有需要知道的关于 AMap 的所有对象,及其属性、方法、事件都在这里面写明白了。 .gpx 文件是在分享地图路径时最常用的一种数据格式。里面包含了路径点的相关信息,每个点还有可能拥有自己的时

    2024年01月19日
    浏览(33)
  • vue使用Echarts绘制地图

      大致实现就是这个效果,鼠标滑过的时候会显示该区域的一个信息,加上自定义的显示图标 有需要希望可以帮到各位 目录 一、在vue中引入Echarts  二、下载并引入china.json文件 三、准备html容器、css中给图表需要的宽高 四、完整代码 这个可以看Echarts官方文档,按照步骤一步

    2024年02月09日
    浏览(32)
  • VUE+echart绘制地图(3D)

    上一篇分享了一个伪3D的地图,这次我们搞一个真实的3D地图。 效果图如下: 要实现这种效果,首先得引入两个不同的依赖: echarts-liquidfill和echarts-gl,引入很简单: 引入后开始我们的编码工作: template 部分: js部分: 按照步骤来就可以实现和效果图相同的效果,同理,也

    2024年02月11日
    浏览(32)
  • 获取街道、乡镇级的地图geoJson数据,使用echarts绘制地图

    在此以泰州靖江市为例为例,记录一下实现过程 1、整体完成后实现的效果如下 2、获取数据 (1) DataV.GeoAtlas 第一个能想到的获取数据的网站就是它, 是阿里推出的一个用于获取全国、各省、各市以及个县级市详细地图信息的json文件 http://datav.aliyun.com/portal/school/atlas/area_s

    2024年02月09日
    浏览(26)
  • matlab奇技淫巧——绘制三维地图

      在数据处理工作中,常常会用到地图的绘制,最常用的自然是绘制平面的区域/全球地图,通过 即可绘制,效果如下,其中经度为 − 180 ∼ 180 -180sim180 − 180 ∼ 180 ,负为西经,正为东经,纬度为 − 90 ∼ 90 -90sim90 − 90 ∼ 90 ,北纬为正,南纬为负。   不过本博文题目

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包