標籤:stl 查看 原因 相關 包含 span dataframe 顯示 這一
arcpy.mapping實戰-專題圖製圖自動化
by 李遠祥
最初對arcpy.mapping感興趣是因為一次大規模的專題地圖調整的需要,由於某某單位利用ArcEngine編寫的專題圖出圖系統,出現了一些小問題,導致地圖整飾元素的位置出現了誤差。由於最終的生產任務已經到了尾聲才發現一些問題,所以需要在出圖系統之外使用ArcMap進行修改,這樣針對上千幅成果文檔進行修改,是個不小的工作量。後來決定使用arcpy.mapping,使用Python進行遞迴查詢mxd文檔,最終實現自動化修改和重新出圖。雖然當時只是使用了很少的功能,基本上就是對整飾元素的位置和文本進行調整,但arcpy.mapping對此事的協助確實非常巨大。
後來因為另一件事情對arcpy.mapping 有著更深刻的見解,就是協助一位朋友製作專題圖。由於前期總總原因,導致多次頻發修改,而每一次修改都會導致十幾個mxd檔案,每個mxd文檔出十幾個專題,出圖包括普通的png和pdf格式,光是點擊出圖的數量就是300多次,每一次重新出圖都要兩個小時以上。所以,只要涉及到地圖修改,重新出圖就是個非常麻煩的事情。後來想到了最初協助的那家單位,使用的是arcpy.mapping去處理,所有的問題都迎刃而解了。
首先來看看筆者要做的專題圖,其實非常簡單,就是根據土壤採樣點的資料進行插值,產生土壤元素分布圖。看一下Mxd文檔的一些配置,
這裡面涉及到的各種的元素插值資料,每一個專題都需要有圖例和標題,當然,地圖的標題是需要根據圖層的名稱變化的,但又不能包括括弧裡面的單位。光是這一個MXD文檔就需要出14個專題,png和pdf各一張,合計28張。全部共14個地區,每個地區都要匯出28張圖,包括空值圖層顯示,修改標題名稱以及選擇儲存位置、專題圖的名稱等,確實需要不少時間。
不過多年的製圖經驗還是給了非常大的協助,就是地圖製作的正常化。最初的時候筆者也沒考慮過什麼規範的問題,因為基本上一出手處處都是規範操作(請允許我自戀一下)。首先是圖層的名稱,有著標準的名稱,例如每種元素後面都有一個括弧,並且裡麵包含著具體的單位。其次就是每一個圖層都是單獨的圖例,而不是把所有的圖圖層放到一個圖例中,因為需要出的是每種元素的分布專題圖,這樣跟其他的圖層關聯不大,直覺告訴我不應該貪圖方便講所有的放在一個圖例中(當然放在一起也有它的好處,就是管理容易一些,但不好的地方就是圖例的名稱不好控制)。最後就是對整飾元素的規範命名,標題和圖例都分別給與name屬性的名稱。如
這些規範之後,再配合前面幾章所說的arcpy.mapping 三大件,基本上可以高枕無憂了。下面可以來看看代碼部分
#coding=gbk
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Users\lazy\Desktop\插值分析(空間分析)\元素分析結果\元素分析專題圖.mxd")
quyu = "XX縣"
quyu=quyu.decode(‘gbk‘)
df = arcpy.mapping.ListDataFrames(mxd, "圖層")[0]
inLayer=arcpy.mapping.ListLayers(mxd, "", df)
for layer in inLayer:
#匹配圖層名稱
layerNameStr = layer.name
danwei = "(mg/kg)"
canfind = layerNameStr.find(danwei)
if canfind>0:
#擷取前面字串
houzhui = "元素含量分布圖"
if(canfind==3):
houzhui=houzhui.decode(‘gbk‘)
picName=layerNameStr[0:canfind]
picName=picName+".png"
picName2=picName+".pdf"
titleName =quyu+layerNameStr[0:canfind] +houzhui
#設定標題
for elm in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"):
if elm.name == "mapname":
elm.text = titleName
#顯示圖層
layer.visible=True
#輸出底圖
folderpath = "C:\\Users\\lazy\\Desktop\\插值分析(空間分析)\\出圖\\"
folderpath=folderpath.decode(‘gbk‘)
fullpath = folderpath+picName
arcpy.mapping.ExportToPNG(mxd, fullpath,resolution=200)
arcpy.mapping.ExportToPDF(mxd, fullpath,resolution=200)
#關閉圖層
layer.visible=False
由於已經定義好了標題,那麼只需要尋找到名為 mapname 的文本元素就行了。這個過程當然是需要綜合運用了。充分利用了前面所說的三大件完成。通過MapDocument 去進入尋找mxd,然後進而用Layer對象指向圖層;利用圖層的visible屬性進行開關圖層,由於每種元素都是一個圖層對應一個圖例,圖層開啟的時候圖例自然會開啟,所以這裡layer.visible 非常重要,文檔初始化時只需要開啟基礎背景資料,專題資料一個都不要開啟,不然就會出現多個重疊;找到圖層之後擷取圖層名並進行解析,然後擷取"(mg/kg)" 前面的字串(那就是專題圖的元素名稱了,這對標題和圖例都是有作用的),根據不同的單位進行代碼複用,為了偷懶,筆者也不去寫判斷語句了,直接使用將第一個for代碼塊複用了幾次,只是修改了判斷單位而已;利用擷取的元素名去構建text元素的名稱,例如格式就是“XX縣X元素含量分布圖”,具體見代碼的構建方式,利用MapsurroundElement 進行修改,圖例名稱也是可以這樣修改;最後就是出圖了,直接使用arcpy.mapping.ExportToPNG 和 arcpy.mapping.ExportToPDF進行出圖,出圖路徑都已經構建好了,就是主要是命名方式可以自訂,就用圖層名稱提取出來的元素名稱作為檔案名稱。
當大功告成好,就不再怕不停的需求修改了,匯出地圖再也不用瘋狂點擊滑鼠和鍵盤了。只需要將這個Python指令碼雙擊調用一下,就可以輕鬆喝一杯上好的鐵觀音,然後等待幾分鐘就了事。相對於傳統的手工導圖的方式,確實省事更省心。可以看看下面一個地區的出圖結果
總結:從這個實戰例子中可以看到,如果要使用arcpy.mapping去自動化出圖,地圖製作必須要非常規範,這種規範雖然沒到地圖模版的那樣苛刻,但必須加入一些地圖的可控手段。如果一開始沒有進行一些標準的命名、製作處理等,後期將會非常被動。arcpy.mapping本身並不難,可以使用的對象和方法並不多,所以學習和使用時非常容易的。掌握了arcpy.mapping的四大件之後(抱歉第四件還沒寫出來 ^_^ ),在面對同樣問題的時候就可以舉重若輕了。
關於arcpy.mapping的相關基礎,可以查看之前的內容:
arcpy.mapping-認識arcpy.mapping
arcpy.mapping常用四大件-MapDocument
arcpy.mapping常用四大件-Layer
arcpy.mapping常用四大件-MapsurroundElement
arcpy.mapping實戰-專題圖製圖自動化