第四章 查找和修復(fù)數(shù)據(jù)源 ||| 第六章 使用腳本執(zhí)行地理處理工具
我們將在本章介紹以下案例:
- 創(chuàng)建頁面布局元素列表
- 為頁面布局元素賦唯一名稱
- 調(diào)用ListLayoutElements()函數(shù)限制返回的頁面布局元素
- 更新頁面布局元素屬性
- 獲取可用的打印機(jī)列表
- 調(diào)用PrintMap()函數(shù)打印地圖
- 將地圖導(dǎo)出為PDF文件
- 將地圖導(dǎo)出為圖片文件
- 調(diào)用PDFDocumentCreate()和PDFDocumentOpen()函數(shù)創(chuàng)建地圖冊(cè)
引言
ArcGIS10推出的arcpy.mapping
模塊提供了許多與自動(dòng)化地圖生產(chǎn)相關(guān)的功能。
arcpy.mapping
模塊可用于自動(dòng)化地圖生產(chǎn),創(chuàng)建地圖冊(cè),導(dǎo)出為圖像或PDF文件以及創(chuàng)建并管理PDF文件。在本章中,你將會(huì)學(xué)習(xí)如何使用arcpy.mapping
模塊來實(shí)現(xiàn)多個(gè)與地圖生產(chǎn)和打印有關(guān)的地理處理任務(wù)。
創(chuàng)建頁面布局元素列表
在地理處理腳本中,自動(dòng)化地圖生產(chǎn)的第一步通常是生成一個(gè)頁面布局元素的列表。舉個(gè)例子,你可能想在地圖打印或創(chuàng)建PDF文件之前修改地圖的標(biāo)題。在本案例中,標(biāo)題內(nèi)容保存在一個(gè)文本元素中(text element)。你可以先生成一個(gè)地圖頁面視圖中的文本元素列表然后再修改地圖標(biāo)題,其中第一步就是生成文本元素列表。
Getting ready
ArcMap中有兩種視圖形式,分別為數(shù)據(jù)視圖(data view)和頁面視圖(layout view)。數(shù)據(jù)視圖是在不考慮任何特定頁面大小或布局的情況下瀏覽地理數(shù)據(jù)和屬性數(shù)據(jù),分析數(shù)據(jù),符號(hào)化圖層以及管理數(shù)據(jù)。頁面視圖如同將地圖打印在紙張上面,通過增加地圖元素用來創(chuàng)建產(chǎn)品級(jí)別的地圖。這些地圖元素包括地圖圖框,圖層,圖例,標(biāo)題,指北針,比例尺以及標(biāo)題欄。頁面布局中的每一個(gè)對(duì)象都作為arcpy.mapping
中的一個(gè)頁面布局元素類。這些頁面布局元素類的示例見下圖:
我們可以為每一個(gè)元素賦唯一的元素名稱,這樣就可以在程序中訪問這些元素。名稱是在ArcMap中定義的。arcpy.mapping
模塊提供了一個(gè)ListLayoutElements()
函數(shù)來返回包含所有頁面布局元素的列表。在本案例中,你將學(xué)習(xí)如何使用ListLayoutElements()
函數(shù)來生成頁面布局元素列表。
How to do it...
按照以下步驟學(xué)習(xí)如何生成頁面布局元素列表:
1.在ArcMap中打開C:\ArcpyBook\Ch5\Crime_Ch5.mxd
文件。
2.打開Python窗口。
3.導(dǎo)入arcpy.mapping
模塊:
import arcpy.mapping as mapping
4.引用當(dāng)前活動(dòng)的地圖文檔(Crime_Ch5.mxd
)并將該引用賦值給變量:
mxd = mapping.MapDocument("CURRENT")
5.生成頁面布局元素列表,如果元素名稱屬性不為空的則將元素名稱輸出到屏幕上:
for el in mapping.ListLayoutElements(mxd):
if el.name != "":
print el.name
6.完整代碼如下:
import arcpy.mapping as mapping
mxd = mapping.MapDocument("CURRENT")
for el in mapping.ListLayoutElements(mxd):
if el.name != "":
print el.name
7.運(yùn)行腳本后結(jié)果如下:
Crime_Inset
Alternating Scale Bar
Legend Test Performance
Crime Legend
North Arrow
Inset_Map
Test_Performance
Crime
How it works...
ListLayoutElements()
函數(shù)以多種頁面布局類的形式返回到頁面布局元素列表。元素可以是以下對(duì)象實(shí)例:GraphicElement,LegendElement,PictureElement,TextElement
或者是MapSourroundElement
。每一個(gè)元素都可以賦唯一名稱。不要求為每一個(gè)元素賦予名稱,不過這在通過腳本來訪問這些元素的時(shí)候就會(huì)很有用。在腳本中,我們?cè)谳敵鲈孛Q前先確認(rèn)元素是否被賦了名稱。這樣處理的原因在于ArcMap并不要求頁面布局要素一定要賦一個(gè)名稱。
為頁面布局元素賦予唯一名稱
在ArcMap中給所有的頁面布局元素賦唯一名稱是一個(gè)良好的習(xí)慣。這在地理處理腳本需要對(duì)某一元素進(jìn)行修改的時(shí)候就會(huì)很重要。比如,你可能需要更新公司logo的圖標(biāo)。不需要人工來更新所有的地圖文檔文件,你只需要編寫一個(gè)地理處理腳本通過程序的方式讓所有地圖文檔文件中使用新的圖標(biāo)。不過要實(shí)現(xiàn)這一想法,你就需要為頁面布局元素賦予唯一名稱。這樣你就可以訪問單個(gè)頁面布局元素了。
Getting ready
正如我前一個(gè)案例中提過到的,每個(gè)頁面布局元素隸屬于某種頁面元素類并且都可以賦一個(gè)名稱。元素名稱可以在Python腳本中用于引用某個(gè)特定元素。你可以在ArcMap中為每個(gè)頁面布局元素賦予唯一名稱。在本案例中,你會(huì)使用ArcMap來為頁面布局元素賦名稱。
How to do it...
按照以下步驟來學(xué)習(xí)如何在ArcMap中給頁面布局元素賦名稱:
1.在ArcMap中打開C:\ArcpyBook\Ch5\Crime_Ch5.mxd
文件。
2.切換至頁面視圖,你將看到如下圖類似的界面:
3.根據(jù)元素類型不同元素名稱的賦予方式也不同。點(diǎn)擊最上方的數(shù)據(jù)框Crime。如下圖所示會(huì)出現(xiàn)選擇句柄:
4.右鍵單擊Crime
數(shù)據(jù)框選擇屬性(Properties)彈出數(shù)據(jù)框?qū)傩裕―ata Frame Properties)對(duì)話框,如下圖所示。名稱****(Name)屬性定義了該元素名稱。在本案例中,該元素名稱為Crime
:
5.關(guān)閉數(shù)據(jù)框?qū)傩裕―ata Frame Properties)對(duì)話框。
6.在頁面視圖下選擇2009 Crime Legend,右鍵單擊該元素選擇屬性(Properties)彈出屬性窗口。
7.設(shè)置圖例的元素名稱不同于數(shù)據(jù)框。點(diǎn)擊大小和位置(Size and Position)選項(xiàng)卡。
8.元素名稱(Element Name)文本框則是用來設(shè)置該頁面元素的名稱。如下圖所示,修改為2009 Crime Legend
:
9.你還可以定義文本元素名稱。選擇標(biāo)題元素(Crime and Its Impact on School Test Performance
),右鍵單擊該元素選擇屬性(Properties)。
10.如下圖所示,點(diǎn)擊大小和位置(Size and Position)選項(xiàng)卡來定義該元素名稱:
How it works...
頁面視圖中的每一個(gè)元素都可以賦一個(gè)名稱,該名稱可以在地理處理腳本中用于訪問指定元素。你應(yīng)該盡量為每個(gè)元素定義一個(gè)名稱。盡管并一定去為每一個(gè)元素定義一個(gè)唯一的元素名稱,甚至還可以為所有元素賦予一個(gè)名稱,不過如果你想通過Python腳本來訪問這些頁面元素的話,最好的做法就是給每個(gè)頁面元素賦名稱并確保每一個(gè)元素名稱都是唯一的。你還應(yīng)盡量保證元素名稱僅包含字母和下劃線。
There's more...
你可以在ListLayoutElements()
函數(shù)中使用頁面元素名稱作為通配符參數(shù)來限制該函數(shù)返回的頁面布局元素。在下一個(gè)案例中,你將學(xué)習(xí)如何使用通配符和元素類型參數(shù)來限制返回的頁面布局元素列表中的內(nèi)容。
調(diào)用ListLayoutElements()函數(shù)限制返回的頁面布局元素
頁面布局中會(huì)包含大量的頁面布局元素,對(duì)于某個(gè)特定的地處理腳本而言,許多頁面元素不需要的。ListLayoutElements()
函數(shù)通過兩個(gè)參數(shù)來限制返回的頁面布局元素。第一個(gè)參數(shù)用來定義需要返回的元素類型,第二個(gè)參數(shù)使用通配符來查找要返回的元素。
Getting ready
頁面布局元素包含了圖形(graphic),圖例(legend),圖片(picture),文本(text)以及數(shù)據(jù)框(data frame)等多種元素類型。當(dāng)需要返回頁面布局元素列表時(shí),你可以限制返回的元素類型。在本案例中,你將編寫腳本通過元素類型和通配符參數(shù)來篩選返回的頁面布局元素。
How to do it...
按照以下步驟學(xué)習(xí)如何通過定義返回的元素類型和通配符來限制ListLayoutElements()
函數(shù)返回的頁面布局元素:
1.在ArcMap中打開C:\ArcpyBook\Ch5\Crime_Ch5.mxd
文件。
2.打開Python窗口。
3.導(dǎo)入arcpy.mapping
模塊:
import arcpy.mapping as mapping
4.引用當(dāng)前活動(dòng)的地圖文檔(Crime_Ch5.mxd
)并將該引用賦值給變量:
mxd = mapping.MapDocument("CURRENT")
5.調(diào)用ListLayoutElements()
函數(shù),并限制僅返回元素名稱包含Crime
文本的圖例元素:
for el in mapping.ListLayoutElements(mxd,"LEGEND_ELEMENT","*Crime*"):
print el.name
6.運(yùn)行腳本。在本案例中,只返回一個(gè)頁面元素:
2009 Crime Legend
How it works...
ListLayoutElements()
是一個(gè)非常靈活的函數(shù),該函數(shù)最基本用法是用來返回地圖文檔頁面視圖中所有頁面布局元素的列表。不過該函數(shù)還提供了兩個(gè)可選參數(shù)用來篩選返回的列表內(nèi)容。第一個(gè)是元素類型篩選器用來指定想要返回的頁面布局元素類型。你還是可以提供一個(gè)通配符來篩選返回的列表內(nèi)容。兩個(gè)篩選器可以一起使用。比如,在本案例中我們指定僅返回元素名稱包含“Crime”
的LEGEND_ELEMENT
對(duì)象。函數(shù)返回了僅包含一個(gè)頁面布局元素的列表。
ListLayoutElements()
函數(shù)可使用以下元素類型篩選關(guān)鍵字參數(shù):DATAFRAME_ELEMENT,GRAPHIC_ELEMENT,LEGEND_ELEMENT,MAPSURROUND_ELEMENT,PICTURE_ELEMENT,TEXT_ELEMENT
更新頁面布局元素屬性
每一個(gè)頁面布局元素的屬性都可以通過程序來修改。比如,LegendElement
對(duì)象允許更改圖例在頁面中的位置,更改圖例標(biāo)題以及獲取圖例項(xiàng)等屬性。
Getting ready
頁面布局元素的類型包括圖形,圖例,文本,地圖以及圖片等。每一個(gè)頁面布局元素都對(duì)應(yīng)了arcpy.mapping
包中的一個(gè)類。你可以利用這些類提供的不同屬性在程序中來更改元素。
DataFrame
類提供了訪問地圖文檔中數(shù)據(jù)框?qū)傩缘墓δ堋T搶?duì)象可使用地圖單位也可以使用頁面布局單位。比如像位置和大小等這類的頁面布局屬性可以通過elementPositionX,elementPositionY,elementWidth,elementHeight
屬性來設(shè)置。
GraphicElement
類是一個(gè)更為通用的元素類型,像插入表,圖,輪廓線,標(biāo)記,線以及多邊形等圖形都可以添加到頁面布局中。如果你想通過Python腳本來訪問每一個(gè)圖形元素的話,你需要為每一個(gè)圖形元素設(shè)置name
屬性(其他的頁面布局元素同理)。
LegendElement
提供調(diào)整圖例位置和修改圖例標(biāo)題的功能,同時(shí)也提供訪問圖例項(xiàng)以及關(guān)聯(lián)的父數(shù)據(jù)框的功能。LegendElement
對(duì)象僅與單個(gè)數(shù)據(jù)框有關(guān)聯(lián)。
MapsurroundElement
包括指北針,圖示比例尺以及文本比例尺,與LegendElement
一樣也是與單個(gè)數(shù)據(jù)框有關(guān)聯(lián)。該對(duì)象包含的屬性可以用于重新調(diào)整其在頁面布局中的位置。
PictureElement
指頁面布局中的柵格或圖片。該對(duì)象最常用的屬性是獲取并設(shè)置數(shù)據(jù)源,當(dāng)你需要在多個(gè)地圖文檔中更新某個(gè)圖片(比如說logo)的時(shí)候就會(huì)相當(dāng)有幫助。比如,你可以編寫腳本遍歷所有的地圖文檔文件將當(dāng)前的圖片替換為新的logo圖片。你還可以重新定位或縮放對(duì)象。
TextElement
是指頁面布局中的文本信息,包括插入的文本,注釋,文本框以及標(biāo)題等,但不包括圖例標(biāo)題以及插入圖表中的文本。該對(duì)象提供的屬性可用于修改文本字符串內(nèi)容,這在需要在頁面布局多個(gè)位置或多個(gè)地圖文檔中修改相同文本字符串的時(shí)候會(huì)極為有用。當(dāng)然,該對(duì)象也支持重新定位文本的功能。
頁面布局中的返回的每一個(gè)元素都是某類元素對(duì)象的一個(gè)實(shí)例。在本案例中,我們將通過程序使用Legend
對(duì)象中的title
屬性來更改Crime
圖例的標(biāo)題并獲取圖例項(xiàng)所引用的圖層對(duì)象列表。
How to do it...
按照以下步驟來學(xué)習(xí)如何更新某個(gè)頁面布局元素的屬性:
1.在ArcMap中打開C:\ArcpyBook\Ch5\Crime_Ch5.mxd
文件。
2.打開Python窗口。
3.導(dǎo)入arcpy.mapping
模塊:
import arcpy.mapping as mapping
4.引用當(dāng)前活動(dòng)的地圖文檔(Crime_Ch5.mxd
)并將該引用賦值給變量:
mxd = mapping.MapDocument("CURRENT")
5.調(diào)用ListLayoutElements()
函數(shù),并限制僅返回元素名稱包含Crime
文本的圖例元素,并將返回結(jié)果賦給變量:
elLeg = mapping.ListLayoutElements(mxd,"LEGEND_ELEMENT","*Crime*")[0]
6.使用title
屬性來更新圖例的標(biāo)題:
elLeg.title = "Crimes by School District"
7.獲取圖例項(xiàng)中引用的圖層對(duì)象列表并打印圖層名稱:
for item in elLeg.listLegendItemLayers():
print item.name
8.完整腳本如下:
import arcpy.mapping as mapping
mxd = mapping.MapDocument("CURRENT")
elLeg = mapping.ListLayoutElements(mxd,"LENEND_ELEMENT","*Crime*")[0]
elLeg.title = "Crimes by School District"
for item in elLeg.listLegendItemLayers():
print item.name
9.運(yùn)行腳本。你會(huì)看到下面的圖層打印到屏幕上:
Burglaries in 2009
Crime Density by School District
10.更新后的結(jié)果如下圖所示:
How it works...
每個(gè)頁面布局元素均提供了一組屬性和方法。在該案例中,我們使用了Legend
對(duì)象的title
屬性。該對(duì)象的其他屬性可以用于設(shè)置元素的寬度和高度,位置以及其他屬性。Legend
對(duì)象提供的方法可以用于調(diào)整圖例顯示的列數(shù),列出元素項(xiàng)以及移除和更新元素項(xiàng)等。
獲取可用打印機(jī)列表
ListPrinterNames()
函數(shù)是arcpy
提供的另一個(gè)列表函數(shù),該函數(shù)用于生成一個(gè)當(dāng)前可用的打印機(jī)列表。跟我們之前介紹的其他列表函數(shù)一樣,ListPrinterNames()
函數(shù)通常是作為多步驟流程腳本中開始步驟。
Getting ready
在調(diào)用PrintMap()
函數(shù)打印地圖之前,通常的做法是先調(diào)用ListPrinterNames()
函數(shù),該函數(shù)將會(huì)返回本地計(jì)算機(jī)上可用的打印機(jī)列表。某個(gè)特定的打印機(jī)可通過迭代返回的打印機(jī)列表來查找并作為PrintMap()
函數(shù)的輸入?yún)?shù)。
How to do it..
按照以下步驟來學(xué)習(xí)如何在腳本中調(diào)用ListPrinterNames()
函數(shù)來返回可用的打印機(jī)列表:
1.在ArcMap中打開C:\ArcpyBook\Ch5\Crime_Ch5.mxd
文件。
2.打開Python窗口。
3.導(dǎo)入arcpy.mapping
模塊:
import arcpy.mapping as mapping
4.引用當(dāng)前活動(dòng)的地圖文檔(Crime_Ch5.mxd
)并將該引用賦值給變量:
mxd = mapping.MapDocument("CURRENT")
5.調(diào)用ListPrinterNames()
函數(shù)并打印每一個(gè)打印機(jī)的名稱:
for printName in mapping.ListPrinterNames():
print printName
6.運(yùn)行腳本。輸出的結(jié)果依賴于你的計(jì)算機(jī)中可用的打印機(jī)列表。不過,輸出的結(jié)果應(yīng)該類似于下面的情況:
HP Photosmart D110 series
HP Deskjet 3050 J610 series (Network)
HP Deskjet 3050 J610 series (Copy 1)
HP Deskjet 3050 J610 series
Dell 968 AIO Printer
How it works...
ListPrinterNames()
函數(shù)返回的列表中包含了當(dāng)前所有可用的打印機(jī)。之后你可以調(diào)用PrintMap()
函數(shù)將打印任務(wù)提交給計(jì)算機(jī)中的某一個(gè)打印機(jī),這部分內(nèi)容將會(huì)在下一個(gè)案例中介紹。
調(diào)用PrintMap()函數(shù)打印地圖
使用PrintMap()
函數(shù)將地圖文檔布局發(fā)送給打印機(jī)很容易實(shí)現(xiàn)。默認(rèn)情況下打印任務(wù)將會(huì)發(fā)送到隨地圖文檔保存的默認(rèn)打印機(jī),不過你可以指定打印任務(wù)要發(fā)送的打印機(jī)。
Getting ready
arcpy.mapping
模塊提供的PrintMap()
函數(shù)用于打印ArcMap中的地圖文檔布局或數(shù)據(jù)框。調(diào)用該函數(shù)之前,通常的步驟是先調(diào)用ListPrinterNames()
函數(shù)。某個(gè)特定的打印機(jī)可通過迭代返回的打印機(jī)列表來查找并作為PrintMap()
函數(shù)的輸入?yún)?shù)。
PrintMap()
函數(shù)用于打印某特定數(shù)據(jù)框或地圖文檔布局。默認(rèn)情況下,該函數(shù)會(huì)使用隨地圖文檔保存的默認(rèn)打印機(jī),如果地圖文檔中未提供默認(rèn)打印機(jī)則使用系統(tǒng)默認(rèn)打印機(jī)。正如之前所提到的,你還可以使用ListPrinterNames()
函數(shù)獲取可用的打印機(jī)列表,然后選擇其中一個(gè)打印機(jī)作為PrintMap()
函數(shù)的輸入?yún)?shù)。在本案例中,你將學(xué)習(xí)如何時(shí)候調(diào)用PrintMap()
函數(shù)來打印地圖文檔頁面布局。
How to do it...
按照以下步驟來學(xué)習(xí)如何調(diào)用PrintMap()
函數(shù)打印ArcMap中的頁面視圖:
1.在ArcMap中打開C:\ArcpyBook\Ch5\Crime_Ch5.mxd
文件。
2.打開Python窗口。
3.導(dǎo)入arcpy.mapping
模塊:
import arcpy.mapping as mapping
4.引用當(dāng)前活動(dòng)的地圖文檔(Crime_Ch5.mxd
)并將該引用賦值給變量:
mxd = mapping.MapDocument("CURRENT")
5.如果找到Test_Performance數(shù)據(jù)框則打印該數(shù)據(jù)框:
for df in mapping.ListDataFrames(mxd):
if df.name == "Test_Performance":
mapping.PrintMap(mxd,"",df)
How it works...
PrintMap()
函數(shù)接受一個(gè)必選參數(shù)和幾個(gè)可選參數(shù)。必選參數(shù)是地圖文檔的引用。第一個(gè)可選參數(shù)是打印機(jī)名稱。在本案例中,我們沒有指定要使用的打印機(jī)。由于沒有指定打印機(jī),函數(shù)將使用隨地圖文檔保存的打印機(jī)或在地圖文檔未提供打印機(jī)的情況下使用系統(tǒng)默認(rèn)打印機(jī)。第二個(gè)可選參數(shù)是我們希望打印的數(shù)據(jù)框,在本案例中該參數(shù)是Test_Performance
數(shù)據(jù)框。其他的可選參數(shù)是輸出的打印文件以及圖像質(zhì)量,這些并未在案例中涉及。
將地圖導(dǎo)出為PDF文件
你可能只想將地圖或頁面視圖創(chuàng)建成可共享的PDF文件,而不是發(fā)送到打印機(jī)打印。Arcpy
中的制圖模塊提供的ExportToPDF()
函數(shù)可以完成此任務(wù)。
Getting ready
PDF是非常流行的跨平臺(tái)查看和打印的文件交換格式。arcpy
的制圖模塊中的ExportToPDF()
函數(shù)可將數(shù)據(jù)框或地圖頁面布局導(dǎo)出為PDF格式文件。默認(rèn)情況下ExportToPDF()
會(huì)導(dǎo)出地圖頁面布局,不過你可以傳遞一個(gè)可選參數(shù)來指定要導(dǎo)出的特定的數(shù)據(jù)框。在本案例中,你將學(xué)習(xí)如何將地圖頁面布局和數(shù)據(jù)框?qū)С鰹镻DF文件。
How to do it...
按照以下步驟來學(xué)習(xí)如何將地圖導(dǎo)出為PDF文件:
1.在ArcMap中打開C:\ArcpyBook\Ch5\Crime_Ch5.mxd
文件。
2.打開Python窗口。
3.導(dǎo)入arcpy.mapping
模塊:
import arcpy.mapping as mapping
4.引用當(dāng)前活動(dòng)的地圖文檔(Crime_Ch5.mxd
)并將該引用賦值給變量:
mxd = mapping.MapDocument("CURRENT")
5.調(diào)用ExportToPDF()
函數(shù)導(dǎo)出地圖頁面布局:
mapping.ExportToPDF(mxd,r"C:\ArcpyBook\Ch5\Map_PageLayout.pdf")
6.運(yùn)行腳本。
7.打開創(chuàng)建的Map_PageLayout.pdf
文件,文件內(nèi)容類似于下圖所示:
8.現(xiàn)在我們要打印地圖文檔中的一個(gè)指定的數(shù)據(jù)框。如下所示修改腳本:
import arcpy.mapping as mapping
mxd = mapping.MapDocument("CURRENT")
for df in mapping.ListDataFrames(mxd):
if df.name == "Crime":
mapping.ExportToPDF(mxd,r"C:\ArcpyBook\Ch5\DataFrameCrime.pdf",df)
9.運(yùn)行腳本查看輸出的PDF文件。
How it works...
ExportToPDF()
函數(shù)接受兩個(gè)必選參數(shù),包括一個(gè)地圖文檔文件的引用參數(shù)以及輸出的PDF文件參數(shù)。我們編寫的第一個(gè)腳本中,函數(shù)接受了地圖文檔引用參數(shù)和輸出的PDF文件參數(shù)。我們并沒有傳遞用來指定輸出的數(shù)據(jù)框的可選參數(shù),因此ExportToPDF()
函數(shù)會(huì)輸出地圖頁面布局。該函數(shù)還接受許多可選參數(shù),包括一個(gè)指定的數(shù)據(jù)框參數(shù)以及許多與輸出內(nèi)容和輸出文件的質(zhì)量有關(guān)的參數(shù)。我們編寫的第二個(gè)腳本就指定了要導(dǎo)出的數(shù)據(jù)框參數(shù)。你可以參考ArcGIS幫助頁面來獲取每一個(gè)可選參數(shù)的詳細(xì)信息。
將地圖導(dǎo)出為圖片文件
我們還可以使用arcpy.mapping
模塊提供的眾多函數(shù)將地圖內(nèi)容或頁面視圖導(dǎo)出為圖片文件。圖片導(dǎo)出函數(shù)會(huì)根據(jù)所要?jiǎng)?chuàng)建的圖片文件類型不同而在函數(shù)名稱有所區(qū)別,不過函數(shù)接受的參數(shù)幾乎沒什么區(qū)別。
Getting ready
arcpy.mapping
模塊除了提供了將數(shù)據(jù)框和地圖頁面布局導(dǎo)出為PDF文件的功能外,還提供了許多可用于將地圖內(nèi)容導(dǎo)出為圖片文件的函數(shù)。支持導(dǎo)出的圖片格式包括AI,BMP,EMF,EPS,GIF,JPEG,SVG以及TIFF。每個(gè)函數(shù)接受的參數(shù)取決于所創(chuàng)建的圖片類型。這些函數(shù)中就包括ExportToJPEG(),ExportToGIF()
以及ExportToBMP()
等。在本案例中,你將學(xué)習(xí)如何將地圖導(dǎo)出為圖片文件。
How to do it...
按照以下步驟來學(xué)習(xí)如何將地圖文檔中的數(shù)據(jù)或頁面視圖導(dǎo)出為圖片文件:
1.在ArcMap中打開C:\ArcpyBook\Ch5\Crime_Ch5.mxd
文件。
2.打開Python窗口。
3.導(dǎo)入arcpy.mapping
模塊:
import arcpy.mapping as mapping
4.引用當(dāng)前活動(dòng)的地圖文檔(Crime_Ch5.mxd
)并將該引用賦值給變量:
mxd = mapping.MapDocument("CURRENT")
5.將Crime
數(shù)據(jù)框?qū)С鰹橐粋€(gè)JPEG文件:
for df in mapping.ListDataFrames(mxd):
if df.name == "Crime":
mapping.ExportToJPEG(mxd,r"C:\ArcpyBook\Ch5\DataFrameCrime.jpg",df)
6.運(yùn)行腳本查看輸出結(jié)果。
7.現(xiàn)在我們使用一個(gè)可選參數(shù)來輸出一個(gè)帶有world文件(坐標(biāo)文件)的影像文件。如下所示修改腳本:
import arcpy.mapping as mapping
mxd = mapping.MapDocument("CURRENT")
for df in mapping.ListDataFrames(mxd):
if df.name == "Crime":
mapping.ExportToJPEG(mxd,r"C:\ArcpyBook\Ch5\DataFrameCrime2.jpg",df,world_file=True)
8.運(yùn)行腳本。我們會(huì)看到一個(gè)DataFrameCrime2.jpw
新文件。用文本編輯器打開該文件,將看到如下內(nèi)容:
470.520239851286190
0.000000000000000
0.000000000000000
-496.256971063348490
1972178.761771137800000
13815440.387677660000000
How it works...
你會(huì)注意到ExportToJPEG()
函數(shù)與ExportToPDF()
函數(shù)看起來很像。需要注意的一點(diǎn)是所有的導(dǎo)出函數(shù)在可選參數(shù)是有區(qū)別的。每一個(gè)ExportTo<Type>
函數(shù)會(huì)根據(jù)創(chuàng)建的文件類型的不同而接受的參數(shù)也不同。
調(diào)用PDFDocumentCreate()和PDFDocumentOpen()函數(shù)創(chuàng)建地圖冊(cè)
對(duì)于GIS專業(yè)人員來講,創(chuàng)建地圖冊(cè)與他人共享是很普遍的事情。地圖冊(cè)可以簡(jiǎn)單理解為針對(duì)某一特定區(qū)域的地圖集,通常還會(huì)包含一個(gè)索引圖。考慮到PDF作為常用的交換格式,地圖冊(cè)通常為PDF格式文件。
Getting ready
除了可將地圖導(dǎo)出為PDF文件,你還可以管理現(xiàn)有PDF文件或創(chuàng)建新的PDF文件。你可以合并頁面,設(shè)置文檔打開方式,添加文件附件以及創(chuàng)建或更改文檔安全性設(shè)置。PDFDocumentOpen()
函數(shù)用于打開一個(gè)現(xiàn)有PDF文件來進(jìn)行管理操作。PDFDocumentCreate()
函數(shù)則會(huì)創(chuàng)建一個(gè)新的PDF文件。這些函數(shù)經(jīng)常用來創(chuàng)建地圖冊(cè),本案例中我們就學(xué)習(xí)如何創(chuàng)建地圖冊(cè)。
How to do it...
1.打開IDLE,創(chuàng)建一個(gè)新的腳本窗口。
2.導(dǎo)入arcpy.mapping
和os
模塊:
import arcpy.mapping as mapping
import os
3.設(shè)置要?jiǎng)?chuàng)建的地圖冊(cè)的路徑和文件名。如果該文件已存在則刪除:
pdfPath = r"C:\ArcpyBook\Ch5\CrimeMapBook.pdf"
if os.path.exists(pdfPath):
os.remove(pdfPath)
4.創(chuàng)建PDF文檔對(duì)象:
pdfDoc = mapping.PDFDocumentCreate(pdfPath)
5.添加已有的PDF頁面到剛創(chuàng)建的PDF文件中:
pdfDoc.appendPages(r"C:\ArcpyBook\Ch5\Map_PageLayout.pdf")
pdfDoc.appendPages(r"C:\ArcpyBook\CH5\Map_DataFrameCrime.pdf")
6.接受對(duì)文檔的更改并保存:
pdfDoc.saveAndClose()
7.完整代碼如下所示:
import arcpy.mapping as mapping
import os
pdfPath = r"C:\ArcpyBook\Ch5\CrimeBook.pdf"
if os.path.exists(pdfPath):
os.remove(pdfPath)
pdfDoc = mapping.PDFDocumentCreate(pdfPath)
pdfDoc.appendPages(r"C:\ArcpyBook\Ch5\Map_PageLayout.pdf")
pdfDoc.appendPages(r"C:\ArcpyBook\Ch5\Map_DataFrameCrime.pdf")
pdfDoc.saveAndClose()
8.運(yùn)行腳本。
9.查看新創(chuàng)建的地圖冊(cè)文件C:\ArcpyBook\Ch5\CrimeBook.pdf
。該地圖冊(cè)會(huì)包含我們?cè)谇懊娴陌咐猩蓛蓚€(gè)的PDF文件的內(nèi)容。
How it works...
PDFDocumentCreate()
函數(shù)接受文件路徑和文件名參數(shù)創(chuàng)建一個(gè)新的PDF文件。該P(yáng)DF文件在你向其中插入或添加其他PDF頁面或調(diào)用PDFDocument.saveAndClose()
方法前并不會(huì)真在在磁盤中創(chuàng)建。appendPages()
和insertPages()
方法分別用于向PDF文件中增加頁面或插入頁面。
PDFDocumentOpen()
函數(shù)接受一個(gè)PDF地址參數(shù)并返回一個(gè)PDFDocument
類的實(shí)例。文檔打開后,你就可以修改PDF文件屬性,向文檔中添加或插入文件或添加文件附件。執(zhí)行完所有操作后需調(diào)用PDFDocument.saveAndClose()
方法來保存這些修改。
There's more...
通過PDFDocument
對(duì)象可以設(shè)置許多PDF文件屬性,包括頁面數(shù)量,附件,標(biāo)題,作者,摘要,關(guān)鍵字,打開方式以及頁面布局等。你還可以調(diào)用
PDFDocument.updateDocSecurity()
設(shè)置密碼,加密和安全性限制等機(jī)制來更改文檔的安全性設(shè)置。