Python是ArcGIS內置的腳本處理函數,可進行地圖分析,數據處理,制圖等功能。腳本與我們熟悉的ModelBuilder或是ArcToolbox功能很類似,但是不同的地方有:
- 低層次的處理任務只有腳本可以執行,如某些表格操作
- 腳本可以使用更復雜的編程邏輯,如錯誤捕捉等
- 腳本可以包裹其他軟件,如Excel 或是 R程序
- 腳本可以單獨運行,實際上也需要安裝ArcGIS
- 腳本可以定時執行
ArcPy的類
ArcPy有很多類,其中比較重要的有:
- 地圖自動化
arcpy.mapping
- 地圖代數
arcpy.sa
ArcPy的執行
導入ArcPy的方式:
-
整體導入:
import arcpy
-
按需導入:
from arcpy import env # 推薦方式 # 導入的模塊、類、或是方法可以有別名,如 # from arcpy import env as myEnv
設置工作空間:
每個任務的開始需要先設置工作空間
import arcpy
arcpy.env.workspace = "C:/Data"
調用ArcPy中方法:
調用ArcPy中方法的兩種方式:
1、 arcpy.<toolname_toolboxalias>() 如:
import arcpy
arcpy.env.workspace = "C:/Data"
arcpy.Clip_analysis("streams.shp", "study.shp", "result.shp")
2、 arcpy..() 如:
import arcpy
arcpy.env.workspace = "C:/Data"
arcpy.analysis.Clip("streams.shp", "study.shp", "result.shp")
ArcPy中包含所有ArcToolbox中方法,名稱也與對應的工具名稱對應,如
Analysis Tools -> Extract -> clip對應的方法為:Clip_analysis
注意調用函數時,如遇到無需填寫的參數可用""或是"#" 占位
獲取ArcPy執行結果
執行函數
print arcpy.GetMesssages()
ArcPy權限檢查
檢查產品有:
- arcview
- arceditor
- arcinfo
- engine
- enginegeodb
- arcserver
檢查產品可用性:
print arcpy.CheckProduct("arcinfo")
# AlreadyInitalized
# AlreadyInitalized— 許可已經設置
# Available—許可可用
# Unavailable—許可不可用
# NotLicensed—許可無效
# Failed—系統出錯
檢查產品信息:
print arcpy.ProductInfo()
# ArcInfo
檢查擴展:
arcpy.CheckExtension("spatial")
# available
ArcPy獲取空間數據信息
判斷是否存在數據集
import arcpy
print = arcpy.Exists("C:/Data/streams.shp")
arcpy.Exists() 中dataset是一個字符串,可是是windows可以識別的文件路勁,也可是是catalog中的路徑。
數據集可以是地理空間數據庫要素類,shp文件,柵格文件,表格等
數據集描述信息
import arcpy
desc = arcpy.Describe("C:/Data/streams.shp")
print desc.shapeType
獲取的desc是一個描述對象,由於參數的類型不一定,所有得到的結果描述對象也是動態的。常用的屬性有:
shapeType
, spatialReference
, datasetType
, dataType
, path
, catalogPath
,file
, baseName
,
name
等
羅列數據
羅列函數有:
ListFields
, ListIndexes
, ListDatasets
,ListFeatureClasses
, ListFiles
, ListRasters
, ListTables
,ListWorkspaces
, and ListVersions
. 含義根據命名可知。
# 羅列要素類
ListFeatureClasses ({wild_card}, {feature_type}, {feature_dataset})
# 羅列柵格
ListRasters ({wild_card}, {raster_type})
# 羅列字段
ListFields(dataset, {wild_card}, {field_type})
上面三個函數中,參數凡有{}都可以省略,可以看到ListFeatureClasses
,和ListRasters
可以都省略的。在設置工作空間后,可以省略參數,羅列空間中的要素。
ArcPy中游標,SQL
游標
游標用於操作表格數據,多用於操作要素屬性值,游標的使用多需要結合循環語句。
游標有三種類型:查找型SearchCursor
, 插入型 InsertCursor
, 修改型UpdateCursor
游標使用方法:
arcpy.da.InsertCursor(in_table, field_names)
# 表格名,字段名稱
arcpy.da.SearchCursor(in_table, field_names, {where_clause}, {spatial_
reference}, {explore_to_points})
# 表格名稱,字段名稱,屬性值篩選器(可選),空間索引(可選),分散為點(可選)
arcpy.da.UpdateCursor(in_table, field_names, {where_clause}, {spatial_
reference}, {explore_to_points})
# 表格名稱,字段名稱,屬性值篩選器(可選),空間索引(可選),分散為點(可選)
游標詳細方法如下:
游標類型 | 方法 | 描述 |
---|---|---|
Search | next | 檢索到下一行 |
reset | 重置到開始位置 | |
Insert | insertRow | 插入一行到表中 |
next | 檢索到下一行 | |
Update | deleteRow | 移除表格中某一行 |
next | 檢索到下一行 | |
reset | 重置到開始位置 | |
updateRow | 更新當前行 |
# 插入數據
import arcpy
fc = "C:/Data/study.gdb/roads"
cursor = arcpy.da.InsertCursor(fc, ["STREETNAME"])
cursor.insertRow(["NEW STREET"])
# 查找數據
import arcpy
fc = "C:/Data/zipcodes.shp"
fieldname = "CITY"
delimfield = arcpy.AddFieldDelimiters(fc, fieldname)
cursor = arcpy.da.SearchCursor(fc, ["NAME", "CLASSCODE"], delimfield + "= 'LONGWOOD'")
for row in cursor:
print row[0]
del row
del cursor
# 修改數據
import arcpy
fc = "C:/Data/study.gdb/zones"
cursor = arcpy.da.UpdateCursor(fc, ["ACRES", "SHAPE_AREA"])
for row in cursor:
row[0] = row[1] / 43560
cursor.updateRow(row)
# 刪除數據
import arcpy
fc = "C:/Data/study.gdb/roads"
cursor = arcpy.da.UpdateCursor(fc, ["STREETNAME"])
for row in cursor:
if row[0] == "MAIN ST":
cursor.deleteRow()
使用游標操作表格,會使表格鎖定,這可防止多重操作。 若需要多次操作表格數據,則需要刪除游標對象
import arcpy
fc = "C:/Data/study.gdb/roads"
cursor = arcpy.da.UpdateCursor(fc, ["STREETNAME"])
for row in cursor:
if row[0] == "MAIN ST":
cursor.deleteRow()
del row
del cursor
ArcPy操作幾何要素
讀取幾何信息
點要素
import arcpy
fc = "C:/Data/hospitals.shp"
cursor = arcpy.da.SearchCursor(fc, ["SHAPE@XY"])
# SearchCursor也可以查找幾何要素,第二個參數"SHAPE@XY"相當於幾何要素字段,還可使用
# SHAPE@XY 要素坐標
# SHAPE@LENGTH 要素長度
# SHAPE@ 全部要素對象
for row in cursor:
x, y = row[0]
print("{0}, {1}".format(x,y))
線要素
import arcpy
from arcpy import env
env.workspace = "C:/Data"
fc = "roads.shp"
cursor = arcpy.da.SearchCursor(fc, ["OID@", "SHAPE@"])
for row in cursor:
print("Feature {0}: ".format(row[0]))
for point in row[1].getPart(0): # getPart用於獲取點對象的數組
print("{0}, {1}".format(point.X, point.Y))
寫入幾何信息
將text文件寫入shp
1 542935 1619969
2 543015 1619964
3 543079 1619924
4 543095 1619896
5 543107 1619816
6 543099 1619768
7 543067 1619669
8 543047 1619629
9 543007 1619593
import arcpy, fileinput, os
from arcpy import env
env.workspace = "C:/Data"
infile = "C:/Data/points.txt"
fc = "newpoly.shp"
# CreateFeatureclass_management(out_path, out_name, {geometry_type})創建空要素
arcpy.CreateFeatureclass_management("C:/Data", fc, "Polygon")
# 新要素游標,准備插入數據
cursor = arcpy.da.InsertCursor(fc, ["SHAPE@"])
array = arcpy.Array()
point = arcpy.Point()
# 讀取text文件,生成點數組
for line in fileinput.input(infile):
point.ID, point.X, point.Y = line.split()
array.add(point)
# 根據array生成polygon
polygon = arcpy.Polygon(array)
cursor.insertRow([polygon])
# 關閉文件輸入流
fileinput.close()
# 關閉游標
del cursor
ArcPy操作柵格數據集
相關概念
- 柵格數據集(Raster Dataset),柵格空間數據模型,存儲在磁盤中或是地理數據庫中,有多種格式如 TIFF, JPEG, IMAGINE, Esri GRID, 和MrSID 等。可以是單波段或是多波段
- 柵格波段(Raster Band),柵格的一個圖層,代表特定波段的光譜信息
- 柵格目錄(Raster Catalog),柵格數據集的幾何
羅列柵格文件
ListRasters({wild_card}, {raster_type})
描述柵格屬性
柵格信息有:
bandCount
,波段數目compressionType
,壓縮類型format
,柵格格式permanent
, 是否永久sensorType
, 探測器類型
import arcpy
from arcpy import env
env.workspace = "C:/raster"
raster = "landcover.tif"
desc = arcpy.Describe(raster)
print desc.dataType
print desc.bandCount
print desc.compressionType
單波段信息有:
-
height
: 行數 -
isInteger
: 是否整型 -
meanCellHeight
: y方向上像元數 -
meanCellWidth
: x方向上像元數 -
noDataValue
:null值 -
pixelType
: 像元值類型,如 8-bit integer, 16-bit integer,
single precision floating point, -
primaryField
:索引字段 -
tableType
: 表格名稱 -
width
:列數
import arcpy
from arcpy import env
env.workspace = "C:/raster"
rasterband = "img.tif/Band_1"
desc = arcpy.Describe(rasterband)
print desc.meanCellHeight
print desc.meanCellWidth
print desc.pixelType
柵格對象初始化
兩種方式: 一是通過文件夾柵格文件,二是通過地圖代數語句
# 文件夾
import arcpy
myraster = arcpy.Raster("C:/raster/elevation")
# 地圖代數
import arcpy
outraster = arcpy.sa.Slope("C:/raster/elevation")
柵格對象只有一個方法,save,用於保存柵格數據。