?

基于ArcGIS 的批量制圖研究與應用

2023-02-05 13:57
經緯天地 2023年6期
關鍵詞:批量圖層制圖

陳 楊

(山東省地質測繪院,山東濟南 250003)

0 引言

地圖是測繪與地理信息的重要載體,可以科學地表達自然和社會經濟現象的分布特征及其相互關系。隨著現代測繪科學技術突飛猛進的發展,制作地圖的數據源逐漸多元化,地圖制作也早已由傳統方法手段向計算機和GIS 技術發展?,F代地圖一般先制作成電子數據格式存儲和應用,有需要時打印輸出成紙質地圖。

依據不同的分類方式,地圖的分類多種多樣,但通常都包含圖形要素、數學要素、輔助要素和補充說明等。在整套整批的每張地圖中,輔助要素和補充說明都是相同或類似的,比如某種專題圖的分幅圖[1]。所以在制作分幅專題圖時會涉及很多重復的工作,如果每張地圖都采用單獨編輯制作和輸出的方式,將會耗費大量的人力、物力和時間,造成資源的浪費。因此,要實現地圖制作的批量化和自動化,需要創建可自動執行的工作流來記錄步驟過程[2]。

本文利用山東省各市、(區)縣數據,以山東省市、(區)縣行政區劃圖制作為實例,詳細論述了完全基于數據驅動制圖模塊和以ArcPy 結合數據驅動制圖模塊兩種方法批量制作和輸出地圖的技術方法。最后,對于如何結合形狀指數動態修改地圖比例尺進行了展望。

1 ArcGIS批量制圖的優勢

隨著現代測繪科學技術的發展,學科之間的不斷深度融合呈加強趨勢,傳統測繪概念正逐漸被“大測繪”所替代。近年來,GIS 技術以得天獨厚的優勢在測繪數據批處理方面起著越來越重要的作用。作為一款非常優秀的GIS 軟件,ArcGIS 在行業內有著最高的市場占有率和知名度[3],在地圖生產制作方面具有強大的工具和功能,二次開發功能更能滿足用戶個性化的使用需求。

1.1 數據驅動制圖模塊

ArcGIS 提供了“數據驅動頁面”工具,可以利用單個地圖文檔(mxd 文件)方便快捷地創建一系列布局頁面。用戶在實際應用中不需要進行二次開發,只需配置好其中一幅地圖的模板,利用mxd 文件中的索引要素將地圖分割為多個部分[4],然后為每個索引要素生成相應頁面,可以實現零代碼方式批量輸出地圖。

1.2 ArcPy

ArcPy(ArcPy 站點包)作為Python 語言的第三方庫,為用戶提供了使用Python 操作地理處理工具的接口。ArcPy 由數據訪問模塊(arcpy.da)、制圖模塊(arcpy.mapping)、ArcGIS Spatial Analyst 擴展模塊(arcpy.sa)和ArcGIS Network Analyst 擴展模塊(arcpy.na)等組成,包含了大量、豐富的函數和類,可以根據用戶具體需求定制開發出處理地理數據的實用性程序。

制圖模塊(arcpy.mapping)集成于ArcGIS for Desktop,可以方便地處理地圖文檔(.mxd 格式)和圖層文件(.lyr 格式)。它繼承了Python 語言簡潔實用的特點,不僅很好地封裝了ArcMap 的地圖交互功能,還擴展了數據驅動頁面的功能[5],可方便地用于自動執行地圖批量生產。另外,可將制圖模塊腳本發布為地理信息數據處理服務,還可將腳本功能提供給Web 應用程序。

2 基于ArcGIS批量制圖研究

2.1 數據準備與制圖需求

以山東省各市、(區)縣行政區要素數據作為本文研究內容的基礎數據,現根據需求的格式和樣式批量制作并輸出山東省各市、(區)縣兩級的行政區區劃圖,要求每個市單獨輸出為一個圖幅文件。

2.2 完全基于數據驅動制圖模塊批量制圖

2.2.1 數據驅動頁面定義和設置

在ArcMap 環境中調出“數據驅動頁面”工具條,對數據驅動頁面中的“定義”和“范圍”選項卡進行設置。在“定義”選項卡設置中,主要是進行索引圖層設置,選定某一圖層作為制圖的索引要素數據;在“范圍”選項卡中,主要是設置地圖顯示范圍等參數,在此處可選擇“最佳大小”單選框,“大小”處輸入125%,表示每幅圖顯示范圍為本幅圖索引數據范圍的125%,即對顯示范圍進行適當擴大。

2.2.2 添加范圍指示圖(鷹眼指示圖)

在整套整批地圖的每一幅圖中,通常需要在圖面下方添加范圍指示圖,用來指示本幅地圖顯示范圍在整個地圖區域的位置,可以起到方位指示的作用。對于此功能的實現,ArcGIS 提供了一種簡便的操作方法,在布局視圖下插入新的數據框并調整大小和位置。作為范圍指示圖,可以對內容列表中的各州基礎數據進行復制,然后粘貼到新建數據框中,打開新建數據框的“屬性”對話框,選擇“范圍指示器”標簽,設置“圖層”數據成為顯示這些數據框的范圍指示器。這種方法簡單易行,通過幾步設置巧妙地實現了復雜的功能,操作效果如圖1 所示。

圖1 添加范圍指示圖

2.2.3 添加動態文本和輔助要素

在“插入”菜單→“動態文本”處或通過數據驅動頁面工具的“頁面文本”選項,都可以方便地插入各種具體需求的動態文本,比如日期、頁碼和各種名稱等。有些動態文本以函數表達式的形式給出,用戶可以根據自身需求修改其中的變量內容來進行特定顯示。另外,在ArcMap 中可以直接將圖例、指北針等輔助要素插入到地圖特定位置并調整大小和位置,并且這些輔助要素有多種格式可選。

2.2.4 特定頁面數據顯示設置

在地圖制作中,每幅地圖通常只需顯示本幅圖索引范圍內的數據。比如在本文所舉實例中,要求每幅地圖只顯示本幅圖表示州行政區的下轄縣數據,把相鄰的其他州的下轄縣數據進行隱藏。打開美國縣級數據的圖層屬性對話框,選擇“定義查詢”選項卡[6],再打開下方“頁面定義”對話框,勾選“啟用”復選框,在“頁面名稱字段”處選擇州名稱字段,再勾選“匹配”單選框完成設置后即可實現所需效果。

2.2.5 批量導出地圖

在完成頁面設置以后,通過“文件”菜單中的“導出地圖”對話框,設置地圖分辨率、導出格式和頁面類型大小等輸出參數(此處批量導出功能僅支持pdf 格式),即可選擇目標文件夾導出地圖。

2.3 ArcPy結合數據驅動模塊批量制圖

2.3.1 創建腳本工具箱

采用創建腳本工具箱的模式進行ArcPy 批量制圖,將可視化的對話框和python 代碼相結合,具有設計簡潔和操作簡便的優點,易學易懂。在ArcCatalog 環境下選定指定文件夾新建tbx 格式“工具箱”,在新建工具箱下添加腳本并輸入相關信息。再選擇引用編寫好的腳本文件,最后進行相關參數設置[7]。在此需要添加一個地圖輸出路徑參數,填寫參數的名稱并選擇數據類型為“工作空間”[8],用于選擇存放制圖輸出的路徑。

本示例所引用的腳本文件代碼及主要語句的注釋如下:

import arcpy

#導入arcpy 模塊

outWorkSpace=arcpy.GetParameterAsText(0)

#創建工作空間變量,獲取工作空間參數

outpath=outWorkSpace+"\"

#定義參數工作空間,并指定輸出地圖的存放位置

mxd=arcpy.mapping.MapDocument("CURRENT")

#定義當前mxd 為工作空間

for pageNum in range(1,mxd.dataDrivenPages.pageCount+1):

mxd.dataDrivenPages.currentPageID=pageNum

mapName=mxd.dataDrivenPages.pageRow.

getValue(mxd.dataDrivenPages.pageNameField.name)

fullpath=outpath+mapName+".jpg"

#定義當輸出路徑

arcpy.mapping.ExportToJPEG(mxd,fullpath,resolution=100)

arcpy.AddMessage("正在批量輸出第"+str(pageNum)+"張圖")

#利用for 循環遍歷驅動頁面,在進行相關設置后批量輸出地圖

arcpy.AddMessage("出圖完成!,共輸出"+str(pageNum)+"張圖")

#輸出地圖完成后,彈出對話框提示信息

del mxd

#刪除定義的工作空間

2.3.2 批量輸出地圖

利用創建的腳本工具箱,選擇指定輸出路徑進行批量地圖文件輸出如圖2 所示。腳本程序執行的過程如圖3 所示,地圖輸出一邊執行一邊打印提示語,當所有地圖輸出完成之后統計并打印地圖數量。批量出圖過程實現了人機交互功能,操作簡單并且效率很高。圖4 展示了部分輸出地圖的疊放效果,從成果圖可以看出,圖面整飾部分統一規范、整體整潔美觀,達到了預期目的,取得了良好的效果。

圖2 腳本工具的文件輸出設置界面

圖3 腳本工具運行過程的提示

圖4 批量輸出的部分地圖文件

對于“特定頁面數據顯示設置”的需求,上文的方法是在圖層屬性對話框中通過設置“定義查詢”選項卡的屬性參數來隱藏其他州的下轄縣數據。也可以利用Layer.definitionQuery 方法定義查詢輸出圖形,在創建腳本工具箱時需再添加一個顯示圖層參數,選擇數據類型為“圖層”。在原批量輸出圖形的腳本代碼中加入定義查詢出圖的完整修改代碼及主要注釋如下:

import arcpy

#導入arcpy 模塊

indexLayer=arcpy.GetParameterAsText(0)

#創建索引圖層變量,獲取索引圖層參數

outWorkSpace=arcpy.GetParameterAsText(1)

#創建工作空間變量,獲取工作空間參數

lyr=arcpy.mapping.Layer(indexLayer)

#對Layer 圖層進行實例化

outpath=outWorkSpace+"\"

mxd=arcpy.mapping.MapDocument("CURRENT")

for pageNum in range(1,mxd.dataDrivenPages.pageCount+1):

mxd.dataDrivenPages.currentPageID=pageNum

mapName=mxd.dataDrivenPages.pageRow.getValue(mxd.dataDrivenPages.pageNameField.name)

fullpath=outpath+mapName+".jpg"

query="NAME=′"+mapName+"′"

#創建查詢語句文本

lyr.definitionQuery=query

#用lyr.definitionQuery 方法調用查詢語句,進行設置

arcpy.mapping.ExportToJPEG(mxd,fullpath,resolution=100)

arcpy.AddMessage("正在批量輸出第"+str(pageNum)+"張圖")

#利用for 循環遍歷驅動頁面,在進行相關設置后批量輸出地圖

arcpy.AddMessage("出圖完成!,共輸出"+str(pageNum)+"張圖")

#輸出地圖完成后,彈出對話框提示信息

lyr.definitionQuery=""

#最后為lyr.definitionQuery 賦空值,釋放內存空間

del mxd

#刪除定義的工作空間

3 結語

本文在ArcGIS 軟件平臺下對兩種批量生產地圖的方法進行研究,并利用實例詳細論述了具體應用流程,為在生產工作中批量制作和輸出地圖提供了完整有效的解決方案。ArcGIS 批量制圖大大地減輕了制圖技術人員的工作強度,避免了誤操作和煩瑣的重復勞動,不僅提高了圖件成果的準確性,還提升了工作效率和經濟效益。

完全基于數據驅動制圖模塊進行地圖制作操作較簡單,不需要借助編程即可實現批量化操作。這種方法在批量輸出地圖時只能以pdf 格式保存,再轉換成為其他柵格文件格式時容易出現丟失點狀符號等問題。以ArcPy 結合數據驅動制圖模塊進行批量制圖的方法能夠利用函數進行需要的格式輸出和多種設置,比如可以直接批量生成常用的JPG 格式,應用起來更加靈活。ArcPy 語言設計精簡實用,語法接近于自然語言,常常只用十幾行左右代碼即可解決比較復雜的數據處理問題。由于Python 語言比較符合人的習慣性思維模式,對于編程經驗不足的人來說容易上手。

本文實例中的索引數據利用了已有行政區域界線數據,如果要生產方格網分幅圖可以先創建分幅格網作為索引數據。同時,軟件還支持創建帶狀索引分幅,滿足了多種工程類的制圖需求。

文中制圖案例以行政區域數據作為索引圖層,在設置地圖范圍時選定了統一的百分比125%,值得注意的是,統一的比例數值并不適用于每張地圖。這樣生產出的有些圖幅整體并不十分完美,存在索引數據圖層在整個圖面中的比例不協調的情況,這就需要根據索引數據的“形狀指數”來動態修改地圖比例尺。

“形狀指數”又被稱為“景觀形狀指數”,是指格局中斑塊的形狀指數,一般通過計算區域內某斑塊形狀與相同面積的圓或正方形之間的偏離程度來測量形狀的復雜程度。如果要使批量輸出的每張地圖比例協調美觀,可以在索引圖層中增加形狀指數字段來計算每行圖形數據的形狀指數,再增加比例尺字段,根據圖形形狀指數計算出適宜的比例尺。最后再利用Python 代碼程序以每張地圖索引數據適宜的比例尺進行顯示輸出。

猜你喜歡
批量圖層制圖
批量提交在配置分發中的應用
無聲手槍如何消音?
巧用混合圖層 制作抽象動感森林
二向反射模型在土地覆被制圖中的應用
圖層法在地理區域圖讀圖中的應用
跟我學添加真實的光照效果
淺議高校網銀批量代發
工程制圖課程教學改革探析
淺析“遞層優化法”在礦井制圖中的應用
基于AUTOIT3和VBA的POWERPOINT操作題自動批量批改
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合