楊明星,徐天蜀,施銳平,岳彩榮
(1.西南林業(yè)大學(xué) 林學(xué)院,昆明650224; 2.屏邊縣林業(yè)局,云南 屏邊661200)
在林業(yè)建設(shè)中,經(jīng)常需要批量生成林相圖、森林資源分布圖、林地征占用圖等林業(yè)專題圖,以便直觀的顯示森林面積、林種、齡級(jí)等多項(xiàng)林分因子的空間分布狀況,體現(xiàn)規(guī)劃設(shè)計(jì)的思想,它們是林業(yè)生產(chǎn)、科研和經(jīng)營(yíng)管理不可或缺的基礎(chǔ)資料,也是各類森林資源調(diào)查、林業(yè)規(guī)劃設(shè)計(jì)成果的重要圖面材料[1-2]。ArcGIS提供了豐富的地理處理工具,經(jīng)常用于林業(yè)專題圖的生產(chǎn)制作。有時(shí)由于工作需要,一次要制作成百上千幅的林業(yè)專題圖,如何借助ArcGIS軟件,實(shí)現(xiàn)批量生產(chǎn),對(duì)于從事GIS和林業(yè)工作的相關(guān)工作者而言,具有重要意義。本文以天然林停伐保護(hù)實(shí)施方案專題圖制作為例,介紹基于Python語言來批量生成林地專題圖的方法。
Python是1989年由荷蘭人Guido van Rossum開發(fā)的,1991年發(fā)布第一版Python,現(xiàn)在已經(jīng)發(fā)展到3.7版本。目前,Python開源社區(qū)具有大量活躍的用戶,一起參與到Python的維護(hù)與發(fā)展之中。Python是一種具有:簡(jiǎn)單易學(xué)、免費(fèi)開源、可移植性,以及跨平臺(tái)、可擴(kuò)展、面向?qū)ο蟮忍攸c(diǎn)的解釋性程序語言,憑借其獨(dú)有特點(diǎn)日漸成為程序設(shè)計(jì)領(lǐng)域時(shí)下最流行的編程語言[3]。據(jù)IEEE Spectrum雜志發(fā)布的2018年年度頂級(jí)編程語言交互排行榜,Python高居首位,連續(xù)兩年位于榜單榜首。隨著人工智能、大數(shù)據(jù)等領(lǐng)域的崛起,Python會(huì)更加的火爆。
Python的諸多特點(diǎn)也促使它被選擇作為ArcGIS主要支持的腳本語言,在ArcGIS地理處理框架中占據(jù)重要地位,與ArcGIS平臺(tái)達(dá)到了完美的融合與集成,用它來編寫腳本程序?qū)⒋蟠筇嵘龜?shù)據(jù)處理效率,更好的解決批量生產(chǎn)、實(shí)現(xiàn)地理處理自動(dòng)化[4]。Python具有豐富的庫和站點(diǎn)包,用于開展不同的工作。ArcGIS自從9.0版本后,集成了基于Python語言的ArcPy模塊包,它提供了大量類和函數(shù),支持柵格數(shù)值計(jì)算和幾何圖形編輯,以簡(jiǎn)潔高效的方式實(shí)現(xiàn)地理數(shù)據(jù)管理、轉(zhuǎn)換、分析和地圖自動(dòng)化創(chuàng)建等地理數(shù)據(jù)處理功能。利用ArcPy可調(diào)用地理處理工具以及其他函數(shù)、類和模塊,從而創(chuàng)建簡(jiǎn)單或復(fù)雜空間數(shù)據(jù)處理工具[5]。
ArcPy由數(shù)據(jù)訪問模塊(arcpy.da)、制圖模塊(arcpy.mapping)、網(wǎng)絡(luò)分析模塊(arcpy.na)及空間分析模塊(arcpy.sa)等一系列模塊支持,幾乎可以完成ArcGIS工具箱中所有的地理處理(Geoprocessing)工具的功能。制圖模塊主要用于對(duì)地圖文檔(.mxd)和圖層文件(.lyr)進(jìn)行相關(guān)處理。
2017年,云南省開展天然商品林停伐保護(hù)工作,著手編制縣級(jí)實(shí)施方案。方案中需要制作大量的專題圖件,比例尺要求1:25000。對(duì)于一個(gè)林業(yè)大縣,方案專題圖的數(shù)量可以達(dá)到上百幅,這將帶來巨大的工作量,借助ArcGIS軟件,將其功能靈活的組合應(yīng)用,能夠提高地圖編制的效率,節(jié)省出圖時(shí)間,實(shí)現(xiàn)快速制圖[6]。
天然林停伐保護(hù)專題圖有4類,即天然林停伐保護(hù)規(guī)劃圖、天然林資源分布圖、天然林管護(hù)責(zé)任區(qū)示意圖和天然林管護(hù)設(shè)計(jì)圖,都需保存工程和導(dǎo)出地圖。每幅圖都應(yīng)有詳細(xì)的地圖要素,如圖名、比例尺、指北針及各項(xiàng)繪圖因子;地圖注記要清晰、整潔,線條粗細(xì)均勻、著墨飽滿、無斷線;整圖設(shè)計(jì)須規(guī)范美觀,內(nèi)容布設(shè)協(xié)調(diào),著色和標(biāo)注要美觀大方實(shí)用,具體要求見操作細(xì)則[7]。
數(shù)據(jù)準(zhǔn)備階段包括收集空間數(shù)據(jù)和屬性數(shù)據(jù)。空間數(shù)據(jù)分為柵格數(shù)據(jù)和矢量數(shù)據(jù),柵格數(shù)據(jù)主要收集高清影像圖、地形圖、森林資源專題圖等;矢量數(shù)據(jù)包括點(diǎn)線面三類要素。點(diǎn)要素:省、市、縣、鄉(xiāng)等政府所在地、居民點(diǎn)、以及需用點(diǎn)標(biāo)注的其它地理要素(山峰、高程點(diǎn)、瞭望臺(tái)等);線要素:行政區(qū)界線、鐵路、公路、一般道路以及河流溝渠、防火線等以線為主要特征構(gòu)造的地物;面要素:生態(tài)區(qū)位、公益林劃定區(qū)、林業(yè)產(chǎn)業(yè)規(guī)劃區(qū)、責(zé)任保護(hù)區(qū)、林場(chǎng)、林班、小班等封閉面要素(湖泊、水庫等)。
收集的空間數(shù)據(jù)要與屬性數(shù)據(jù)進(jìn)行連接,確保一一對(duì)應(yīng),要素之間應(yīng)當(dāng)建立拓?fù)湟?guī)則檢查,保證圖形之間不存在沖突關(guān)系。
在ArcGIS軟件中添加縣級(jí)基礎(chǔ)數(shù)據(jù),如停伐小班、地形圖、影像圖等,按編制方案的要求定義各圖層的符號(hào)、樣式,進(jìn)行圖層渲染,包括顏色、線型等。有時(shí)要求使用的符號(hào)在ArcGIS提供的標(biāo)準(zhǔn)符號(hào)庫中沒有現(xiàn)成的,這時(shí)應(yīng)當(dāng)按照符號(hào)要求手動(dòng)編輯配置符號(hào)樣式。
標(biāo)注信息多包含地類、優(yōu)勢(shì)樹種、面積等屬性信息,規(guī)范的標(biāo)注信息可以使得地圖所表達(dá)的信息一目了然,多會(huì)涉及分子式標(biāo)注方法,具體使用時(shí),按照標(biāo)注要求選擇字段,標(biāo)注表達(dá)式示例如表1。
1)如果安裝了工廠化制圖擴(kuò)展模塊(Esri Production Mapping),可以插入動(dòng)態(tài)表格(Graphic Table Element)進(jìn)行設(shè)置,生成的表格標(biāo)注隨驅(qū)動(dòng)頁面的變化而動(dòng)態(tài)變化。
2)手動(dòng)插入表格,這需要在保存好MXD工程后依次打開對(duì)應(yīng)貼入。根據(jù)網(wǎng)格索引選擇對(duì)應(yīng)范圍內(nèi)的小班信息,在Excel中設(shè)置適宜的行高、列寬、字體大小等,選中復(fù)制即可在ArcGIS布局視圖下粘貼。
小班注記表在頁面中放置的位置應(yīng)盡量不覆蓋林地圖斑,可根據(jù)實(shí)際情況進(jìn)行大小、位置的調(diào)整,保持整圖的美觀性。
表1 標(biāo)注表達(dá)式標(biāo)注類型VBScript標(biāo)注表達(dá)式示例二分式int([小班號(hào)]) & "---" & int([小班面積]) & vbnewline & "----------" & vbnewline & [地類] & "-" & [優(yōu)勢(shì)樹種]32—70純林-云南松三分式[國(guó)有面積] & "畝"& vbnewline & [鄉(xiāng)名] &"-------" & vbnewline & [集體面積] & "畝"XX鄉(xiāng)1313畝35631畝上標(biāo)round ([area],0)& "m"& "" & "2" & ""667 m2下標(biāo)round ([area],0)& "m"& "" & "2" & ""667 m2
在布局視圖下進(jìn)行合理圖面配置,插入下列地圖要素:
1)圖名:
2)比例尺:1:25000(設(shè)置出圖比例,設(shè)置數(shù)據(jù)框固定比例為1:25000)。
3)指北針:多放在地圖右上角,設(shè)置背景為白色。
4)插入圖例應(yīng)大小適宜,布局合理。
5)圖幅編號(hào):選擇數(shù)據(jù)驅(qū)動(dòng)頁面文本參數(shù),添加動(dòng)態(tài)文本
6)制圖單位、制圖日期等信息,可在視圖中添加參考線,插入文本。
依照不同的行政區(qū)域來進(jìn)行頁面設(shè)置,具體設(shè)計(jì)出圖版面的圖幅大小、方向和布局,達(dá)到數(shù)據(jù)展示清晰、視覺美觀的效果(如圖1),保證同一專題圖具有相同的出圖風(fēng)格。
圖1 出圖模板
點(diǎn)、線、面要素圖層都可以作為索引圖層。通常,索引格網(wǎng)多為矩形,在制作時(shí)可根據(jù)實(shí)際調(diào)整多邊形作為索引要素。在實(shí)際生產(chǎn)中,手動(dòng)創(chuàng)建多邊形格網(wǎng)效率不高,為使得格網(wǎng)一致,多使用地理處理工具自動(dòng)創(chuàng)建格網(wǎng)要素,常用的創(chuàng)建工具有:創(chuàng)建漁網(wǎng)工具和數(shù)據(jù)驅(qū)動(dòng)頁面下的創(chuàng)建格網(wǎng)索引要素工具。
查看創(chuàng)建好的格網(wǎng)是否符合出圖要求,如是否超出天然林停伐小班范圍(因?yàn)樾姓吔缤ǔJ遣灰?guī)則的,自動(dòng)創(chuàng)建的格網(wǎng)為矩形,特別注意在邊緣處格網(wǎng)會(huì)超出林地邊界),進(jìn)行格網(wǎng)的適當(dāng)編輯修改,在創(chuàng)建好的索引要素的屬性中應(yīng)當(dāng)填入鄉(xiāng)鎮(zhèn)、村委會(huì)、編號(hào)等基本屬性信息,基本信息可以作為出圖圖名,編號(hào)可作為頁碼,常使用字段計(jì)算器建立公式“[ FID ]+1”順序編號(hào),也可以使用Python語句自動(dòng)遞增編號(hào)。自動(dòng)編號(hào)有兩種方法:
1)按照格網(wǎng)從左往右、自上而下自動(dòng)編號(hào),打開屬性表,添加兩個(gè)浮點(diǎn)型字段:xmin和ymax,在字段計(jì)算器中,解譯程序選擇Python,輸入表達(dá)式xmin=!shape.extent.XMin!和ymax=!shape.extent.YMax!,分別計(jì)算索引格網(wǎng)外包矩形最北最西的坐標(biāo)值,xmin是最小X范圍坐標(biāo)(西坐標(biāo)),ymax是最大Y范圍坐標(biāo)(北坐標(biāo))。然后根據(jù)xmin字段升序排列,ymax字段降序排列,就可以得到索引格網(wǎng)按自上而下、從左至右次序編號(hào)。同理,這種方法也可用于計(jì)算林地斑塊四至。
2)執(zhí)行Python循環(huán)語句,使用UpdateCursor函數(shù)按照屬性表順序編號(hào)(bh為創(chuàng)建的字段名)。
cur=arcpy.UpdateCursor("索引格網(wǎng)","","","","分區(qū) A") #按“分區(qū)”字段順序編號(hào),A為升序,D為降序
i=1
for row in cur:
row.bh=i
i+=1
cur.updateRow(row)
del cur,row
啟動(dòng)數(shù)據(jù)驅(qū)動(dòng)頁面,索引圖層選擇格網(wǎng)索引圖層,排序字段選擇編號(hào),勾選升序排列,在范圍選項(xiàng)卡中選擇居中并保持當(dāng)前比例,設(shè)置所有導(dǎo)出的圖片都具有相同的比例大小。對(duì)小班面層、管護(hù)區(qū)圖層分別進(jìn)行頁面定義查詢?cè)O(shè)置,使索引格網(wǎng)內(nèi)的天然林停伐圖斑隨著驅(qū)動(dòng)頁面的變化而呈動(dòng)態(tài)顯示,范圍之外的要素圖層則不顯示,使得圖面整潔,重點(diǎn)突出。
按要求設(shè)置好出圖比例和標(biāo)注填充符號(hào)等制圖要素后,就可以借助Python語言批量保存MXD工程文件了,Python語言一般在安裝ArcGIS時(shí)就已默認(rèn)安裝,不必再另行安裝。
首先應(yīng)當(dāng)導(dǎo)入ArcPy庫,導(dǎo)入方法是:import arcpy,調(diào)用ArcPy中的函數(shù)和工具包。代碼如下:
#_*_ coding=utf8_*_
import arcpy,os,sys,time
reload(sys)
sys.setdefaultencoding(|utf-8|)
importPath = "D:專題圖"
exportPath = r"D:專題圖工程文檔"
print |程序開始:|+str(time.ctime())
mxdPath=str(importPath).strip().decode(|utf-8|)
shpPath=r"D:專題圖圖層索引格網(wǎng).shp"
mxd=arcpy.mapping.MapDocument(os.path.join(mxdPath,"出圖模板.mxd"))
rows=arcpy.SearchCursor(shpPath)
for i in rows:
pageID=mxd.dataDrivenPages.getPageIDFromName(i.getValue("分區(qū)"))
mxd.dataDrivenPages.currentPageID =pageID
mxd.saveACopy(exportPath+"\"+i.getValue("分區(qū)") + ".mxd")
del mxd
print|程序結(jié)束:|+str(time.ctime())
利用4.1節(jié)中構(gòu)造好的出圖模板,通過索引格網(wǎng)及數(shù)據(jù)驅(qū)動(dòng)頁面設(shè)置,設(shè)定文件路徑,使用getValue函數(shù)獲取格網(wǎng)的屬性字段值,作為工程名。調(diào)用數(shù)據(jù)驅(qū)動(dòng)工具,按照一個(gè)索引格網(wǎng)來保存一個(gè)MXD工程,進(jìn)行循環(huán)保存。
導(dǎo)出地圖時(shí),在ArcGIS導(dǎo)出地圖窗口中,選擇PDF格式,可以全部頁碼導(dǎo)出為一個(gè)PDF,或者導(dǎo)出多個(gè)PDF,這種方式只能夠批量導(dǎo)出PDF文件,其他圖片格式不能實(shí)現(xiàn)批量。因此,要批量導(dǎo)出地圖為圖片格式,需要使用ArcPy腳本,可以批量導(dǎo)出JPG、PNG等常見圖片格式。首先設(shè)置MXD文檔的存放路徑,輸出圖片的存放路徑、文件名以及分辨率等。具體代碼如下:
#_*_ coding=utf8_*_
import arcpy,os,sys,time
reload(sys)
sys.setdefaultencoding(|utf-8|)
mxdPath=str("D:專題圖工程文檔").strip().decode(|utf-8|)
picPath=r"D:專題圖圖片"
res=200
print|程序開始:|+str(time.ctime())
for afile in os.listdir(mxdPath):
if afile[-3:].lower() ==|mxd|:
filePath=str(os.path.join(mxdPath,afile)).strip().decode(|utf-8|)
mxd=arcpy.mapping.MapDocument(filePath)
arcpy.mapping.ExportToJPEG(mxd,picPath+"\"+afile[:-3]+|jpg|,resolution=res)
del mxd
print|'程序結(jié)束:|+str(time.ctime())
通過獲取文件路徑,對(duì)文件夾下的MXD工程文件進(jìn)行遍歷,使用ExportToJPEG函數(shù)導(dǎo)出文件夾內(nèi)每一個(gè)MXD工程中布局視圖界面為一個(gè)JPG圖片,若要更改圖片格式,只需更改ExportToJPEG函數(shù),如替換為ExportToPNG或ExportToBMP,就可批量導(dǎo)出對(duì)應(yīng)的PNG和BMP格式圖片。
對(duì)于大多數(shù)工作者而言,更傾向于使用ArcToolbox圖形界面工具,而不是直接使用代碼塊??梢越柚鶪etParameterAsText函數(shù)獲取圖層參數(shù),將Python腳本做成工具的形式集成到ArcToolbox中(圖2),方便不同專題圖生產(chǎn)的快速調(diào)用。
(a)批量保存MXD工程
(b)批量導(dǎo)出圖片
在林業(yè)空間數(shù)據(jù)處理方面,ArcGIS提供了眾多地理處理工具,通過Python這個(gè)粘合劑,可以將多個(gè)工具有機(jī)地組合起來使用,達(dá)到提高效率、保證質(zhì)量的目的,滿足林業(yè)生產(chǎn)實(shí)際需求。本文通過天然林停伐保護(hù)專題圖批量生成的成功實(shí)踐,驗(yàn)證了在ArcGIS平臺(tái)下,使用Python語言在林業(yè)專題圖制圖方面的高效與準(zhǔn)確,為大批量數(shù)據(jù)自動(dòng)化處理提供解決思路。同時(shí),本文提出的批量出圖方法,在其他行業(yè)(如國(guó)土、環(huán)保)也具有重要應(yīng)用價(jià)值。
Python語言在ArcGIS地理處理架構(gòu)中有著重要的地位,結(jié)合Python語言和ArcGIS平臺(tái),針對(duì)不同的行業(yè)應(yīng)用、依據(jù)特定的業(yè)務(wù)需求,定制適宜的空間數(shù)據(jù)處理解決方案,構(gòu)造實(shí)現(xiàn)繁瑣地理處理過程的批處理工具,簡(jiǎn)單高效地完成空間數(shù)據(jù)批量處理,提高數(shù)據(jù)處理整合速率和正確率,減少數(shù)據(jù)處理加工過程中的重復(fù)性勞動(dòng),減輕工作量,能夠極大地提高空間數(shù)據(jù)生產(chǎn)加工的效率,今后將會(huì)得到越來越多的應(yīng)用和推廣。