ArcGIS使用Python腳本進行地理處理


 

 


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,用於保存柵格數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM