ArcPy自動繪製大量地圖並設置地圖要素:Python

来源:https://www.cnblogs.com/fkxxgis/p/18150594
-Advertisement-
Play Games

本文介紹基於Python語言中ArcPy模塊,實現ArcMap自動批量出圖,並對地圖要素進行自定義批量設置的方法。 1 任務需求 首先,我們來明確一下本文所需實現的需求。 現有通過Python基於Excel數據加以反距離加權空間插值並掩膜圖層所繪製的北京市在2019年05月18日00時至23時(其中 ...


  本文介紹基於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=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個操作後,均會輸出執行結果,方便用戶獲知程式的執行情況。

  至此,大功告成。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家好,我是老貓。今天和大家分享一下程式員日常的繪圖思路,以及一些老貓日常使用的繪圖工具。 為什麼要畫圖? 我們在進行系統設計的時候,為了更加具象地呈現系統的輪廓以及各個組件或者系統之間的關係和邊界以及工作流程。我們就會畫邏輯架構圖,模塊圖、流程圖、時序圖等等。 在日常開發中,軟體設計圖是一種非常好 ...
  • 發佈訂閱模式是怎樣的? 現在市面上流行的很多消息中間件就是採用的該種模式,這種模式 在實際業務中 將 事件發佈者(Publisher) 與 事件訂閱者 (Subscriber)通過額外的事件通道(Event Channel)來解耦,其基本原理與先前提到的觀察者模式有些許類似,但發佈訂閱模式額外存在了 ...
  • 1 不具備記憶能力的 它是零狀態的,我們平常在使用一些大模型產品,尤其在使用他們的API的時候,我們會發現那你和它對話,尤其是多輪對話的時候,經過一些輪次後,這些記憶就消失了,因為它也記不住那麼多。 2 上下文視窗的限制 大模型對其input和output,也就是它的輸入輸出有數量限制。為了保護它的 ...
  • C++ 構造函數 構造函數是 C++ 中一種特殊的成員函數,當創建類對象時自動調用。它用於初始化對象的狀態,例如為屬性分配初始值。構造函數與類同名,且沒有返回值類型。 構造函數類型 C++ 支持多種類型的構造函數,用於滿足不同的初始化需求: 預設構造函數: 不帶參數的構造函數,通常用於初始化對象的默 ...
  • 單向順序鏈表的創建,增,刪,減,查 /******************************************************************* * * file name: 單向順序鏈表的創建,增,刪,減,查 * author : [email protected] ...
  • 作者:青石路 來源:https://www.cnblogs.com/youzhibing/p/18019399 MyBatis 替換成 MyBatis-Plus 背景介紹 一個老項目,資料庫用的是 MySQL 5.7.36 , ORM 框架用的 MyBatis 3.5.0 , mysql-conne ...
  • C++對象在經過類的封裝後,存取對象中的數據成員的效率是否相比C語言的結構體訪問效率要低下?本篇將從C++類的不同定義形式來一一分析C++對象的數據成員的訪問在編譯器中是如何實現的,以及它們的存取效率如何? ...
  • 只要是 web 項目,程式都會直接或間接使用到線程池,它的使用是如此頻繁,以至於像空氣一樣,大多數時候被我們無視了。但有時候,我們會相當然地認為線程池與其它對象池(如:資料庫連接池)一樣,要用的時候向池子索取,用完後歸還給它即可。然後事實上,線程池獨樹一幟、鶴立雞群,它與普通的對象池就是不同。本文本 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...