日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python笔记之ArcPy简介

發(fā)布時(shí)間:2023/12/10 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python笔记之ArcPy简介 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第1章?ArcPy簡(jiǎn)介

1.1什么是 ArcPy

ArcPy 是一個(gè)以成功的 arcgisscripting 模塊為基礎(chǔ)并繼承了 arcgisscripting 功能進(jìn)而構(gòu)建而成的站點(diǎn)包。目的是為以實(shí)用高效的方式通過 Python 執(zhí)行地理數(shù)據(jù)分析、數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)管理和地圖自動(dòng)化創(chuàng)建基礎(chǔ)。

該包提供了豐富純正的 Python 體驗(yàn),具有代碼自動(dòng)完成功能(輸入關(guān)鍵字和點(diǎn)即可獲得該關(guān)鍵字所支持的屬性和方法的彈出列表;從中選擇一個(gè)屬性或方法即可將其插入),并針對(duì)每個(gè)函數(shù)、模塊和類提供了參考文檔。

Python 中使用 ArcPy 的另一個(gè)主要原因是,Python 是一種通用的編程語(yǔ)言。Python 是一種支持動(dòng)態(tài)輸入的解釋型語(yǔ)言,適用于交互式操作以及為稱為腳本的一次性程序快速制作原型,同時(shí)其具有編寫大型應(yīng)用程序的強(qiáng)大功能。用 ArcPy 編寫的 ArcGIS 應(yīng)用程序的優(yōu)勢(shì)在于,可以使用由來自多個(gè)不同領(lǐng)域的 GIS 專業(yè)人員和程序員組成的眾多 Python 小群體開發(fā)的附加模塊。

?

1.2 ArcPy 快速瀏覽

利用 ArcPy 可訪問地理處理工具和其他函數(shù)、類和模塊,使用它們可快速輕松地創(chuàng)建簡(jiǎn)單或復(fù)雜工作流。使用以 ArcPy 編寫的 ArcGIS 應(yīng)用程序和腳本的優(yōu)勢(shì)在于,可以訪問并使用由來自多個(gè)不同領(lǐng)域的 GIS 專業(yè)人員和程序員開發(fā)的大量 Python 模塊。

一般來說,ArcPy 按工具、環(huán)境、函數(shù)、類和模塊進(jìn)行組織。

1、運(yùn)行工具

以下示例顯示了如何執(zhí)行緩沖區(qū)工具。執(zhí)行該工具時(shí),消息將默認(rèn)顯示在幫助部分中 Python 窗口的右側(cè)。

?

1.1 執(zhí)行緩沖區(qū)工具

>>> arcpy.Buffer_analysis("c:/data/Portland.gdb/streets", "c:/data/Portland.gdb/steets_buffer", "500 METERS")

?

以下是另一個(gè)運(yùn)行工具的示例。該示例使用的是數(shù)據(jù)管理工具箱和轉(zhuǎn)換工具箱中的工具。向輸入 streets 要素類添加一個(gè)字段并計(jì)算該字段,然后將要素類加載到 ArcSDE 企業(yè)級(jí)地理數(shù)據(jù)庫(kù)中。

?

1.2?執(zhí)行多個(gè)工具

>>> arcpy.AddField_management("c:/data/Portland.gdb/streets", "LENGTH_MILES", "TEXT")

>>> arcpy.CalculateField_management("c:/data/Portland.gdb/streets", "LENGTH_MILES", "!shape.length@miles!", "PYTHON_9.3")

>>> arcpy.FeatureClassToFeatureClass_conversion("c:/data/Portland.gdb/streets", "Database Connections/MySDE.sde/PortlandDataset", "streets")

?

執(zhí)行地理處理工具時(shí),工具的結(jié)果會(huì)返回到 result 對(duì)象中。通常,該對(duì)象是由工具生成或更新的輸出數(shù)據(jù)集的路徑。在其他情況下,它可能會(huì)包含其他類型的值,如數(shù)值或布爾值。如果工具的輸出是多值參數(shù),則這些值可在列表中以列表的形式返回。

以下代碼示例顯示了如何捕獲返回值以及這些值的具體內(nèi)容:

返回輸出要素類的路徑,該結(jié)果可用作其他函數(shù)的輸入;返回要素?cái)?shù)目。

?

1.3?從工具獲取結(jié)果

>>> result = arcpy.Buffer_analysis("rivers", "riverBuf", "50 METERS")

>>> print?result

C:\Portland\Portland_OR.gdb\riverBuf

>>> arcpy.Clip_analysis("streets", result, "streets_50m_of_rivers")

>>> result = arcpy.GetCount_management("streets_50m_of_rivers")

>>> print?result.getOutput(0)

54

?

2、使用環(huán)境設(shè)置

可將地理處理環(huán)境設(shè)置視為影響工具執(zhí)行結(jié)果的附加參數(shù)。這些參數(shù)與正常的工具參數(shù)不同,因?yàn)樗鼈兪峭ㄟ^工具單獨(dú)進(jìn)行設(shè)置的,并且供工具在運(yùn)行時(shí)查詢和使用。諸如感興趣區(qū)域輸出數(shù)據(jù)集的坐標(biāo)系以及新柵格數(shù)據(jù)集的 像元大小等環(huán)境設(shè)置均可通過工具進(jìn)行指定和支持。

可通過 env 類來獲得屬性形式的環(huán)境設(shè)置。這些屬性可用于檢索和設(shè)置當(dāng)前環(huán)境值。下面是如何使用環(huán)境值的示例:

?

1.4 設(shè)置工作空間環(huán)境

>>> arcpy.env.workspace = "c:/data/Portland.gdb"

>>> arcpy.Buffer_analysis("streets", "streetBuf", "500 METERS")

>>> arcpy.env.spatialGrid1 = arcpy.CalculateDefaultSpatialGridIndex_management("streets").getOutput(0)

>>> if?arcpy.env.cellSize != 30:

????????arcpy.env.cellSize = 30

?

3、使用函數(shù)

函數(shù)是用于執(zhí)行某項(xiàng)特定任務(wù)并能夠納入更大的程序的已定義功能。除工具之外,ArcPy 還提供了多種函數(shù),用來更好地支持地理處理工作流。函數(shù)可用于列出某些數(shù)據(jù)集、檢索數(shù)據(jù)集的屬性、檢查數(shù)據(jù)是否存在、在將表添加到地理數(shù)據(jù)庫(kù)之前驗(yàn)證表名稱,或執(zhí)行其他許多有用的腳本任務(wù)。

以下示例代碼顯示的是獲得數(shù)據(jù)的屬性:

?

1.5 使用函數(shù)

import?arcpy

?

# prints True

print?arcpy.Exists("c:/data/Portland.gdb/streets")

?

# prints NAD_1983_StatePlane_Oregon_North_FIPS_3601_Feet

sr = arcpy.Describe("c:/data/Portland.gdb/streets").spatialReference

print?sr.name

?

4、使用類

ArcPy 類,如SpatialReference?和Extent?類,通常用作地理處理工具參數(shù)設(shè)置的快捷方式,否則的話,這些參數(shù)會(huì)使用更加復(fù)雜的字符串。類的作用類似于建筑設(shè)計(jì)藍(lán)圖。藍(lán)圖為如何創(chuàng)建事物提供了一個(gè)框架,而類則可用來創(chuàng)建對(duì)象,即通常所稱的實(shí)例。

?

1.6 使用類

import?arcpy

?

spatial_ref = arcpy.SpatialReference("Hawaii Albers Equal Area Conic")

?

5、使用模塊

ArcPy 包含涉及其他 ArcGIS 領(lǐng)域的模塊。有一系列模塊支持 ArcPy,包括數(shù)據(jù)訪問模塊?(arcpy.da)、制圖模塊?(arcpy.mapping)、ArcGIS Spatial Analyst擴(kuò)展模塊?(arcpy.sa) ArcGIS Network Analyst 擴(kuò)展模塊?(arcpy.na)

例如,arcpy.sa 模塊中的工具將使用 Spatial Analyst 工具箱中的工具,但被配置為支持“地圖代數(shù)”。因此,執(zhí)行 arcpy.sa.Slope 與執(zhí)行 Spatial Analyst 工具箱中的坡度工具的作用是相同的。

?

2章 使用ArcPy準(zhǔn)備工作

2.1?導(dǎo)入 ArcPy

在導(dǎo)入 ArcPy 之后,可以運(yùn)行隨 ArcGIS 安裝的標(biāo)準(zhǔn)工具箱中的所有地理處理工具。

?

2.1 導(dǎo)入ArcPy

# Importing arcpy

import?arcpy

?

模塊為通常包含函數(shù)和類的 Python 文件。有一系列模塊支持 ArcPy,包括制圖模塊(arcpy.mapping)、Spatial Analyst 模塊 (arcpy.sa) Geostatistical Analyst 模塊 (arcpy.ga)

要導(dǎo)入整個(gè)模塊,請(qǐng)使用導(dǎo)入模塊:

?

2.2?導(dǎo)入模塊

# Import only arcpy.mapping

import?arcpy.mapping

?

在很多情況下,用戶可能不想使用整個(gè)模塊或無需使用整個(gè)模塊。如果只導(dǎo)入某一模塊的一部分,可以使用 from-import 語(yǔ)句。在下例中,將導(dǎo)入 env 類(env 類包含所有地理處理環(huán)境)。現(xiàn)在無需以 arcpy.env 的形式訪問環(huán)境,而可以將其簡(jiǎn)化為 env。

?

2.3?導(dǎo)入部分模塊

# Import env from arcpy and set the workspace environment

from?arcpy?import?env

env.workspace = "c:/data"

?

遵循相同的思路,有時(shí)用戶可能需要注意:如何對(duì)模塊或模塊的一部分進(jìn)行標(biāo)識(shí)以使腳本更具可讀性,以及對(duì)于首選項(xiàng)來說默認(rèn)名稱可能過長(zhǎng)。在上述任一情況下,均可以使用 from-import-as 的形式。與先前的示例相同,下面的示例中也將導(dǎo)入 env 類,但會(huì)指定 ENV 作為 env 類的名稱:

?

2.4?使用別名

# Import env from arcpy as ENV and set the workspace environment

from?arcpy?import?env as?ENV

ENV.workspace = "c:/data"

?

模塊的內(nèi)容將被直接導(dǎo)入到命名空間中,這表示用戶隨后可以直接使用所有這些內(nèi)容,而無需為它們添加前綴。使用此方法存在一些風(fēng)險(xiǎn)。具有相同名稱的其他對(duì)象、變量、模塊等將被覆蓋,另外在使用大型模塊時(shí),命名空間可能會(huì)變得異常擁擠和雜亂。此方法可能導(dǎo)致在閱讀腳本時(shí)出現(xiàn)不確定或難以閱讀的情況。

但是在某些情況下,from-import-* 可以簡(jiǎn)化代碼,例如,在使用 ArcGIS Spatial Analyst 擴(kuò)展模塊的 sa 模塊的情況下。sa 模塊的優(yōu)勢(shì)之一在于,可以在一行中嵌套多個(gè)類和函數(shù)以生成輸出柵格對(duì)象。

?

2.5?直接導(dǎo)入

# Import arcpy and the sa module

import?arcpy

from?arcpy?import?sa

?

arcpy.CheckOutExtension("spatial")

?

# Get input parameters

inRaster1 = arcpy.GetParameterAsText(0)

inRaster2 = arcpy.GetParameterAsText(1)

inRaster3 = arcpy.GetParameterAsText(2)

?

outRaster = (sa.Raster(inRaster1) + (sa.Raster(inRaster2) - sa.Raster(inRaster3)))

?

2.2 地理處理環(huán)境設(shè)置(env

每個(gè)工具都含有一組用于執(zhí)行操作的參數(shù)。其中一些參數(shù)在所有工具中通用,如容差或輸出位置。這些參數(shù)可從所有工具在運(yùn)行期間使用的地理處理環(huán)境中獲得默認(rèn)值。執(zhí)行某一工具時(shí),當(dāng)前環(huán)境設(shè)置也可用作全局輸入?yún)?shù)值。諸如感興趣區(qū)域、輸出數(shù)據(jù)集的空間參考以及新柵格數(shù)據(jù)集的柵格像元大小等設(shè)置都可以使用地理處理環(huán)境指定。

1、獲取和設(shè)置環(huán)境設(shè)置

環(huán)境設(shè)置以env?類的屬性的方式公開。這些屬性可用于檢索或設(shè)置當(dāng)前值。每個(gè)環(huán)境設(shè)置都有一個(gè)名稱和一個(gè)標(biāo)注。標(biāo)注顯示在 ArcGIS 中的環(huán)境設(shè)置對(duì)話框上。名稱用在腳本或 ArcGIS 應(yīng)用程序的命令行中。下面是如何使用環(huán)境值的示例:

環(huán)境可作為環(huán)境類中的讀/寫屬性進(jìn)行訪問,方法為 arcpy.env.<環(huán)境名稱>。還可以利用 Python from-import 語(yǔ)句簡(jiǎn)化代碼,而不必為每個(gè)環(huán)境名稱都添加 arcpy.env 前綴。

?

2.6 設(shè)置環(huán)境值

import?arcpy

from?arcpy?import?env

?

# Set the workspace environment setting#

env.workspace = "c:/St_Johns/data.gdb"

?

# Set the XYTolerance environment setting#

env.XYTolerance = 2.5

?

# Calculate the default spatial grid index, divide in half, then

# ??set the spatial grid 1 environment setting#

result = arcpy.CalculateDefaultGridIndex_management("roads")

?

env.spatialGrid1 = float(result.getOutput(0)) / 2

?

# Clip the roads by the urban area feature class#

arcpy.Clip_analysis("roads","urban_area","urban_roads")

?

2.7 獲取和設(shè)置環(huán)境值

import?arcpy

from?arcpy?import?env

?

# Check the current raster cell size and make sure it is a certain size

# ??for standard output#

env.workspace = "c:/avalon/data"

?

if?env.cellSize < 10:

????env.cellSize = 10

elif?env.cellSize > 20:

????env.cellSize = 20

????

arcpy.HillShade_3d("island_dem", "island_shade", 300)

?

設(shè)置環(huán)境值時(shí)要注意拼寫和大小寫。將值指定給 arcpy.env.Workspace 與設(shè)置 arcpy.env.workspace(注:arcpy.env.workspace 是正確的格式)是不同的。

?

2、使用環(huán)境設(shè)置處理臨時(shí)數(shù)據(jù)

臨時(shí)地理數(shù)據(jù)庫(kù)臨時(shí)文件夾是提供保證存在的地理數(shù)據(jù)庫(kù)和文件夾位置的只讀環(huán)境。這意味著,您可以隨時(shí)可靠地使用地理數(shù)據(jù)庫(kù)或文件夾,而不必創(chuàng)建或管理一個(gè)。

?

2.8 處理臨時(shí)數(shù)據(jù)

import?arcpy

?

inputFC = arcpy.GetParameterAsText(0)

clipFC = arcpy.GetParameterAsText(1)

outputFC = arcpy.GetParameterAsText(2)

?

# Use scratchGDB environment to write intermediate data#

tempData = arcpy.CreateScratchName(workspace=arcpy.env.scratchGDB)

?

bufferResult = arcpy.Buffer_analysis(inputFC, tempData, "50 METERS")

arcpy.Clip_analysis(clipFC, bufferResult, outputFC)

?

3、重新設(shè)置環(huán)境

由于地理處理環(huán)境對(duì)工具操作和輸出有著很大的影響,因此需要保證能夠追蹤環(huán)境設(shè)置并在必要時(shí)將其重置為默認(rèn)狀態(tài)。

可使用ResetEnvironments?函數(shù)恢復(fù)默認(rèn)環(huán)境值,或者可以使用ClearEnvironment?函數(shù)重置特定環(huán)境。

?

2.9 重新設(shè)置環(huán)境

# Reset geoprocessing environment settings

arcpy.ResetEnvironments()

?

# Reset a specific environment setting

arcpy.ClearEnvironment("workspace")

?

4、env常用設(shè)置

環(huán)境設(shè)置以 ArcPy env 類的屬性的方式公開。這些屬性可用于檢索或設(shè)置當(dāng)前值??蓪⒌乩硖幚憝h(huán)境設(shè)置視為影響工具執(zhí)行結(jié)果的附加參數(shù)。

?

2-1 env常用屬性

屬性

說明

數(shù)據(jù)類型

cellSize

(讀寫)

支持像元大小環(huán)境設(shè)置的工具可以設(shè)置在操作時(shí)使用的輸出柵格像元大小或分辨率。默認(rèn)輸出分辨率由最粗糙的輸入柵格數(shù)據(jù)集決定。

String

extent

(讀寫)

支持輸出范圍環(huán)境的工具只會(huì)處理落入此設(shè)置中所指定范圍內(nèi)的要素或柵格。

String

mask

(讀寫)

支持掩膜環(huán)境的工具只會(huì)考慮運(yùn)行過程中落入分析掩膜范圍內(nèi)的像元。

String

nodata

(讀寫)

支持 NoData 環(huán)境設(shè)置的工具將僅處理其中 NoData 有效的柵格

String

spatialGrid1

spatialGrid2

spatialGrid3

(讀寫)

遵循輸出空間格網(wǎng) 12 3”環(huán)境的工具將創(chuàng)建具有指定空間索引格網(wǎng)的要素類(如果要素類支持空間索引格網(wǎng))。

Double

tileSize

(讀寫)

支持分塊大小環(huán)境的工具用于為存儲(chǔ)在數(shù)據(jù)塊中的柵格設(shè)置分塊大小。

String

workspace

(讀寫)

支持當(dāng)前工作空間環(huán)境設(shè)置的工具將指定的工作空間用作地理處理工具輸入和輸出的默認(rèn)位置。

String

XYDomain

(讀寫)

支持輸出 XY 屬性域環(huán)境的工具可為輸出地理數(shù)據(jù)集的 x,y 屬性域設(shè)置特定范圍。

String

XYResolution

(讀寫)

支持此環(huán)境的工具可將 x,y 分辨率應(yīng)用到輸出地理數(shù)據(jù)集中。

String

XYTolerance

(讀寫)

支持此環(huán)境的工具會(huì)覆蓋在地理數(shù)據(jù)庫(kù)內(nèi)創(chuàng)建的地理數(shù)據(jù)集上的默認(rèn) x,y 容差。

String

?

2.3 訪問許可和擴(kuò)展模塊

每當(dāng)在腳本中執(zhí)行工具時(shí),都會(huì)需要 ArcGIS 許可。此外,運(yùn)行 ArcGIS 擴(kuò)展模塊中的工具,如 ArcGIS Spatial Analyst 擴(kuò)展模塊,也需要針對(duì)該模塊的許可。如果無法獲得必要的許可,工具將運(yùn)行失敗并返回錯(cuò)誤消息。例如,如果您安裝有 ArcGIS for Desktop Basic 的許可,并試圖運(yùn)行需要 Standard Advanced 的許可,則工具將運(yùn)行失敗。

使用 ArcGIS for Desktop Basic Standard 許可時(shí),腳本應(yīng)將產(chǎn)品設(shè)置為 Basic Standard。同樣,使用 Engine EngineGeoDB 許可時(shí),腳本應(yīng)將產(chǎn)品設(shè)置為 Engine EngineGeoDB。如果未明確設(shè)置許可,將根據(jù)首次訪問 ArcPy 工具、函數(shù)或類時(shí)的最高可用許可等級(jí)初始化許可。

每種工具都將執(zhí)行檢查以確保具有相應(yīng)的許可。如果不具有所需的許可,工具將運(yùn)行失敗。為避免腳本在執(zhí)行到一半時(shí)失敗,可以在腳本開頭執(zhí)行檢查,以盡早發(fā)現(xiàn)失敗。

注意:只有在獨(dú)立腳本中才必須設(shè)置產(chǎn)品和擴(kuò)展模塊。如果從 Python 窗口運(yùn)行工具或者使用腳本工具,產(chǎn)品已在應(yīng)用程序內(nèi)進(jìn)行設(shè)置,激活的擴(kuò)展模塊取決于“擴(kuò)展模塊”對(duì)話框。

1、DesktopEngine/Server 許可

產(chǎn)品模塊會(huì)在導(dǎo)入 arcpy 前導(dǎo)入,以定義腳本使用的 Desktop 許可。CheckProduct?函數(shù)可用于檢查 Desktop 許可的可用性,而ProductInfo?函數(shù)能報(bào)告當(dāng)前的產(chǎn)品許可。

?

2.10 檢查ArcGIS for Desktop Advanced 許可。

import?sys

import?arcpy

?

arcpy.env.workspace = "c:/data/world.gdb"

?

if?arcpy.CheckProduct("ArcInfo") == "Available":

????arcpy.PolygonToLine_management("Lakes", "LakeLines")

else:

????msg = 'ArcGIS for Desktop Advanced license not available'

????print(msg)

????sys.exit(msg)

?

2、擴(kuò)展模塊許可

可以從許可管理器中獲取擴(kuò)展模塊許可,并在不再需要時(shí)將其歸還。CheckExtension?函數(shù)用于查看是否存在可為特定類型的擴(kuò)展模塊檢出的許可,而CheckOutExtension?會(huì)真正獲取許可。腳本獲取到擴(kuò)展模塊許可后,即可執(zhí)行擴(kuò)展模塊工具。腳本使用完特定擴(kuò)展模塊中的工具后,應(yīng)使用CheckInExtension?函數(shù)將許可歸還給許可管理器,以便其他應(yīng)用程序使用。當(dāng)腳本完成時(shí),所有檢出的擴(kuò)展模塊許可和設(shè)置的產(chǎn)品許可都將歸還給許可管理器。

下面的示例將執(zhí)行一些 ArcGIS 3D Analyst 工具,并將 Desktop 產(chǎn)品許可設(shè)置為 ArcGIS for Desktop Basic,因?yàn)閳?zhí)行擴(kuò)展模塊中的工具時(shí)不需要 ArcGIS for Desktop Advanced 的許可。如果未明確設(shè)置 ArcGIS for Desktop Basic 的許可,并且無可用的 ArcGIS for Desktop Advanced 許可,則腳本將失敗,因?yàn)檫\(yùn)行擴(kuò)展模塊工具需要 Desktop 許可。

?

2.11 檢查ArcGIS 3D Analyst 擴(kuò)展模塊許可

class?LicenseError(Exception):

????pass

?

# Set desktop license used to ArcGIS for Desktop Basic#

import?arcview

import?arcpy

from?arcpy?import?env

?

try:

????if?arcpy.CheckExtension("3D") == "Available":

????????arcpy.CheckOutExtension("3D")

????else:

????????# Raise a custom exception????????#

????????raise?LicenseError

????

????env.workspace = "D:/GrosMorne"

????arcpy.HillShade_3d("WesternBrook", "westbrook_hill", 300)

????arcpy.Aspect_3d("WesternBrook", "westbrook_aspect")

?

except?LicenseError:

????print?"3D Analyst license is unavailable"??

except:

????print?arcpy.GetMessages(2)

finally:

????# Check in the ArcGIS 3D Analyst 擴(kuò)展模塊????#

????arcpy.CheckInExtension("3D")

?

3Python調(diào)用地理處理工具

3.1 地理處理工具

1、地理處理

地理處理適合于各類使用 ArcGIS 的用戶。無論是初學(xué)者還是高級(jí)用戶,地理處理都可能是日常使用 ArcGIS 的重要組成部分。地理處理的基本目的是提供用于執(zhí)行分析和管理地理數(shù)據(jù)的工具和框架。地理處理所提供的建模和分析功能使得 ArcGIS 成為一個(gè)完整的地理信息系統(tǒng)。

地理處理提供了大量成套工具,用于執(zhí)行從簡(jiǎn)單的緩沖區(qū)和面疊加到復(fù)雜的回歸分析和影像分類等各項(xiàng) GIS 任務(wù)。執(zhí)行自動(dòng)操作的任務(wù)可以是普通任務(wù) - 例如,將大量數(shù)據(jù)從一種格式轉(zhuǎn)換為另一種格式。也可以是很有創(chuàng)造性的任務(wù),這些任務(wù)使用一序列操作對(duì)復(fù)雜的空間關(guān)系進(jìn)行建模和分析 - 例如,通過交通網(wǎng)絡(luò)計(jì)算最佳路徑、預(yù)測(cè)火勢(shì)路徑、分析和尋找犯罪地點(diǎn)的模式、預(yù)測(cè)哪些地區(qū)容易發(fā)生山體滑坡或預(yù)測(cè)暴雨事件造成的洪水影響。

2、常用地理處理工具

可將地理處理視為一種語(yǔ)言,其中名詞是地理數(shù)據(jù)(例如要素、表和柵格),而工具是動(dòng)詞(例如復(fù)制、裁剪和連接)。與任何語(yǔ)言一樣,需要知道一些名詞和動(dòng)詞才能進(jìn)行交流,而本部分(及后續(xù)內(nèi)容)向您介紹這些常見的地理處理動(dòng)詞(工具)。如果您不熟悉要素類和柵格等名詞,則地理信息元素概述可作為一份很好的入門材料。

最常用的 GIS 工具可自動(dòng)執(zhí)行一些以往手動(dòng)完成的任務(wù),例如,通過在一張地圖上方疊加另一張地圖來編譯新地圖,或者以物理方式將地圖剪切成表示特定研究區(qū)域的各個(gè)部分,然后更改其投影。在此類手動(dòng)執(zhí)行的任務(wù)中,有些任務(wù)操作起來非常困難和復(fù)雜,以至于它們阻礙了地理知識(shí)和數(shù)據(jù)的宣傳普及,而它們也是發(fā)明 GIS 的主要?jiǎng)恿Α?/span>

·?疊加分析和鄰域分析

兩個(gè)常用的工具集可以回答兩個(gè)最基本的地理問題:什么在什么之上?以及什么在什么附近?

·?表面分析

地理現(xiàn)象不僅僅局限于離散的點(diǎn)、線和面,還包括在地球表面(或正在研究的任何星球或物體)上連續(xù)變化的數(shù)據(jù),例如,高程、坡度、降雨量和溫度等。這種連續(xù)數(shù)據(jù)稱為表面并用柵格和 TIN 進(jìn)行建模。

·?空間統(tǒng)計(jì)數(shù)據(jù)和非空間統(tǒng)計(jì)數(shù)據(jù)

地理學(xué)中有這樣一條公理:事物的距離越近,其相似程度越高。該公理不僅為用來發(fā)現(xiàn)和表征地理模式且功能強(qiáng)大的空間統(tǒng)計(jì)工具奠定了基礎(chǔ),而且還為標(biāo)準(zhǔn)的非空間統(tǒng)計(jì)工具(如最小值、最大值、總和、頻率、均值和標(biāo)準(zhǔn)差)奠定了基礎(chǔ)。

·?表管理

ArcGIS 將數(shù)據(jù)存儲(chǔ)在易于訪問的表中,并且大部分工作流都包括某種表管理操作,例如,添加或刪除字段、創(chuàng)建表間關(guān)系或根據(jù)包含坐標(biāo)的列創(chuàng)建要素。

·?選擇和提取

GIS 數(shù)據(jù)集包含的數(shù)據(jù)通常遠(yuǎn)超出需求,而一組常見的任務(wù)可用于從較大且較復(fù)雜的數(shù)據(jù)集中減去數(shù)據(jù)或提取數(shù)據(jù)。

?

3、工具和工具箱

地理處理工具用于對(duì)地理數(shù)據(jù)執(zhí)行一些非常小但非常重要的操作,例如提取和疊加數(shù)據(jù)、更改地圖投影、向表中添加列、計(jì)算屬性值、面疊加和最優(yōu)路徑等等。您不僅用于數(shù)百種工具可供選用,還可通過模型構(gòu)建器(可視化編程語(yǔ)言)或腳本(文本編程語(yǔ)言)創(chuàng)建您自己的工具。

工具都儲(chǔ)存在工具箱中。ArcGIS 提供了數(shù)百種工具,并將它們進(jìn)行了分類并放到了十余個(gè)工具箱中,這些工具功能豐富、涉及領(lǐng)域廣泛。

?

3-1 ArcGIS 提供的工具箱

3.2 地理處理工具運(yùn)行方法

可以使用多種方法來執(zhí)行工具。最常見的方法是打開工具對(duì)話框,填入工具參數(shù),然后單擊確定執(zhí)行工具。對(duì)于系統(tǒng)工具,工具執(zhí)行操作在后臺(tái)進(jìn)行,這意味著在工具執(zhí)行的同時(shí)也可繼續(xù)在 ArcMap 中工作。工具執(zhí)行完成時(shí),將收到一條通知消息,可以在結(jié)果 窗口中查看有關(guān)工具執(zhí)行情況的信息。通常,工具創(chuàng)建的輸出會(huì)自動(dòng)添加到 ArcMap 內(nèi)容列表。

要執(zhí)行工具,首先必須找到該工具,方法是在搜索 窗口中搜索該工具或在目錄 窗口中瀏覽到該工具。

1、使用工具對(duì)話框執(zhí)行工具

要從搜索 窗口中打開工具對(duì)話框,請(qǐng)單擊該工具名稱。

?

3-2 搜索工具

?

要從目錄 窗口或 ArcToolbox 窗口中打開工具對(duì)話框,請(qǐng)雙擊該工具,或右鍵單擊并選擇打開。

?

3-3 打開工具

?

工具對(duì)話框打開后,填入工具的參數(shù)。各工具自己都有唯一一組參數(shù)。有些參數(shù)為必需參數(shù),只有填入這些參數(shù)(即,它們必須具有值)后工具才可執(zhí)行。其他參數(shù)為可選參數(shù),也就是說,可以將這些參數(shù)留空或接受其默認(rèn)值。工具具有輸入和輸出參數(shù)。輸入?yún)?shù)通常是現(xiàn)有數(shù)據(jù)集或選項(xiàng),它們控制著工具的功能。輸出參數(shù)通常是工具創(chuàng)建的新數(shù)據(jù)集。對(duì)于輸出數(shù)據(jù)集參數(shù),在您輸入一個(gè)或多個(gè)輸入?yún)?shù)后,將自動(dòng)創(chuàng)建輸出數(shù)據(jù)集名稱和位置。

2、使用模型構(gòu)建器執(zhí)行工具

模型構(gòu)建器是一款功能強(qiáng)大的應(yīng)用程序,通過它可將一系列工具串聯(lián)在一起,一個(gè)工具的輸出用作另一個(gè)工具的輸入,如下所示。

?

3-4 模型構(gòu)建器

?

在模型構(gòu)建器中,添加工具,打開其對(duì)話框,填入?yún)?shù),然后單擊確定按鈕。如果單擊確定后,工具并未執(zhí)行,那么必須運(yùn)行模型,該工具才能執(zhí)行。這樣可將多個(gè)工具串聯(lián)在一起,可以一次性執(zhí)行所有相關(guān)工具。

模型是自動(dòng)處理工作的方式。創(chuàng)建模型時(shí),保留可以使用不同輸入數(shù)據(jù)多次執(zhí)行的數(shù)據(jù)處理工作流。使用模型可自動(dòng)處理無數(shù)的任務(wù)。

3、通過 Python 窗口執(zhí)行工具

還可使用基于文本的編程語(yǔ)言(如 Python)來執(zhí)行工具。由于 Python 是基于文本的編程語(yǔ)言(而不是像模型構(gòu)建器那樣的可視化編程語(yǔ)言),因此要依次輸入工具名稱及其參數(shù)。在下圖所示的 Python 窗口中,您可以輸入 Python 代碼并立即執(zhí)行該代碼。

?

3-6 Python窗口

?

雖然與使用工具對(duì)話框相比,該工作顯得有些多余(誰(shuí)也不愿意輸入成批的代碼),但使用 Python Python 窗口具有很多優(yōu)勢(shì):

·?可以使用邏輯語(yǔ)句(如 if-then-else)進(jìn)行條件執(zhí)行或使用 for 循環(huán)遍歷數(shù)據(jù)集,也可訪問 Python 數(shù)據(jù)結(jié)構(gòu)(如字典和列表)。

·?可以訪問標(biāo)準(zhǔn) Python 模塊中的功能來對(duì)字符串、數(shù)學(xué)或文件和文件夾進(jìn)行操作。下圖中,glob 模塊被用于瀏覽系統(tǒng)文件夾中的所有文件。

·?Python 具有豐富的可用于操縱和變換數(shù)據(jù)的第三方模塊。

·?加載 ArcPy 站點(diǎn)包(在下圖中通過 import 語(yǔ)句進(jìn)行加載)時(shí),可以訪問所有地理處理工具以及許多用于逐行讀取要素、描述數(shù)據(jù)或與 ArcMap 交互的其他函數(shù)。例如,在下圖中,使用 ArcPy mapping模塊向當(dāng)前地圖中添加圖層。

?

3-7 代碼示例

?

4、通過 Python 腳本執(zhí)行工具

可在 Python 窗口中輸入代碼并立即將其進(jìn)行執(zhí)行。但您也可使用文本編輯器或集成開發(fā)環(huán)境 (IDE)(例如 PythonWin)在磁盤中創(chuàng)建 Python 文件(帶有 .py 擴(kuò)展名的文件)。這些文件(稱為腳本)是可從操作系統(tǒng)提示符或通過創(chuàng)建執(zhí)行腳本的腳本工具執(zhí)行的程序。腳本工具與所有其他地理處理工具一樣,可以在模型、Python 窗口或 Python 腳本中,通過其對(duì)話框來執(zhí)行腳本工具。

?

3.3 通過 Python 使用工具

1、工具參數(shù)與調(diào)用

每個(gè)地理處理工具都具有一組固定的參數(shù),這些參數(shù)為工具提供執(zhí)行所需的信息。工具通常包含多個(gè)輸入?yún)?shù)以定義一個(gè)或多個(gè)數(shù)據(jù)集,這些數(shù)據(jù)集一般用于生成新的輸出數(shù)據(jù)。參數(shù)具有幾個(gè)重要屬性:

·?每個(gè)參數(shù)具有一種或多種特定的數(shù)據(jù)類型,如要素類、整型、字符串或柵格。

·?參數(shù)為輸入值或輸出值。

·?參數(shù)需有值,或?yàn)榭蛇x。

·?各個(gè)工具參數(shù)都具有唯一的名稱。

?

Python 中使用工具時(shí),必須正確設(shè)置工具的參數(shù)值,以便在腳本運(yùn)行時(shí)工具可以執(zhí)行。一旦提供了一組有效的參數(shù)值,工具即準(zhǔn)備好執(zhí)行。參數(shù)將被指定為字符串或?qū)ο蟆?

字符串是唯一標(biāo)識(shí)參數(shù)值的簡(jiǎn)單文本,如數(shù)據(jù)集的路徑或關(guān)鍵字。在下面的代碼示例中,為緩沖區(qū)工具定義了輸入和輸出參數(shù)。請(qǐng)注意,工具名稱要追加其工具箱的別名。在該示例中,兩個(gè)字符串變量用于定義輸入和輸出參數(shù),以便對(duì)工具的調(diào)用更容易閱讀。

?

3-1 使用字符串作為參數(shù)

import?arcpy

?

roads = "c:/base/data.gdb/roads"

output = "c:/base/data.gdb/roads_Buffer"

?

# Run Buffer using the variables set above and pass the remaining

# parameters in as strings

arcpy.Buffer_analysis(roads, output, "distance", "FULL", "ROUND", "NONE")

?

對(duì)于部分參數(shù)(如空間參考),還可以指定對(duì)象。在下面的代碼示例中,使用其可選“坐標(biāo)系”參數(shù)的SpatialReference?對(duì)象執(zhí)行 創(chuàng)建要素類工具。

?

3-2 ?使用對(duì)象作為參數(shù)

import?arcpy

?

in_workspace = "c:/temp"

output_name = "rivers.shp"

?

# Create a spatial reference object

spatial_ref = arcpy.SpatialReference('North America Equidistant Conic')

?

# Run CreateFeatureclass using the spatial reference object

arcpy.CreateFeatureclass_management(

????in_workspace, output_name, spatial_reference=spatial_ref)

?

大部分地理處理工具同時(shí)包含必選參數(shù)和可選參數(shù)。通常,在許多情況下都存在多個(gè)不需要進(jìn)行指定的可選參數(shù)。有兩種方法可以處理這些未使用的參數(shù)。一個(gè)方法是保持所有可選參數(shù)有序,然后將您不需要的參數(shù)引用為空字符串 ""、井號(hào) "#" 或類型為 None 的參數(shù)。另一種方法是使用關(guān)鍵字參數(shù),并使用參數(shù)名稱來分配值。使用關(guān)鍵字參數(shù)可以跳過未使用的可選參數(shù)或以不同的順序指定它們。

?

3-3 ?使用空字符串跳過可選參數(shù)

import?arcpy

?

arcpy.AddField_management("schools", "school_id", "LONG", "", "", "", "", "NON_NULLABLE")

?

?

?

3-4 ?使用關(guān)鍵字參數(shù)跳過可選參數(shù)

import?arcpy

?

arcpy.AddField_management("schools", "school_id", "LONG", field_is_nullable="NON_NULLABLE")

?

2、工具輸出

當(dāng)作為Result?對(duì)象執(zhí)行時(shí),ArcPy 會(huì)返回工具的輸出值。結(jié)果對(duì)象的優(yōu)點(diǎn)是可以保留工具執(zhí)行的相關(guān)信息,包括消息、參數(shù)和輸出。即使在運(yùn)行了多個(gè)其他工具后仍可保留這些結(jié)果。

下面的示例說明了如何在執(zhí)行地理處理工具后獲取結(jié)果對(duì)象的輸出。

?

3-5 ?獲取結(jié)果對(duì)象的輸出

import?arcpy

?

arcpy.env.workspace = "c:/city/data.gdb"

?

# Geoprocessing tools return a result object of the derived

# output dataset.

result = arcpy.CopyFeatures_management("roads", "urban_roads")

?

# A print statement will display the string

# representation of the output.

print?result

?

# A result object can be indexed to get the output value.

# Note: a result object also has a getOutput() method that

# can be used for the same purpose.

result_value = result[0]

?

如果為結(jié)果對(duì)象建立索引或使用其 getOutput() 方法,那么返回值為 Unicode 字符串。當(dāng)使用派生輸出參數(shù)運(yùn)行諸如獲取計(jì)數(shù)(提供表中的記錄數(shù))或計(jì)算默認(rèn)拓?fù)淙莶?#xff08;提供拓?fù)淙莶钪?#xff09;之類的工具時(shí),需要重點(diǎn)考慮這一點(diǎn)。要將 Unicode 字符串轉(zhuǎn)換為所需類型,可使用 int() float() 等內(nèi)置 Python 函數(shù)。

注:派生參數(shù)不需要用戶的交互,并且不會(huì)在工具對(duì)話框上或作為 Python 中的工具的參數(shù)出現(xiàn)。輸出參數(shù)通常是“派生”類型。

?

3-6 ?派生輸出參數(shù)

import?arcpy

import?types

?

arcpy.env.workspace = "c:/base/data.gdb"

?

# Many geoprocessing tools return a result object of the derived

# output dataset.

result = arcpy.GetCount_management("roads")

result_value = result[0]

?

# The result object's getOutput method returns values as a

# unicode string. ?To convert to a different Python type, use

# built-in Python functions: str(), int(), long(), float()

count = int(result_value)

print?count

print?types.TypeType(count)

?

?

如果創(chuàng)建的輸出僅為大型工作流的一個(gè)中間階段,那么輸出參數(shù)可以省略,以便工具為輸出創(chuàng)建唯一路徑和名稱??梢酝ㄟ^將輸出設(shè)置為“#”或“None”來完成此操作,或如果輸出是所使用的最后一個(gè)參數(shù),則可以完全跳過此操作。在每種情況中,返回值都是新數(shù)據(jù)源的完整路徑。

?

3-7 ?輸出參數(shù)的省略

import?arcpy

arcpy.env.workspace = "c:/city/data.gdb"

?

result = arcpy.CopyFeatures_management("roads", "#")

result = arcpy.CopyFeatures_management("roads", "")

result = arcpy.CopyFeatures_management("roads")

?

3、ArcPy 中的工具組織

地理處理工具以兩種不同的方法進(jìn)行組織。所有工具均以 ArcPy 函數(shù)的形式提供,但也可以通過匹配工具箱別名的模塊調(diào)用。盡管幫助中的大多數(shù)示例都以 ArcPy 函數(shù)的形式顯示工具,但兩種方法同樣有效。使用哪一種方法具體取決于個(gè)人喜好和編碼習(xí)慣。在下面的示例中,使用兩種方法顯示獲取計(jì)數(shù)工具。

?

3-8 ?工具調(diào)用方式

import?arcpy

?

in_features = "c:/temp/rivers.shp"

?

# Tools can be accessed as functions on the arcpy module

arcpy.GetCount_management(in_features)

?

# Or from modules matching the toolbox name

arcpy.management.GetCount(in_features)

?

通過模塊使用工具時(shí),有時(shí)可能要注意標(biāo)識(shí)模塊的方式,以便腳本具有更好的可讀性。在這種情況下,可以使用格式 from - import - as。

?

?

3-9 ?標(biāo)識(shí)模塊的方式

# Clean up street centerlines that were digitized without

# having set proper snapping environments

import?arcpy

from?arcpy?import?edit as?EDIT

from?arcpy?import?management as?DM

?

streets = "c:/data/streets.gdb/majorrds"

streets_copy = "c:/output/Output.gdb/streetsBackup"

?

DM.CopyFeatures(streets, streets_copy)

EDIT.TrimLine(streets, "10 Feet", "KEEP_SHORT")

EDIT.ExtendLine(streets, "15 Feet", "EXTENSION")

?

3.4 示例:如何按照字段列表創(chuàng)建FeatureClass ?

1、創(chuàng)建Workspace

“工作空間”工具集包含一系列可創(chuàng)建 ArcGIS 所使用的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的工具。這些結(jié)構(gòu)包括工作空間、文件、兩種類型的地理數(shù)據(jù)庫(kù)、要素?cái)?shù)據(jù)集和一個(gè) ArcSDE 連接文件。

Shapefiles是文件類型的空間數(shù)據(jù)存儲(chǔ)格式,從而在“工作空間”工具集中選用“CreateFolder”工具來完成這一目標(biāo)。

CreateFolder_management (out_folder_path, out_name)

n?out_folder_path要?jiǎng)?chuàng)建文件夾的磁盤位置。數(shù)據(jù)類型為Folder

n?out_name:?要?jiǎng)?chuàng)建的文件夾。數(shù)據(jù)類型為String

?

3-10 ?CreateFolder

# Import system modules

import?arcpy

from?arcpy?import?env

?

# Set workspace

env.workspace = "C:/data"

?

# Set local variables

out_folder_path = "C:/output"?

out_name = "folder1"

?

# Execute CreateFolder

arcpy.CreateFolder_management(out_folder_path, out_name)

?

如果想創(chuàng)建文件地理數(shù)據(jù)庫(kù),則需調(diào)用“CreateFileGDB”工具。

CreateFileGDB_management (out_folder_path, out_name, {out_version})

n?out_folder_path將創(chuàng)建文件地理數(shù)據(jù)庫(kù)的位置(文件夾)。數(shù)據(jù)類型為Folder

n?out_name要?jiǎng)?chuàng)建的文件地理數(shù)據(jù)庫(kù)的名稱。數(shù)據(jù)類型為String?

3-11 ?CreateFileGDB

# Import system modules

import?arcpy

?

# Set local variables

out_folder_path = "C:/output"?

out_name = "fGDB.gdb"

?

# Execute CreateFileGDB

arcpy.CreateFileGDB_management(out_folder_path, out_name)

?

2、創(chuàng)建FeatureClass

“要素類”工具集提供了一組專用于執(zhí)行基本要素類管理(包括創(chuàng)建、追加、整合和更新多個(gè)要素類)的工具。

要素類是具有相同幾何類型的要素的集合:點(diǎn)、線、多邊形或注記。 要素類可與其他要素類一起存儲(chǔ)在地理數(shù)據(jù)庫(kù)中的要素?cái)?shù)據(jù)集內(nèi),也可作為獨(dú)立要素類存儲(chǔ)在地理數(shù)據(jù)庫(kù)中。此外,要素類還可存儲(chǔ)在 shapefile 中,或者與具有不同幾何的其他要素類一起存儲(chǔ)在 coverage 中。

要想在 ArcSDE 地理數(shù)據(jù)庫(kù)、文件地理數(shù)據(jù)庫(kù)或個(gè)人地理數(shù)據(jù)庫(kù)中創(chuàng)建空要素類;在文件夾中此工具將創(chuàng)建 shapefile。要使用“CreateFeatureclass”工具。

CreateFeatureclass_management (out_path, out_name, {geometry_type}, {template}, {has_m}, {has_z}, {spatial_reference}, {config_keyword}, {spatial_grid_1}, {spatial_grid_2}, {spatial_grid_3})

n?out_path創(chuàng)建輸出要素類所在ArcSDE 地理數(shù)據(jù)庫(kù)、文件地理數(shù)據(jù)庫(kù)、個(gè)人地理數(shù)據(jù)庫(kù)或文件夾。此工作空間必須已經(jīng)存在。數(shù)據(jù)類型為:WorkspaceFeature Dataset

n?out_name要?jiǎng)?chuàng)建的要素類的名稱。數(shù)據(jù)類型為String

n?geometry_type要素類的幾何類型,可設(shè)置為“POINT”、“MULTIPOINT”、“POLYGON”、 “POLYLINE數(shù)據(jù)類型為String

?

3-12 ?CreateFeatureclass

# Name: CreateFeatureclass_Example2.py

# Description: Create a feature class to store the gnatcatcher habitat zones

?

# Import system modules

import?arcpy

from?arcpy?import?env

?

# Set workspace

env.workspace = "C:/data"

?

# Set local variables

out_path = "C:/output"

out_name = "habitatareas.shp"

geometry_type = "POLYGON"

template = "study_quads.shp"

has_m = "DISABLED"

has_z = "DISABLED"

?

# Use Describe to get a SpatialReference object

spatial_reference = arcpy.Describe("C:/workspace/studyarea.shp").spatialReference

?

# Execute CreateFeatureclass

arcpy.CreateFeatureclass_management(out_path, out_name, geometry_type, template, has_m, has_z, spatial_reference)

?

3、添加Field

“字段”工具集包含一組用于向要素類表添加字段或?qū)υ摫碇械淖侄芜M(jìn)行更改的工具。字段是表中的列;每個(gè)字段包含一個(gè)屬性的多個(gè)值。表中可包含任意數(shù)量的字段。可指定字段設(shè)置,如字段類型和可存儲(chǔ)在字段中的最大數(shù)據(jù)量。

添加字段是指向表或要素類表、要素圖層、柵格目錄和/或帶屬性表的柵格添加新字段。“AddField”工具。

AddField_management (in_table, field_name, field_type, {field_precision}, {field_scale}, {field_length}, {field_alias}, {field_is_nullable}, {field_is_required}, {field_domain})

n?in_table要添加指定字段的輸入表。該字段將被添加到現(xiàn)有輸入表,并且不會(huì)創(chuàng)建新的輸出表。可將字段添加到 ArcSDE 的要素類、文件或個(gè)人地理數(shù)據(jù)庫(kù)的要素類、coverage、shapefile、柵格目錄、獨(dú)立表、帶屬性表的柵格和/或圖層。

n?field_name要添加到輸入表的字段的名稱。

n?field_type在創(chuàng)建新字段時(shí)所使用的字段類型。

??TEXT —名稱或其他文本特性。

??FLOAT —特定范圍內(nèi)含小數(shù)值的數(shù)值。

??DOUBLE —特定范圍內(nèi)含小數(shù)值的數(shù)值。

??SHORT —特定范圍內(nèi)不含小數(shù)值的數(shù)值;編碼值。

??LONG —特定范圍內(nèi)不含小數(shù)值的數(shù)值。

??DATE —日期和/或時(shí)間。

??BLOB —影像或其他多媒體。

??RASTER —柵格影像。

??GUID —GUID

?

3-12 ?AddField

# Name: AddField_Example2.py

# Description: Add a pair of new fields to a table

?

# Import system modules

import?arcpy

from?arcpy?import?env

?

# Set environment settings

env.workspace = "C:/data/airport.gdb"

?

# Set local variables

inFeatures = "schools"

fieldName1 = "ref_ID"

fieldPrecision = 9

fieldAlias = "refcode"

fieldName2 = "status"

fieldLength = 10

?

# Execute AddField twice for two new fields

arcpy.AddField_management(inFeatures, fieldName1, "LONG", fieldPrecision, "", "",

??????????????????????????fieldAlias, "NULLABLE")

arcpy.AddField_management(inFeatures, fieldName2, "TEXT", "", "", fieldLength)

?

?

4、完整程序

?

?

?

4ArcPy中的函數(shù)和類

ArcPy 中,所有地理處理工具均以函數(shù)形式提供,但并非所有函數(shù)都是地理處理工具。除工具之外,ArcPy 還提供多個(gè)函數(shù)以更好地支持使用 Python 的地理處理工作流。函數(shù)可用于列出某些數(shù)據(jù)集、檢索數(shù)據(jù)集的屬性、在將表添加到地理數(shù)據(jù)庫(kù)之前驗(yàn)證表名稱或執(zhí)行其他許多有用的地理處理任務(wù)。這些函數(shù)只能從 ArcPy 獲得,而不能作為 ArcGIS 應(yīng)用程序中的工具,因?yàn)樗鼈儗?Python 工作流所設(shè)計(jì)。

函數(shù)的一般形式與工具類似;它接受參數(shù)(可能需要也可能不需要)并返回某些結(jié)果。非工具函數(shù)的返回值可以為各種類型 - 從字符串到地理處理對(duì)象。工具函數(shù)會(huì)始終返回結(jié)果對(duì)象,并提供地理處理消息支持。

工具參數(shù)通常使用簡(jiǎn)單文本字符串來定義。數(shù)據(jù)集名稱、路徑、關(guān)鍵字、字段名稱、容差、域名可通過帶引號(hào)的字符串指定。對(duì)于需要多個(gè)屬性的較復(fù)雜參數(shù),難以使用簡(jiǎn)單字符串對(duì)其進(jìn)行定義。這種情況下可使用類(例如,SpatialReference、ValueTable Point 類)來定義這些字符串,而不必輸入復(fù)雜的長(zhǎng)文本字符串。

?

4.1 列出數(shù)據(jù)并描述數(shù)據(jù)

1ListWorkspaces

列出所設(shè)置的工作空間中的所有工作空間??梢詾楣ぷ骺臻g名稱和工作空間類型指定搜索條件,從而限制所返回的列表。 必須先設(shè)置工作空間環(huán)境,之后才能使用多個(gè)列表函數(shù)。

ListWorkspaces ({wild_card}, {workspace_type})

n?wild_card :通配符,可限制返回的結(jié)果。如果未指定任何通配符,則會(huì)返回所有值。

n?workspace_type :工作空間類型,有六種可能。?

??Access —Only personal geodatabases will be selected.

??Coverage —Only coverage workspaces will be selected.

??FileGDB —Only file geodatabases will be selected.

??Folder —Only shapefile workspaces will be selected.

??SDE —Only ArcSDE databases will be selected.

??All —All workspaces will be selected. (默認(rèn)值為 All)

?

import arcpy

?

arcpy.env.workspace = "c:/data"

?

# List all file geodatabases in the current workspace

workspaces = arcpy.ListWorkspaces("*", "FileGDB")

?

for workspace in workspaces:

????# Compact each geodatabase

????arcpy.Compact_management(workspace)

?

4.2 使用Cursor

(對(duì)FeatureClass進(jìn)行遍歷、增、刪改)

4.3 Geometry及其構(gòu)建

PointGeometryPointGeometry、Multipoint、Polyline Polygon

?

4.4 消息和錯(cuò)誤處理

?

4.5 示例:添加FeatureFeatureClass

?

?

?

5章 數(shù)據(jù)訪問模塊

數(shù)據(jù)訪問模塊 (arcpy.da) 是一個(gè)用于處理數(shù)據(jù)的 Python 模塊。通過它可控制編輯會(huì)話、編輯操作、改進(jìn)的游標(biāo)支持(包括更快的性能)、表和要素類與 NumPy 數(shù)組之間相互轉(zhuǎn)換的函數(shù)以及對(duì)版本化、復(fù)本、屬性域和子類型工作流的支持。

?

5.1 NumPy 數(shù)組

Numerical Python (NumPy) 是一個(gè)用于在 Python 中進(jìn)行科學(xué)計(jì)算(包括支持功能強(qiáng)大的多維數(shù)組對(duì)象)的基礎(chǔ)包。NumPy 為用戶提供了執(zhí)行復(fù)雜數(shù)學(xué)運(yùn)算的途徑,而且在 9.2 版本之后已作為 ArcGIS 軟件安裝過程的一部分。Python NumPy 數(shù)組專用于處理大型數(shù)組。很多現(xiàn)有 Python 函數(shù)都是為了處理 NumPy 數(shù)組而創(chuàng)建,而 NumPy 數(shù)組是包含在 Python SciPy 科學(xué)計(jì)算包中的最著名數(shù)組。

要將 NumPy 數(shù)組轉(zhuǎn)換為表和要素類,數(shù)組必須為結(jié)構(gòu)化數(shù)組。結(jié)構(gòu)化數(shù)組包括用來在 ArcGIS 表和要素類中將數(shù)據(jù)映射至字段的多個(gè)字段(或結(jié)構(gòu)體)。

import?numpy

?

array = numpy.array([(471316.383, 5000448.782), (470402.493, 5000049.216)], numpy.dtype([('X', '>f8'),('Y', '>f8')]))

一經(jīng)創(chuàng)建,結(jié)構(gòu)化 NumPy 數(shù)組即可轉(zhuǎn)換為要素類或表。

創(chuàng)建數(shù)組的 dtype 取決于輸入表的字段類型或要素類。

字段類型

NumPy dtype

單精度

numpy.float32

雙精度

numpy.float64

SmallInteger

numpy.int32

整型

numpy.int32

OID

numpy.int32

GUID

<U64

字符串

<u1、<u10 等

?

numpy提供了loadtxt函數(shù)進(jìn)行文本文件加載,該功能不僅能實(shí)現(xiàn)數(shù)據(jù)加載,而且能按照dtype將數(shù)據(jù)按照要求進(jìn)行標(biāo)準(zhǔn)化,如dtype為結(jié)構(gòu)化數(shù)據(jù)類型,則加載后的數(shù)據(jù)直接為結(jié)構(gòu)化數(shù)組。

?

numpy.loadtxt(fname, dtype=<type 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)

loadtxt函數(shù)要求文本文件每一行必須包含同樣數(shù)量的值。

?

fname?: 文件或字符串

將要讀取的文本文件,或者該文件的文件名

dtype?: 數(shù)據(jù)類型, 可選參數(shù)

結(jié)果數(shù)組的數(shù)據(jù)類型,缺省情況下為float。若其為結(jié)構(gòu)化數(shù)據(jù),結(jié)果數(shù)組將是1維數(shù)組,文本文件中的每一行將成為該數(shù)據(jù)中的一個(gè)元素。此時(shí),文本文件中數(shù)據(jù)的列數(shù)必須與數(shù)據(jù)類型中的字段數(shù)相同。

comments?: 字符串, 可選參數(shù)

用于標(biāo)識(shí)注釋文字的字符,缺省值為‘#’。

delimiter?: 字符串, 可選參數(shù)

用于分隔文本文件數(shù)值的分隔符,缺省情況下為空格,根據(jù)文本文件中數(shù)據(jù)格式,可以設(shè)置為諸如‘,’等。

skiprows?: 整數(shù), 可選參數(shù)

讀取文件時(shí)跳過文件頭上的skiprows?行,缺省值為 0。

usecols?: 數(shù)值序列, 可選參數(shù)

Which columns to read, with 0 being the first. For example, usecols = (1,4,5)?will extract the 2nd, 5th and 6th columns. The default, None, results in all columns being read.

?

NumPyArrayToFeatureClass將?NumPy 結(jié)構(gòu)化數(shù)組轉(zhuǎn)換為點(diǎn)要素類。

NumPyArrayToFeatureClass (in_array, out_table, shape_fields, {spatial_reference})

?

?

參數(shù)

說明

數(shù)據(jù)類型

in_array

NumPy 結(jié)構(gòu)化數(shù)組。

數(shù)組必須包含字段名稱和?numpy dtype。

NumPyArray

out_table

The output point feature class to which the records from the NumPy array will be written.

String

shape_fields

[shape_fields,...]

A list (or tuple) of field names used to create the feature class' geometry. Coordinates are specified in the order of x, y, z, and m. z-coordinate and m-value fields are optional.

Assuming field names of x, y, z, and m in a numpy array, feature classes could be constructed as below.

?

String

spatial_reference

要素類的空間參考。可以使用SpatialReference?對(duì)象或等效字符串來指定。

(默認(rèn)值為?None)

SpatialReference

?

shape_fields使用示例:

?

import arcpy

?

# Create a feature class with x,y fields

arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y"))

?

# Create a feature class with x,y,z fields

arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y", "z"))

?

# Create a feature class with x,y,m fields

arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y", "", "m"))

?

# Create a feature class with x,y,z,m fields

arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y", "z", "m"))

5.2 da中的Cursor

?

5.3 編輯會(huì)話與事務(wù)

?

5.4 示例:將包含點(diǎn)的坐標(biāo)信息的數(shù)據(jù)文件轉(zhuǎn)換為FeatureClass

(在ArcMap中,能夠調(diào)用File->add x,y data完成該項(xiàng)功能)

數(shù)據(jù)文件內(nèi)容為:

0.000,0.500

1.000,1.500

2.000,2.500

3.000,3.500

4.000,4.500

5.000,5.500

6.000,6.500

7.000,7.500

8.000,8.500

9.000,9.500

10.000,10.500

11.000,11.500

?

使用Python編寫以下程序:

import numpy

import arcpy

dtype=[('x', '>f8'), ('y', '>f8')]

coords=numpy.loadtxt("d:\\coords.txt",dtype,delimiter=",")

?

此時(shí),coords是讀入數(shù)據(jù)文件的內(nèi)容,即按照dtype的樣式,將數(shù)據(jù)文件的數(shù)據(jù)描述為形式為x,y的坐標(biāo)對(duì)。

array([(0.0, 0.5), (1.0, 1.5), (2.0, 2.5), (3.0, 3.5), (4.0, 4.5),

???????(5.0, 5.5), (6.0, 6.5), (7.0, 7.5), (8.0, 8.5), (9.0, 9.5),

???????(10.0, 10.5), (11.0, 11.5)],

??????dtype=[('x', '<f8'), ('y', '<f8')])

?

out = "d:\\out.shp"

arcpy.da.NumPyArrayToFeatureClass(coords,out,("x","y"))

?

按照x,y坐標(biāo)對(duì),將coords輸出為d:\\out.shp。將其加載到ArcMap窗口,即可顯示坐標(biāo)內(nèi)容。

記住,loadtxt中要將dtype設(shè)置為正確的形式才能將數(shù)據(jù)正確讀入。上述數(shù)據(jù)在numpy中輸出方式如下:

numpy.savetxt("d:\\out.txt", coords, fmt="%.3f", delimiter=",")

?

若數(shù)據(jù)文件中包含有除x,y之外的信息,則需要重新構(gòu)造dtype以適應(yīng)數(shù)據(jù)文件中的記錄內(nèi)容。

?

6制圖模塊(arcpy.mapping

6.1 arcpy.mapping 簡(jiǎn)介

1、什么是 arcpy.mapping

Arcpy.mapping 是作為 ArcPy 站點(diǎn)包一部分的一個(gè) Python 腳本模塊。隨 ArcGIS for Desktop 一同安裝,并對(duì)所有許可均可用。其設(shè)計(jì)初衷主要是用于操作現(xiàn)有地圖文檔 (.mxd) 和圖層文件 (.lyr) 的內(nèi)容。此外,還提供自動(dòng)執(zhí)行導(dǎo)出和打印的函數(shù)。Arcpy.mapping 可用于自動(dòng)執(zhí)行地圖生產(chǎn);它擴(kuò)展了數(shù)據(jù)驅(qū)動(dòng)頁(yè)面的功能,同時(shí),因其包含導(dǎo)出至 PDF 文檔、創(chuàng)建和管理 PDF 文檔的函數(shù),而為構(gòu)建完整地圖冊(cè)所必需。最后,可將 arcpy.mapping 腳本發(fā)布為地理處理服務(wù),并將腳本功能提供給 Web 應(yīng)用程序。

通過描述 arcpy.mapping 執(zhí)行的一些方案來了解其功能將會(huì)更容易些。以下是 arcpy.mapping 腳本可完成的眾多方案中的一小部分:

n?創(chuàng)建有關(guān)地圖文檔中所含信息(如數(shù)據(jù)框坐標(biāo)系、圖層數(shù)據(jù)源、數(shù)據(jù)源損壞的圖層或布局元素位置)的報(bào)告。

n?更新、修復(fù)或替換地圖文檔或圖層文件中的圖層數(shù)據(jù)源。

n?更新圖層符號(hào)系統(tǒng)而無需實(shí)際打開地圖文檔。

n?查找并替換文件夾內(nèi)所有地圖文檔中的文本字符串。

n?將地圖文檔保存至之前的 ArcGIS 版本以便分發(fā)。

n?更新地圖文檔元數(shù)據(jù)(例如,關(guān)鍵字、摘要和描述)。

n?使用地圖導(dǎo)出命令批量創(chuàng)建地理數(shù)據(jù),例如由數(shù)據(jù)框中要素列表驅(qū)動(dòng)的一系列 GeoTIFF 圖像。

n?自動(dòng)創(chuàng)建和管理要通過 ArcGIS for Server 發(fā)布的地圖服務(wù)。

n?構(gòu)建多種 PDF 地圖冊(cè):

??含標(biāo)題頁(yè)、多個(gè)地圖頁(yè)面以及任意數(shù)量含輔助內(nèi)容(如表格式報(bào)表和聯(lián)系人列表)的附加頁(yè)面的專題或時(shí)態(tài)地圖冊(cè)。

??基于數(shù)據(jù)驅(qū)動(dòng)頁(yè)面輸出的參考地圖冊(cè)。

2、構(gòu)建 arcpy.mapping 的初衷

Arcpy.mapping 專門面向?qū)I(yè)的 GIS 分析人員(以及開發(fā)人員)而構(gòu)建。以前,以上列出的方案必須使用 ArcObjects 來完成,然而事實(shí)多次證明,對(duì)于普通 GIS 專業(yè)人員而言,該編程環(huán)境非常難學(xué)。Arcpy.mapping 是一種粗粒度對(duì)象模型,也即函數(shù)的設(shè)計(jì)原則是單個(gè) arcpy.mapping 函數(shù)可代替多行 ArcObjects 代碼。以下這個(gè)簡(jiǎn)單示例顯示了如何使用 arcpy.mapping 通過僅僅兩行代碼引用現(xiàn)有地圖文檔并將其導(dǎo)出至 PDF 文檔。

>>> mxd = arcpy.mapping.MapDocument("C:/Project/Watersheds.mxd")

>>> arcpy.mapping.ExportToPDF(mxd, "C:/Project/Output/Watersheds.pdf")

?

Arcpy.mapping 不是 ArcObjects 的替代品,而是作為其支持的不同情景的一種備選方案。對(duì)于細(xì)粒度開發(fā)和應(yīng)用程序自定義來說,ArcObjects 仍是必不可少的,而 arcpy.mapping 主要用于自動(dòng)處理現(xiàn)有地圖文檔和圖層文件的內(nèi)容。

6.2 ArcMap環(huán)境中使用arcpy.mapping

1、Python 窗口

要學(xué)習(xí) arcpy.mapping,首先應(yīng)從 Python 窗口著手。Python 窗口是 ArcMap 框架的一部分,它所提供的自動(dòng)完成功能使您能夠輕松讀取函數(shù)參數(shù)的名稱和順序。以下步驟顯示了如何設(shè)置 Python 窗口,以實(shí)現(xiàn)令人滿意的最終用戶體驗(yàn)并使其與本文檔中的屏幕截圖一致。

步驟

n?ArcMap 中打開一個(gè)新的空地圖文檔。

n?單擊地理處理 > Python。

n?Python 窗口的代碼窗格(具有 >>> 字符)中單擊。會(huì)有一些幫助文本出現(xiàn)在右側(cè)的幫助窗格中。

n?右鍵單擊代碼窗格并選擇幫助放置 > 底部。幫助即會(huì)出現(xiàn)在代碼窗格的下方。

n?現(xiàn)在輸入以下語(yǔ)句(請(qǐng)注意,Python 區(qū)分大小寫):

>>> arcpy.mapping.ExportToPDF(

?

Python 窗口應(yīng)如下圖所示。第一個(gè)必需參數(shù)稱為 map_document,處于高亮顯示狀態(tài)。如果輸入一個(gè)逗號(hào),則第二個(gè)參數(shù)會(huì)變?yōu)楦吡溜@示。只有兩個(gè)必需參數(shù):map_document out_pdf??蛇x參數(shù)使用大括號(hào) {} 括起。

n?右鍵單擊代碼窗格,然后單擊全部清除以清除代碼窗格。

2、引用現(xiàn)有地圖文檔

通常,通過 arcpy.mapping 腳本執(zhí)行的首要操作之一即引用要處理的現(xiàn)有地圖文檔 (.mxd) 或圖層文件 (.lyr)。

引用地圖文檔的方法有兩種。第一種方法是通過提供 .mxd 文件的路徑在磁盤上進(jìn)行引用。如果要構(gòu)建將在 ArcGIS 環(huán)境外部運(yùn)行的腳本,則必須使用地圖文檔的路徑對(duì)其進(jìn)行引用。第二種方法是引用當(dāng)前加載至 ArcMap 應(yīng)用程序中的地圖文檔(在這種情況下,指的是 untitled.mxd)。在 ArcMap 內(nèi)的 Python 窗口中進(jìn)行操作時(shí),引用當(dāng)前加載的地圖文檔十分方便,因?yàn)樵趹?yīng)用程序中可直接看到對(duì)地圖文檔執(zhí)行的更改。以下步驟將介紹如何引用當(dāng)前加載至 ArcMap 中的地圖文檔。

步驟:

Python 窗口中輸入以下內(nèi)容,完成輸入后按 ENTER

>>> mxd = arcpy.mapping.MapDocument("CURRENT")

?

MapDocument 函數(shù)為稱為 mxd 的變量返回一個(gè) MapDocument 對(duì)象參考。字符串 CURRENT 是用于引用當(dāng)前已加載地圖文檔的關(guān)鍵字。也可以在此處提供地圖文檔的路徑來代替 CURRENT。

Python 窗口中輸入以下內(nèi)容,完成輸入后按 ENTER

>>> mxd.author = "YOUR NAME GOES HERE"

?

將打開 MapDocument 對(duì)象具有一個(gè)稱為 author 的屬性。只需將其值設(shè)置為字符串即可。

Python 窗口中輸入以下內(nèi)容,完成輸入后按 ENTER

>>> mxd.save()

?

由于該地圖文檔未保存,因此會(huì)出現(xiàn)一個(gè)對(duì)話框提示您提供路徑和文件名。save() 方法不具有任何參數(shù),但由于它是一個(gè)方法,因此仍必須加上左、右括號(hào)。事實(shí)上,如果要處理的是已經(jīng)存在的地圖文檔,并不需要處理彈出的保存對(duì)話框。要驗(yàn)證地圖文檔的保存位置,請(qǐng)嘗試以下操作:

Python 窗口中輸入以下內(nèi)容,完成輸入后按 ENTER

>>> print mxd.filePath

?

代碼窗格中會(huì)打印出路徑:

3、將圖層文件添加到地圖文檔中

接下來要做的是向地圖文檔中添加圖層文件 (.lyr)。此操作可通過 arcpy.mapping AddLayer 函數(shù)完成。步驟如下:

Python 窗口中,輸入以下內(nèi)容:

>>> arcpy.mapping.AddLayer(

?

自動(dòng)完成功能顯示有兩個(gè)必需參數(shù)。第一個(gè)參數(shù)是對(duì)地圖文檔中數(shù)據(jù)框的引用。第二個(gè)參數(shù)是對(duì)要添加的圖層的引用。該圖層可以是地圖文檔或圖層文件中的圖層。第三個(gè)參數(shù)是可選參數(shù),用于控制內(nèi)容列表中圖層的放置。由于這是第一個(gè)也是僅有的一個(gè)圖層,可以忽略第三個(gè)參數(shù)并使用其默認(rèn)值。

添加該圖層之前,需要引用相應(yīng)的對(duì)象。首先將引用數(shù)據(jù)框。

Python 窗口中,輸入以下內(nèi)容,完成輸入后按 ENTER

>>> df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]

?

ListDataFrames 函數(shù)需要引用地圖文檔和通配符過濾器(可選)??梢蕴峁?shù)據(jù)框的全名以進(jìn)行搜索。還可以輸入類似 "lay*" 的內(nèi)容。

所有 ArcPy 列表函數(shù)將返回 Python 列表對(duì)象。在列表中返回的這些項(xiàng)目從零開始,這表示列表中的第一個(gè)項(xiàng)目的索引值為 0,第二個(gè)項(xiàng)目為 1,依此類推,一直到 n-1。由于要讓 df 變量引用 DataFrame 對(duì)象而不是 Python 列表對(duì)象,因此必須在函數(shù)后追加索引號(hào)。在函數(shù)末尾追加 [0] 會(huì)返回列表中的第一個(gè)數(shù)據(jù)框。在這里,將返回列表中僅有的數(shù)據(jù)框。如果在地圖文檔中對(duì)數(shù)據(jù)框進(jìn)行唯一命名并使用相應(yīng)的通配符值分隔項(xiàng)目,應(yīng)始終返回僅有一個(gè)項(xiàng)目的列表,而索引 [0] 將會(huì)起到作用。如果在地圖文檔中有兩個(gè)數(shù)據(jù)框,并且不想通過 wildcard 值引用第二個(gè)數(shù)據(jù)框,則需要在函數(shù)末尾加上 [1],例如,df2 = arcpy.mapping.ListDataFrames(mxd)[1]

接下來,在使用 AddLayer 函數(shù)之前需要引用圖層文件。引用圖層文件的過程與通過提供 .mxd 完整路徑引用圖層文檔的過程相同,所不同的是需使用 Layer 函數(shù)而非 MapDocument 函數(shù)。

Python 窗口中輸入以下內(nèi)容,完成輸入后按 ENTER。注意:路徑很可能與以下示例不同。

>>> lyrFile = arcpy.mapping.Layer(r"C:\Project\data\Rivers.lyr")

?

在以上步驟中,創(chuàng)建了對(duì)現(xiàn)有圖層文件的引用,該引用存儲(chǔ)在名為 lyrFile 的變量中。

請(qǐng)注意,路徑字符串的前面有一個(gè)小寫 r。這是 Python 中的特殊字符,代表 raw。這表示要按原樣解釋該字符串并忽略字符串中的其他任何特殊字符。

所有必需的變量參考即已創(chuàng)建完畢。接下來將使用 AddLayer 函數(shù)將圖層文件添加至當(dāng)前地圖文檔。

Python 窗口中輸入以下內(nèi)容,完成輸入后按 ENTER

>>> arcpy.mapping.AddLayer(df, lyrFile)

?

該圖層應(yīng)已添加到內(nèi)容表和數(shù)據(jù)視圖中,Python 窗口應(yīng)如下圖所示:

4、將地圖文檔導(dǎo)出至 PDF

將地圖文檔導(dǎo)出至 PDF 極其容易,僅需要單行代碼。在教程開始處已看過 ExportToPDF 函數(shù)的語(yǔ)法。現(xiàn)在將完成該語(yǔ)法。步驟如下:

Python 窗口中輸入以下內(nèi)容,完成輸入后按 ENTER。路徑很可能與以下示例不同。

>>> arcpy.mapping.ExportToPDF(mxd, r"C:\Project\Doc1.pdf")

?

有很多參數(shù)與 ArcMap 中的設(shè)置一致。僅有兩個(gè)必需參數(shù):map_document out_pdf。

已在指定位置創(chuàng)建了 PDF 文檔,Python 窗口應(yīng)如下圖所示:

?

5、使用 ListLayers 函數(shù)引用圖層,并更改圖層屬性

有許多屬性和方法可用于處理地圖文檔中的圖層。之前已將圖層文件中的圖層添加至地圖文檔。創(chuàng)建的名為 lyrFile 的變量即引用添加至地圖文檔的圖層。使用此變量,可修改已添加圖層的某些屬性。步驟如下:

Python 窗口中,輸入以下內(nèi)容:

>>> lyrFile.

?

輸入點(diǎn)之后,請(qǐng)注意 Layer 對(duì)象上的所有不同屬性和方法。使用 lyrFile 變量,可更改地圖文檔中的這些屬性,在調(diào)用 save() 方法時(shí),會(huì)將這些更改保存至磁盤上的圖層文件 (.lyr)。

并非所有可能的圖層屬性都可用于 Layer 對(duì)象,只有那些對(duì)于地圖自動(dòng)化情景最常見的圖層屬性才可用??赏ㄟ^創(chuàng)作圖層文件中的屬性以及使用 arcpy.mapping UpdateLayer 函數(shù)來修改更多屬性。

大多數(shù)情況下,地圖文檔中已經(jīng)具有圖層。在以下這些步驟中,將假定圖層已在地圖文檔中,再次對(duì)其進(jìn)行引用。在地圖文檔中引用圖層與引用數(shù)據(jù)框非常相似。

Python 窗口中,按 Backspace 刪除當(dāng)前文本,輸入以下內(nèi)容,然后按 ENTER

>>> lyr = arcpy.mapping.ListLayers(mxd)[0]

?

ListLayers 函數(shù)需要提供地圖文檔參考。該函數(shù)有兩個(gè)附加參數(shù):一個(gè)用于執(zhí)行通配符搜索,另一個(gè)用于指定數(shù)據(jù)框。由于只有一個(gè)圖層和一個(gè)數(shù)據(jù)框,因此不必提供其他參數(shù)。同樣,語(yǔ)句結(jié)尾仍需要加上 [0] 索引值,以便返回 Layer 對(duì)象而不是 Python 列表對(duì)象。

使用新的 lyr 變量,可更新某些圖層屬性。

Python 窗口中輸入以下兩行,在每行后面按 ENTER

>>> lyr.name = "Some New Name"

>>> lyr.visible = False

?

運(yùn)行后不會(huì)立即看到更改。不是所有的屬性更改或方法都會(huì)自動(dòng)更新應(yīng)用程序。這是有意設(shè)計(jì)成這樣的,目的在于避免應(yīng)用程序經(jīng)常刷新。使用 CURRENT 引用 ArcMap 中當(dāng)前加載的地圖文檔時(shí),有時(shí)需要刷新內(nèi)容列表或活動(dòng)視圖(數(shù)據(jù)視圖或布局視圖)。

Python 窗口中輸入以下兩行,在每行后面按 ENTER

>>> arcpy.RefreshTOC()

>>> arcpy.RefreshActiveView()

?

內(nèi)容列表和數(shù)據(jù)視圖將刷新。注:如果在 ArcMap 外部運(yùn)行獨(dú)立腳本,則不需要這些附加函數(shù)。

Python 窗口應(yīng)如下圖所示:

?

6、更改數(shù)據(jù)框范圍

在本節(jié)中,將更改數(shù)據(jù)框范圍以使其與所選要素的范圍相符。在腳本中,通常使用類似 SelectlayerByAttribute 的函數(shù)來完成此操作。為了簡(jiǎn)化操作,您將以圖形的方式選擇一些要素。首先需要使用 Python 再次開啟圖層可見性。步驟如下:

Python 窗口中輸入以下三行,在每行后面按 ENTER

>>> lyr.visible = True

>>> arcpy.RefreshTOC()

>>> arcpy.RefreshActiveView()

?

ArcMap 中,以圖形方式選擇圖層中的一個(gè)或多個(gè)要素。然后,創(chuàng)建存儲(chǔ)所選要素范圍的變量,并將該范圍應(yīng)用于所引用的 DataFrame 對(duì)象的 extent 參數(shù)。

Python 窗口中輸入以下兩行,在每行后面按 ENTER

>>> lyrExtent = lyr.getSelectedExtent()

>>> df.extent = lyrExtent

?

Python 窗口應(yīng)如下圖所示:

?

7、將地圖文檔(再次)導(dǎo)出至 PDF

將再次導(dǎo)出至 PDF。這次將另外創(chuàng)建一個(gè) PDF 文檔,該文檔最終將與第一個(gè)文檔一起追加到新文檔中。步驟如下:

Python 窗口中輸入以下內(nèi)容,完成輸入后按 ENTER。提供的路徑很可能與以下示例不同。

>>> arcpy.mapping.ExportToPDF(mxd, r"C:\Project\Doc2.pdf")

?

Python 窗口應(yīng)如下圖所示:

?

新建 PDF 文檔并追加兩頁(yè)

arcpy.mapping 模塊包含一些 PDF 文檔管理函數(shù),這對(duì)于創(chuàng)建多頁(yè)文檔十分理想。例如,完整的地圖冊(cè)除包含數(shù)據(jù)驅(qū)動(dòng)頁(yè)面生成的標(biāo)準(zhǔn)參考地圖頁(yè)面以外,往往還包含一些其他頁(yè)面。arcpy.mapping 的使用對(duì)于構(gòu)建完整地圖冊(cè)來說是必要的步驟。

?

教程本部分將模擬多頁(yè)報(bào)告的創(chuàng)建過程。首先要新建一個(gè) PDF 文檔,然后追加在先前步驟中創(chuàng)建的 PDF。假設(shè)這些 PDF 文檔只是構(gòu)成地圖冊(cè)的單個(gè)文檔。例如,Doc1.pdf 可以是表示標(biāo)題頁(yè)和內(nèi)容列表等的多頁(yè) PDF。第二個(gè) PDF 文檔可以是將所有數(shù)據(jù)驅(qū)動(dòng)頁(yè)面地圖頁(yè)面導(dǎo)出至單個(gè)多頁(yè) PDF 的結(jié)果。

?

第一步是新建 PDF 文檔。

Python 窗口中輸入以下內(nèi)容,完成輸入后按 ENTER

>>> PDFdoc = arcpy.mapping.PDFDocumentCreate(r"C:\Project\Final.pdf")

?

稱為 PDFdoc 的變量引用內(nèi)存中的 PDFDocument 對(duì)象。只有在保存并關(guān)閉文檔后,該變量才會(huì)存在于磁盤中。

Python 窗口中輸入以下三行,在每行后面按 ENTER

>>> PDFdoc.appendPages(r"C:\Project\Doc1.pdf")

>>> PDFdoc.appendPages(r"C:\Project\Doc2.pdf")

>>> PDFdoc.saveAndClose()

?

前兩行分別將每個(gè) PDF 追加至新建的 PDF 文檔中。最后一行是提交更改并在磁盤上創(chuàng)建最終 PDF。

已在指定位置創(chuàng)建了 PDF 文檔,Python 窗口應(yīng)如下圖所示:

?

6.3 arcpy.mapping 指導(dǎo)原則

本節(jié)重點(diǎn)介紹了 arcpy.mapping 模塊的一些重要使用原則。還針對(duì) arcpy.mapping API 設(shè)計(jì)提出了一些見解,并就不同情景給出了策略建議。

1、必須處理現(xiàn)有地圖文檔或圖層文件

arcpy.mapping 模塊的設(shè)計(jì)初衷是用于修改已存在的地圖文檔 (.mxd) 或圖層文件 (.lyr) 中的現(xiàn)有元素。也就是說,它旨在幫助實(shí)現(xiàn)現(xiàn)有要素處理的自動(dòng)化,但不可用于創(chuàng)作新對(duì)象。設(shè)計(jì)的出發(fā)點(diǎn)并非想讓其成為 ArcObjects 的完全替代品,也不會(huì)將其用于為 ArcMap 界面中的所有按鈕、對(duì)話框、菜單選項(xiàng)或快捷菜單項(xiàng)創(chuàng)建函數(shù)、方法或?qū)傩?#xff08;這些功能由 ArcObjects 提供)。必須預(yù)先在 ArcMap 中認(rèn)真創(chuàng)作一個(gè)含所有相應(yīng)元素的地圖文檔或圖層文件,然后使用 arcpy.mapping 操作其內(nèi)容。

以下提供一些 arcpy.mapping 應(yīng)用的簡(jiǎn)單示例:

n?替換圖層的數(shù)據(jù)源。

n?遍歷一系列數(shù)據(jù)框范圍,查找并替換文本值,然后將頁(yè)面布局導(dǎo)出至 PDF

n?通過將 PDF 文檔追加到最終產(chǎn)品的方式構(gòu)建完整的地圖冊(cè)。

可對(duì)現(xiàn)有地圖文檔或圖層文件執(zhí)行更改,然后使用 MapDocument Layer 對(duì)象上的 saveACopy 方法將這些更改保存至一個(gè)新文件。

2、添加圖層并處理模板地圖文檔

arcpy.mapping 不允許創(chuàng)作全新的地圖文檔。按照設(shè)計(jì),它也不提供更改現(xiàn)有地圖文檔的頁(yè)面大小或方向的功能。解決方案很簡(jiǎn)單。預(yù)先創(chuàng)作含各種相應(yīng)元素、頁(yè)面大小、方向等內(nèi)容的模板地圖文檔,然后使用 arcpy.mapping 操作其內(nèi)容。

常見的一種情景是創(chuàng)作一個(gè)不含圖層的模板地圖文檔,然后使用 arcpy.mapping AddLayer、AddLayerToGroup InsertLayer 函數(shù)向地圖文檔添加圖層。如果圖例元素已事先創(chuàng)作為自動(dòng)將新項(xiàng)目添加到圖例,則會(huì)自動(dòng)出現(xiàn)圖例項(xiàng)。

另一種常見情景涉及含對(duì)開頁(yè)面的地圖冊(cè)。左側(cè)和右側(cè)頁(yè)面各偏移一定的距離,以便為裝訂留出空間。該情景需要有兩個(gè)地圖文檔:一個(gè)是左側(cè)頁(yè)面,另一個(gè)是右側(cè)頁(yè)面。使用 Arcpy.mapping 腳本邏輯將所有單個(gè)頁(yè)面合到一起,形成最終的多頁(yè) PDF 輸出。請(qǐng)參閱創(chuàng)建包含對(duì)開頁(yè)面的地圖冊(cè),該文檔詳細(xì)介紹了此情景并提供了 arcpy.mapping 代碼示例。

3、創(chuàng)作任何對(duì)象時(shí)均使用唯一名稱

為便于引用地圖元素(例如,數(shù)據(jù)框、圖層、布局元素或表)以對(duì)其訪問和修改,地圖元素必須具有唯一名稱。許多 arcpy.mapping 列表函數(shù)(例如 ListDataFramesListLayers、ListLayoutElements ListTableViews)都含有通配符參數(shù),允許您對(duì)名稱屬性進(jìn)行過濾。這些列表函數(shù)始終會(huì)返回一個(gè) Python 列表對(duì)象。為引用 Python 列表中的地圖元素,您可以通過循環(huán)遍歷列表,也可以在函數(shù)末尾追加一個(gè)索引號(hào)。如果使用通配符并指定唯一名稱,則返回的 Python 列表將始終包含一個(gè)項(xiàng)目,并可使用索引值 0 對(duì)其進(jìn)行引用。

?

mxd = arcpy.mapping.MapDocument("CURRENT")

riverLyr = arcpy.mapping.ListLayers(mxd, "Rivers")[0]

titleTxt = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "title")[0]

?

頁(yè)面布局元素有一個(gè)獨(dú)立屬性,稱為元素名稱??稍谠氐膶傩?對(duì)話框內(nèi)的大小和位置 選項(xiàng)卡中對(duì)其進(jìn)行設(shè)置。

?

數(shù)據(jù)框、圖層和表不像頁(yè)面布局元素那樣具有獨(dú)立的名稱屬性。它們的名稱基于內(nèi)容列表中顯示的標(biāo)注。理想情況下,將為同一地圖文檔內(nèi)的所有數(shù)據(jù)框、圖層和表給定唯一名稱。如果出現(xiàn)需要有重復(fù)名稱又不能將二者混淆的情況,那么您需要?jiǎng)?chuàng)作地圖文檔以使用其他屬性進(jìn)行區(qū)分。

以下代碼顯示了如何使用 Layer 對(duì)象的 description 屬性對(duì)數(shù)據(jù)框“County Maps”中具有相同名稱“Streets”的圖層進(jìn)行區(qū)分的示例。

?

mxd = arcpy.mapping.MapDocument("C:/Project/Project.mxd")

df = arcpy.mapping.ListDataFrames(mxd, "County Maps")[0]

for lyr in arcpy.mapping.ListLayers(mxd):

??if lyr.name == "Streets":

?????if lyr.description == "1:10000":

????????lyr.visible = True

?????if lyr.description == "1:100000":

????????lyr.visible = False

?

4、創(chuàng)作額外布局元素并視需要將其移入和移出頁(yè)面布局

有時(shí)可能會(huì)遇到這種情況,您在創(chuàng)建地圖系列時(shí),其中某些頁(yè)面具有附加地圖元素,例如,額外的數(shù)據(jù)框、附加圖片或文本元素等。這種情況下,您可以創(chuàng)作一個(gè)含所有可能布局元素的地圖文檔,然后根據(jù)需要使用 arcpy.mapping 腳本邏輯將這些元素移入和移出頁(yè)面,而不必專門針對(duì)這些情景創(chuàng)作獨(dú)立的地圖文檔。如果某個(gè)元素被移到頁(yè)面布局邊界以外,則不會(huì)將其打印或?qū)С觥?/span>

在以下示例中,結(jié)果布局將基于當(dāng)前數(shù)據(jù)框比例顯示不同樣式的比例尺。如果比例大于 1:25,000,則比例尺單位將以米計(jì)。如果比例大于或等于 1:25,000,則比例尺單位將以千米計(jì)。

mxd = arcpy.mapping.MapDocument("C:/Project/Project.mxd")

m_scale = arcpy.mapping.ListLayoutElements(mxd, "MAPSURROUND_ELEMENT", "m scale bar")[0]

km_scale = arcpy.mapping.ListLayoutElements(mxd, "MAPSURROUND_ELEMENT", "km scale bar")[0]

df = arcpy.mapping.ListDataFrames(mxd, "Main DF")[0]

if df.scale < 25000:

??m_scale.elementPositionX = 5 #on the page

??km_scale.elementPostitionX = 15 #off the page

else:

??m_scale.elementPositionX = 15 #off the page

??km_scale.elementPostitionX = 5 #on the page

?

?

?

?

?


總結(jié)

以上是生活随笔為你收集整理的python笔记之ArcPy简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。