arcpy.mapping實戰-專題圖製圖自動化

來源:互聯網
上載者:User

標籤: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實戰-專題圖製圖自動化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.