標籤:部分 for use add creat fonts upd extent 圖片
arcpy.mapping常用四大件-MapsurroundElement
by 李遠祥
在arcpy.mapping 中,除了資料入口MapDocument、圖層Layer之外,另一重要的角色就是MapsurroundElement。MapsurroundElement直接關係的就是地圖的整飾元素。只要湊齊上述的這三大件,ArcGIS的製圖自動化基本上就可以實現了。
地圖的整飾元素有很多,例如文本(標題及其他說明)、圖例、比例尺、指北針、圖片、外加圖形等。利用arcpy.mapping 的MapsurroundElement類,可以做到對這些元素的布局進行精確的排布。
接下來可以看看MapsurroundElement的一些屬性和方法了。嚴格來說,MapsurroundElement沒有方法,所有的設定都是在屬性當中,下面是MapsurroundElement的官方協助,從中可以看到其主要的作用。
基本的屬性設定,如整飾元素的位置、長寬級重新命名都可以設定,以及一個parentDataFrameName用於識別其所在的dataframe(這個一般沒什麼作用,除非需要做接圖表用到多個dataframe),從中可以看出,其主要功能在於整飾元素的識別及大小、位置調整。細節調整部分主要落在type上。這有點類似於上一章提到的Layer,type也是唯讀,但具體的可設定部分則在不同的包含對象中。其涉及到DATAFRAME_ELEMENT、GRAPHIC_ELEMENT、LEGEND_ELEMENT、MAPSURROUND_ELEMENT、PICTURE_ELEMENT、TEXT_ELEMENT這幾類,全部都是繼承了MapsurroundElement,所以,如果只是一般的是大小和位置操作,倒是通過name屬性去識別,然後通過代碼去調整元素的位置和大小。不同的類型也適當的增加一些可設定的屬性,不過總體來說,可設定的屬性也不多。
這幾個類中,有一個非常神秘的就是DATAFRAME_ELEMENT,筆者經曆了好幾個版本的ArcGIS協助,都沒能查到其說明,應該是一個預留的介面,從字面上來看,估計是能夠設定經緯網的,但目前還沒開放,看看協助就知道了,其他幾個類別都能找到其說明,就唯獨缺少它的說明。
GRAPHIC_ELEMENT 對應的就是通過【繪圖】工具條繪製出來的圖形,相對於MapsurroundElement基類,主要是增加了 isGroup(唯讀)屬性,其用途,但目前作用不大,只是判讀是否組合而已,連解除組合的方法都沒有。方法上就是增加複製clone 和刪除delete方法。
LEGEND_ELEMENT 則對應的是圖例的操作,圖例對象是屬性和方法最多的一個子類,autoAdd、items、title。其中items是唯讀,返回表示圖例項目名稱的字串的列表,並不能進行修改。而title則是可讀寫的屬性,可以直接進行設定,還有一個就是autoAdd,這個是一個布爾值,用於決定新的圖層加入進來後是否添加到圖例中,其實際作用就是【圖例】--【屬性】--【常規】中的【新圖層添加到地圖時向圖例添加新項】
圖例的方法倒是開放了不少比較有用的功能,下面幾個就是不錯的方法
- adjustColumnCount (column_count) : 設定圖例的列數
- listLegendItemLayers () :擷取圖例對應的圖層列表
- removeItem (legend_item_layer, {index}) :刪除圖例的某一項
- updateItem (legend_item_layer, {legend_item_style_item}, {preserve_item_sizes}, {use_visible_extent}, {show_feature_count}, {use_ddp_extent}, {index}) :更新圖例設定
對於圖例的這些操作方法,尚算讓人滿意吧,當然不可能將圖例轉換為圖形這些操作加進去,畢竟arcpy定位的是粗粒度的操作,圖例轉圖形這些就是放在AO上去代碼編輯,都是比較麻煩的。
PICTURE_ELEMENT是插入的圖片對象,其中多出一項sourceImage屬性,可以用來讀取路徑(很少人會天真的用來讀取路徑)和設定新的插入圖片。除此之外,這個子類也沒有具體的方法可以使用。
TEXT_ELEMENT則是最常用的子類,所有的文字物件,包括靜態還是動態文字物件都可以用它進行設定。其增加了angle、fontSize和text屬性,基本上可以望文生義了。常用的就是進行常值內容和文本字型的修改。在方法上同樣是增加了clone 和delete的操作。
在所有的MapsurroundElement 中,眼尖點的人就會發現,沒有任何的一個add或者create的字眼。因為MapsurroundElement對象不能通過代碼進行建立,至少目前沒有任何一個ArcGIS版本支援代碼建立。這意味著在arcpy中,MapsurroundElement的使用範圍只是限制在已經建立的整飾元素中。個人感覺就是Esri對arcpy.mapping的定位就是基於固定模版去做自動化製圖,而不是通過代碼層級去建立地圖整飾元素。
接下來可以看看具體的代碼調用方式。可以參考一下官方的例子,將布局視圖中所有出現的2009 年全部替換為2010 年。
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
for elm in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"):
if elm.text == "2009":
elm.text = "2010"
mxd.save()
del mxd
但一般來說,極少使用這種方式來進行替換文本值的。最常見的方式是通過對象的name來標識找到,指定到具體的對象。而擷取整飾元素的方法可以使用ListLayoutElements ,返回的是一個數組,再通過元素在ArcMap中設定的對象名稱也就是name來確定。例如如下的代碼
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
for elm in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"):
if elm.name == "tile_elm":
elm.text = "修改後的標題"
mxd.save()
del mxd
可見,在arcpy.mapping.ListLayoutElements方法中,是不帶通過name參數直接指定對象的,都需要通過數組去尋找。此外,還必須預先對元素對象命名,如,則是對標題文本設定了一個名稱為【tile_name】
其他整飾元素設定也是一樣,其中最重要的原則就是在加入整飾元素的時候必須給一個元素名稱,這是一種規範做法,不管後期是否使用arcpy進行調整。這樣可以規避後期的一些修改。筆者曾經協助過某一個使用者解決過千張專題圖的生產,其中一個非常重要的部分就是在後期修改整飾元素的位置,都是一些細微的操作,例如微調位置和修改文本值,如果一開始沒有設定整飾元素的名稱,那麼後期面對上千個mxd,則是災難性的工作。
總結:
MapsurroundElement是非常好用的整飾元素對象,在製圖自動化中給與了非常高的便利性。當然,它有固定的使用模式和情境,就是需要在一開始建立好元素對象,並且設定好其元素名稱。由於這些對象不能通過代碼去建立,因此,利用arcpy去做地圖模版,那是不合理的。MapsurroundElement只是一種便利的輔助方法。
arcpy.mapping常用四大件-MapsurroundElement