第九章 ArcPy數據訪問模塊 ||| 第十一章 使用加載項自定義ArcGIS界面
我們將在本章介紹以下幾個案例:
- 獲取工作空間內的要素類列表
- 使用通配符限制返回的要素類列表
- 使用要素類型限制返回的要素類列表
- 獲取要素類或表中的字段列表
- 調用Describe()函數返回要素類的描述信息
- 調用Describe()函數返回柵格數據的描述信息
- 調用Describe()函數返回工作空間信息
引言
Python腳本提供了執行批處理操作的功能。這將幫助你完成自動化工作流程并提高數據處理效率。舉個例子,你可能需要遍歷磁盤上所有的數據集并對每一個數據集執行某項特定操作。編寫地理處理任務的主體部分之前,你第一步通常是完成初步的數據收集。這一初步的數據收集工作通常調用ArcPy中的一個或多個列表函數來實現。這些列表函數返回Python列表對象。這些列表對象可通過遍歷操作以進行后續處理。ArcPy提供了大量可用于返回數據列表的函數。這些函數可以處理許多不同類型的GIS數據。本章中,我們將了解ArcPy中許多用于創建數據列表的函數。在第三章管理地圖文檔和圖層中,我們也介紹了一些列表函數。不過,這些列表函數與arcpy.mapping
模塊相關,且專門用于處理地圖文檔和圖層。我們在本章中介紹的列表函數直接位于arcpy
站點包中,并且更為通用。
我們還會介紹Describe()
函數,該函數返回一個包含屬性組的動態對象。這些動態生成的Describe
對象中包含的屬性組內容取決于所要描述的數據類型。當我們對一個要素類調用Describe()
函數,則返回要素類特定屬性。另外,不論什么數據類型的數據都會獲取一組通用Describe
對象屬性。
獲取工作空間內的要素類列表
同我們將在本章中介紹的其他列表函數一樣,獲取工作空間內的要素類列表通常是腳本中執行多步驟處理流程的第一步。舉個例子,你可能想要對某個文件地理數據庫內的所有要素類添加一個新的字段。那么你就首先需要獲取該工作空間內所有要素類的數據列表。
Getting ready
ArcPy提供的列表函數可獲取字段列表,索引列表,數據集列表,要素類列表,文件列表,柵格數據列表,表列表等。ListFeatureClasses()
函數可用于創建工作空間內的所有要素類列表。該函數接受三個可選參數用于限制返回的列表內容。其中第一個通配符參數根據要素類名稱來限制返回的要素類。第二個類型參數根據數據類型(點,線,面等)來限制返回的要素類。第三個數據集參數根據要素數據集來限制返回的要素類。在本案例中,我們會返回工作空間內所有的要素類。
How to do it...
按照以下步驟來學習如何調用ListFeatureClasses()
函數來獲取工作空間內的要素類列表:
1.打開IDLE,打開一個新的腳本窗口。
2.腳本保存為C:\ArcpyBook\Ch10\ListFeatureClasses.py
文件。
3.導入arcpy
模塊:
import arcpy
4.設置工作空間路徑:
arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"
必須牢記一點,你在調用列表函數前需先設置工作空間路徑。否則的話,列表函數就不知道要提取哪個數據集的數據列表。
5.調用ListFeatureClasses()
函數并將返回結果賦值給變量fcList
:
fcList = arcpy.ListFeatureClasses()
6.循環遍歷fcList
中每個要素類并打印到屏幕上:
for fc in fcList:
print fc
7.保存并運行腳本。你會看到如下結果:
Crimes2009
CityBoundaries
CrimesBySchoolDistrict
SchoolDistricts
BexarCountyBoundaries
Texas_Counties_LowRes
Burglary
How it works...
調用列表函數之前,你首先需要設置工作空間環境參數以確定當前工作空間路徑。ListFeatureClasses()
函數接受三個可選參數來限制返回的要素類。其他大部分的列表函數的工作方式基本如此。不過在本案例中,我們調用ListFeatureClasses()
函數時并沒有傳遞任何參數。這樣處理的結果就是返回的Python列表對象中包含了當前工作空間內的所有的要素類,之后通過for
循環迭代列表中的內容。列表中的每一個要素類都是包含要素類名稱的字符串來表示。
There's more...
除了返回工作空間內的要素類列表,你還可能需要獲取表列表。ListTables()
函數返回工作空間內的獨立表數據列表。列表內容可通過表名稱或表類型來篩選。表類型參數包括dBase
,INFO
和ALL
。列表中的所有的值都是包含表名稱的字符串數據類型。
使用通配符限制返回的要素類列表
默認情況下,ListFeatureClasses()
函數會返回工作空間內所有的要素類。你可能想通過某種方式來限制返回的列表內容。ListFeatureClasses()
函數接受三個可選參數來限制返回的要素類。所有的參數都是可選的。第一個參數是通配符參數,該參數基于字符的組合來限制返回的列表內容。其他的參數分別根據數據類型和要素集來限制返回的內容。
Getting ready
ListFeatureClasses()
函數使用通配符作為第一個參數來限制返回的要素類列表。通配符是根據名稱來限制列表內容。比如,你可能想只返回名稱以B
開頭的要素類列表。你就可以結合使用字母B
與星號(*
)來實現。下面的代碼示例展示了使用通配符來限制列表內容:
fcs = arcpy.ListFeatureClasses("B*")
在本案例中,你將學習如何通過使用通配符來限制返回的要素類列表:
How to do it...
按照以下步驟來學習如何在ListFeatureClasses()
函數中使用通配符參數來限制返回的要素類列表:
1.打開IDLE,加載C:\ArcpyBook\Ch10\ListFeatureClasses.py
腳本。
2.在列表函數中添加通配符參數來僅返回名稱以字母C
開始的要素類列表。
fcs = arcpy.ListFeatureClasses("C*")
3.保存并運行腳本。你會看到如下結果顯示:
Crimes2009
CityBoundaries
CrimesBySchoolDistrict
How it works...
ListFeatureClasses()
函數接受三個可選參數,其中通配符參數基于名稱來限制返回的要素類列表。在本案例中,我們使用了通配符(*
)來限制返回的列表中僅包含名稱以C
開頭的要素類
使用要素類型限制返回的要素類列表
ListFeatureClasses()
函數除了使用通配符來限制返回的要素類,你還可以通過要素類型來篩選返回的內容。
Getting ready
除了使用通配符來限制ListFeatureClasses()
函數返回的列表內容,要素類型限制條件也可以與通配符一起使用或單獨使用來限制列表內容。舉個例子,下面的示例代碼展示了使用兩個限制條件來限制返回的列表中僅包含以字母B
開頭的面要素類。在本案例中,你將使用要素類型參數以及通配符參數一起來限制返回的要素類:
fcs = arcpy.ListFeatureClasses("B*","Polygon")
How to do it...
按照以下步驟來學習如何在ListFeatureClasses()
函數中使用要素類型來限制返回的要素類列表:
1.打開IDLE,加載C:\ArcpyBook\Ch10\ListFeatureClasses.py
腳本。
2.在列表函數中添加要素類參數來僅返回名稱以字母C
開始的面要素類列表。
fcs = arcpy.ListFeature("C*","Polygon")
3.保存并運行腳本。你會看到如下結果顯示:
CityBoundaries
CrimesBySchoolDistrict
How it works...
ListFeatureClasses()
函數中的第二個可選參數根據要素類型來限制返回的結果。在本案例中,我們限制僅返回面要素。其他的要素類型包括點(Point),線(Polyline),區域(Region)等。
There's more...
ListFeatureClasses()
函數中的第三個可選參數是要素集名稱。該參數篩選出位于特定要素集內的要素類。當該參數沒有在調用ListFeatureClasses()
函數中指定,則返回當前工作空間內的獨立要素類。
獲取要素類或表中的字段列表
要素類和表中會包含有至少一列的屬性信息。你可以調用ListFields()
函數返回要素類中的字段列表。
Getting ready
ListFields()
函數返回的列表中包含了要素類或表中每個字段對應的一個Field
對象。像ListFields()
和ListIndexes()
的函數會要求一個輸入數據集作為執行對象。你可以使用通配符或字段類型來限制返回的字段。每一個Field
對象包含了多個只讀屬性,包括名稱(Name),別名(AliasName),類型(Type),長度(Length)等。
How to do it...
按照以下步驟來學習如何返回一個要素類中的字段列表:
1.打開IDLE,創建一個新的腳本窗口。
2.腳本保存為C:\ArcpyBook\Ch10\ListOfFields.py
文件。
3.導入arcpy
模塊。
import arcpy
4.設置工作空間路徑:
arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"
5.在try
語句塊中對Burglary
要素類調用ListFields()
函數:
try:
fieldList = arcpy.ListFields("Burglary")
6.循環遍歷字段列表中的每一個字段,并打印字段名稱,類型以及長度。確保代碼縮進:
for fld in fieldList:
print "%s is a type of %s with a length of %i" % (fld.name,fld.type,fld.length)
7.添加except
語句:
except Exception as e:
print e.message
8.完整代碼如下:
import arcpy
arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"
try:
fieldList = arcpy.ListFields("Burglary")
for fld in fieldList:
print "%s is a type of %s with a length of %i" %(fld.name,fld.type,fld.length)
except Exception as e:
print e.message
9.保存并運行腳本。你會看到如下結果顯示:
OBJECTID is a type of OID with a length of 4
Shape is a type of Geometry with a length of 0
CASE is a type of String with a length of 11
LOCATION is a type of String with a length of 40
DIST is a type of String with a length of 6
SVCAREA is a type of String with a length of 7
SPLITDT is a type of Date with a length of 8
SPLITTM is a type of Date with a length of 8
HR is a type of String with a length of 3
DOW is a type of String with a length of 3
SHIFT is a type of String with a length of 1
OFFCODE is a type of String with a length of 10
OFFDESC is a type of String with a length of 50
ARCCODE is a type of String with a length of 10
ARCCODE2 is a type of String with a length of 10
ARCTYPE is a type of String with a length of 10
XNAD83 is a type of Double with a length of 8
YNAD83 is a type of Double with a length of 8
How it works...
ListFields()
函數返回要素類或表中的字段列表。該函數接受一個必選參數,即要執行操作的要素類或表的引用地址。你可以使用通配符或字段類型來限制返回的字段。在本案例中,我們僅指定了一個要素類參數,這樣就意味著將會返回所有字段。對于返回的每一個字段,我們輸出查看其名稱,字段類型和字段長度。正如之前在討論ListFeatureClasses()
所提到的,ListFields()
函數和其他列表函數通常是腳本中執行多步處理的第一步。舉個例子,你可能想要更新一個人口統計區要素類中的人口信息字段中的統計數據。要完成這一工作,你需要獲取要素類中包含所有字段的列表,然后循環遍歷該列表來查找包含人口信息的特定字段名稱,最后更新每一行的人口信息。ListFields()
函數還接受一個通配符參數。如果你事先明確了所需字段名稱,將其傳遞給通配符參數,這樣就只會返回指定字段。
調用Describe()函數返回要素類的描述信息
數據集包含的信息本質上都是描述性的。比如,要素類包含名稱,幾何類型,空間參考等。當你在腳本中執行下一步處理前需要查看特定信息的時候,這些描述性信息就很有價值了。比如你可能想只對線狀要素而不是點或面要素執行一個緩沖區操作。你可以調用Describe()
函數來獲取數據集基本的描述性信息。你可以將這些信息看作元數據。
Getting ready
Describe()
函數提供了獲取數據集基本信息的功能。這些數據集包括要素類,表,ArcInfo coverage,圖層文件,工作空間,柵格及其他數據集。該函數返回了一個包含描述數據類型特定屬性的Describe
對象。Describe
對象中的屬性是以屬性組的方式進行組織,并且返回的數據集屬性信息至少歸入一個屬性組。
舉個例子,對一個地理空間數據庫調用Describe()
函數將會返回GDB要素類,要素類,表以及數據集屬性組。每一個屬性組中包含可被訪問的特定屬性。
Describe()
函數接受一個字符串參數用來指向數據源。下面的代碼示例中,我們傳遞了一個包含在地理空間數據庫中要素類的引用參數。該函數會返回一個包含了一組動態屬性的Describe
對象,其中這些動態屬性的集合稱為屬性組:
arcpy.env.workspace = "c:/ArcpyBook/data/CityOfSanAntonio.gdb"
desc = arcpy.Describe("SchoolDistricts")
print "The feature type is: " + desc.featureType
The feature type is: Simple
print "The shape type is: " + desc.shapeType
The shape type is: Polygon
print "The name is: " + desc.name
The name is: SchoolDistricts
print "The path to the data is: " + desc.path
The path to the data is: c:/ArcpyBook/data/CityOfSanAntonio.gdb
不論什么數據類型,所有的數據集都會包含一組默認的屬性集合包含在Describe
對象中。這些屬性都是只讀的。其中一些常用的屬性包括數據類型(dataType
),目錄(catalogPath
),名稱(name
),路徑(path
)以及文件(file
)。
在本案例中,你將編寫一個腳本調用Describe()
函數來獲取一個要素類中的描述性信息。
How to do it...
按照以下步驟來學習如何獲取要素類的描述性信息:
1.打開IDLE,打開一個新的腳本窗口。
2.腳本保存為C:\ArcpyBook\Ch10\DescribeFeatureClass.py
文件。
3.導入arcpy
模塊。
import arcpy
4.設置工作空間路徑:
arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"
5.添加try
語句塊:
try:
6.對Burglary
要素類調用Describe()
函數并打印幾何類型:
dsscFC = arcpy.Describe("Burglary")
print "The shape type is: " + descFC.shapeType
7.獲取要素類的字段列表并打印字段的名稱,類別以及長度:
flds = descFC.fields
for fld in flds:
print "Field: " + fld.name
print "Type: " + fld.type
print "Length: " + str(fld.length)
8.獲取要素類的四至范圍并打印其坐標:
ext = descFC.extent
print "XMin: %f" % (ext.XMin)
print "YMin: %f" % (ext.YMin)
print "XMax: %f" % (ext.XMax)
print "YMax: %f" % (ext.YMax)
9.添加except
語句塊:
except Exception as e:
print e.message()
10.完整代碼如下:
import arcpy
arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"
try:
descFC = arcpy.Describe("Burglary")
print "The shape type is: " + descFC.shapeType
flds = descFC.fields
for fld in flds:
print "Field: " + fld.name
print "Type: " + fld.type
print "Length: " + str(fld.length)
ext = descFC.extent
print "XMin: %f" % (ext.XMin)
print "YMin: %f" % (ext.YMin)
print "XMax: %f" % (ext.XMax)
print "YMax: %f" % (ext.YMax)
except Exception as e:
print e.message
11.保存并運行腳本。你會看到如下結果顯示:
The shape type is: Point
Field: OBJECTID
Type: OID
Length: 4
Field: Shape
Type: Geometry
Length: 0
Field: CASE
Type: String
Length: 11
Field: LOCATION
Type: String
Length: 40
.....
.....
XMin: -103.518030
YMin: -6.145758
XMax: -98.243208
YMax: 29.676404
How it works...
我們在腳本中對要素類調用Describe()
函數并返回一個要素類屬性組以及表屬性組和數據集屬性組。除了可以訪問要素類屬性組,你還可以訪問表屬性組。
表屬性組是非常重要的,通過表屬性組你可以訪問獨立表或要素類中的字段。你還可以通過屬性組來訪問表或要素類中的索引。表屬性組中的fields
屬性返回一個包含要素類每個字段對應的一個Field
對象的列表。每一個字段都包含一組只讀屬性,包括名稱,別名,長度,類型,比例,精度等等。其中最為有用的屬性是名稱和類型。在本案例中,我們打印了字段名稱,類型和長度。
最后,我們通過調用數據集屬性組中的extent
屬性返回Extent
對象來輸出圖層的地理范圍。數據集屬性組中包含了許多有用的屬性。其中最為常用的屬性包括extent
和spatialReference
,許多地理處理工具和腳本在執行過程中可能需要這些信息。你還可以獲取datasetType
屬性和版本化信息等其他屬性。
調用Describe()函數返回柵格數據的描述信息
柵格文件同樣包含描述性信息,而這些信息也可以通過調用Describe()
函數獲取。
Getting ready
柵格數據集同樣可以調用Describe()
函數來獲取其描述信息。本案例中,你將通過返回的地理范圍和空間參考信息來描述一個柵格數據集。Describe
對象除了包含一個通用的數據集屬性組之外,還包含了數據集的SpatialReference
對象。該對象可用于獲取數據集詳細的空間參考信息。
How to do it...
按照以下步驟來學習如何獲取一個柵格影像文件的描述信息:
1.打開IDLE,打開一個新的腳本窗口。
2.腳本保存為C:\ArcpyBook\Ch10\DescribeRaster.py
文件。
3.導入arcpy
模塊。
import arcpy
4.設置工作空間路徑:
arcpy.env.workspace = "C:/ArcpyBook/data"
5.添加try
語句塊:
try:
6.對柵格數據集調用Describe()
函數,確保代碼縮進以位于try
語句塊內:
descRaster = arcpy.Describe("AUSTIN_EAST_NW.sid")
7.獲取柵格數據集的四至范圍并打印坐標:
ext = descRaster.extent
print "XMin: %f" % (ext.XMin)
print "YMin: %f" % (ext.YMin)
print "XMax: %f" % (ext.XMax)
print "YMax: %f" % (ext.YMax)
8.獲取SpatialReference
對象并打印名稱和類別:
sr = descRaster.spaitalReference
print sr.name
print sr.type
9.添加except
語句塊:
except Exception as e:
print e.message
10.完整代碼如下:
import arcpy
arcpy.env.workspace = "C:/ArcpyBook/data"
try:
descFC = arcpy.Describe("AUSTIN_EAST_NW.sid")
ext = descRaster.extent
print "XMin: %f" % (ext.XMin)
print "YMin: %f" % (ext.YMin)
print "XMax: %f" % (ext.XMax)
print "YMax: %f" % (ext.YMax)
sr = descRaster.spaitalReference
print sr.name
print sr.type
except Exception as e:
print e.message
11.保存并運行腳本。你會看到如下結果顯示:
XMin: 3111134.862457
YMin: 10086853.262238
XMax: 3131385.723907
YMax: 10110047.019228
NAD83_Texas_Central
Projected
How it works...
本案例與上一個案例非常相似。兩個案例的區別在于本案例對柵格數據集而不是矢量要素類調用Describe()
函數。在兩個案例中,我們都調用了extent
屬性返回了數據集的地理四至范圍。在本案例中我們還獲取了柵格數據集的SpatialReference
對象并輸出查看了該對象的名稱和類型。
調用Describe()
函數返回工作空間信息
ArcGIS中可以使用許多不同類型的地理數據庫,包括個人地理數據庫,文件地理數據庫以及企業地理數據庫。如我們在第八章數據查詢和選擇中所了解到的,構建查詢條件語句會依賴于數據集所在的地理數據庫的類型的不同而有所差別。腳本在執行前可能并不了解地理數據庫的類型。為了能夠提高腳本在查詢過程中的健壯性,你可以對工作空間對象調用Describe()
函數以獲取相關信息來構建相對應的查詢語句。
Getting ready
工作空間(workspace)屬性組提供了與工作空間有關的信息(比如工作空間類型是文件夾,還是個人地理數據庫,文件地理數據庫或企業地理數據庫)。通過工作空間屬性組能夠獲取的信息包括當工作空間是一個ArcSDE時的連接信息,與地理數據庫有關的域以及工作空間類型信息,其中工作空間類型可以是文件系統(FileSystem
),本地數據庫(LocalDatabase
)或遠程數據庫(RemoteDatabase
)。本地數據庫(LocalDatabase
)是指個人或文件地理數據庫,而遠程數據庫(RemoteDatabase
)則是指ArcSDE地理數據庫。在本案例中,你將利用工作空間屬性組來獲取一個文件地理數據庫的相關信息。
How to do it...
1.打開IDLE,打開一個新的腳本窗口。
2.腳本保存為C:\ArcpyBook\Ch10\DescribeWorkspace.py
文件。
3.導入arcpy
模塊。
import arcpy
4.開始try
語句塊:
try:
5.對CityOfSanAntonio
地理數據庫調用Describe()
函數,確保代碼縮進以位于try
語句塊內,下面的兩行print
語句也需要位于try
語句塊中:
descWorkspace = arcpy.Describe("C:/ArcpyBook/data/CityOfSanAntonio.gdb")
6.打印工作空間類型:
print descWorkspace.workspaceType
7.打印工作空間細節信息:
print descWorkspace.workspaceFactoryProgID
8.添加except
語句塊:
except Exception as e:
print e.message
9.保存并運行腳本。你會看到如下結果顯示:
LocalDatabase
esriDataSourcesGDB.FileGDBWorkspaceFactory.1
How it works...
workspaceType
屬性會返回FileSystem
,LocalDatabase
和RemoteDatabase
中一個值。LocalDatabase
值說明你當前處理的是一個個人或文件地理數據庫。然而,這樣的信息還不夠具體。為了能夠獲取更為具體的信息,你可以訪問workspaceFactoryProgID
屬性,該屬性會指明地理數據庫的具體類型。在本案例中是一個文件地理數據庫。