arcpy使用教程
以及地理处理框架arcpy
arcgis地理处理包括工具、工具箱、地理处理环境、模型python脚本、arcpy一系列自动执行地理任务的框架。
arcpy是esri针对arcgis一系列产品python网站包,它像胶水一样粘贴多个arcgis与应用程序关arc objects我们甚至可以从帮助中找到函数对象toolbox每个工具箱的代码原型。arcpy地理处理业务包括地理数据分析、数据转换、数据管理和地图自动化。使用python和arcpy其优点是可以将多个地理处理工具组织成工作流,解决一些复杂的地理处理工作。并可将工作流打包成地理处理包或创建地理处理服务,与他人共享使用。
Python语言
Python语言包括数字、字符串、句子、表达式、控制句子(条件句子、分支句子、循环句子)、对象、函数等基本要素python语句的基本语法和范式。但是这些东西不需要面面俱到,因为光是《python library reference》,有1000多页,你什么时候要翻?了解Python基本组成部分如字符串处理、路径、控制语句、模块、对象、函数和常用的编码规范即可,边用边学。
本文按照arcpy编写环境、站点包引入、地理处理工具函数和非工具函数、空间数据访问和处理、创建地理处理工具、构建地理处理模型、共享地理处理服务讲述arcpy整个使用过程。arcpy编写环境、网站包引入、地理处理工具函数和非工具函数、空间数据访问和处理;建立地理处理工具,建立地理处理模型;共享地理处理服务是脚本工具。其中,地理处理函数和非工具函数涉及过多的重复性,不能一一列举,但也是arcpy地理处理工具函数和非工具函数之所以放在数据访问前,是因为它们最丰富、最精彩。很多时候,地理处理函数直接处理数据,甚至看不到专有数据驱动。大部分地理处理过程都需要使用python连贯地理处理函数和数据处理过程的数据类型、函数、控制语句、类型等。python还需要补充相关内容。
一、制作地理处理脚本
在安装arcgis在安装过程中,通常会提示您安装python2.7.这实际上是让我们给我们的arcpy安装自己的语言编写环境。
以上是在arcgis安装完成后,python2.7自带站点包,包括诸如osgeo、numpy、pandas、pil常用的开源站点包等遥感图像处理。还有如pip这样的Python 用于网站包的搜索、下载、安装、卸载等。arcpy工具包放在另一个位置,从文件表达的形式来看,arengine\acrserver\arceditor等等,arcpy工具包如下:
先来看看python2.7的IDE工具,即引用arcpy编写工具:
倒数第二个图标是python的IDE,可以打开来看一下。
这个IDE以命令行的形式呈现,我们可以遵循python语法键入一个句子。
import this
python在引入包(python当使用特定的工具集时,需要使用关键字import介绍如下:
也可以打开arccatalog或者arcmap,交互式进入命令行窗口:
一般来说,如果使用命令行,我们会写一个句子,回车,程序执行一个句子,然后写一个句子,然后回车,程序执行一个句子。实际情况是,我们总是想写下所有完整的业务逻辑,让程序一次性完成,然后我们需要脚本。几乎所有的带.py所有的文件都可以python的脚本 。我们可以使用记事本,notepad、python gui、pycharm、vs等工具编写python句子,最后保存为.py然后使用编译器python.exe解释,在cmd中键入python xx.py后回车确认,得到运行结果。
前提你把python.exe加入系统变量的路径
或者在IDE中,在new file 按钮上新建文件,键入print("hellow the world")
一个简单完整的地理处理脚本编写过程如下:
import arcpy #arcpy站点包导入 arcpy.env.workspace = "C:/Workspace" #设置工作空间 arcpy.Clip_management( "image.tif", "1952602.23 294196.279 1953546.23 296176.279", "clip.gdb/clip", "#", "#", "NONE") # 执行地理处理工程,此处是栅格裁剪
导入arcpy站点包语句为(imprt是python中导入站点包、函数、模块的关键字,一般需要设置系统访问路径):
import arcpy
arcpy以地理处理工具包、函数集、模块、类等组织在一起,结构如下:
arcpy组成部分描述如下:
术语 |
定义 |
---|---|
ArcPy |
ArcPy(通常称为 ArcPy 站点包),为用户提供了使用 Python 语言操作所有地理处理工具(包括扩展模块)的接口,并提供了多种有用的函数和类,以用于处理和询问 GIS 数据。使用 Python 和 ArcPy,可以开发出大量的用于处理地理数据的实用程序。 |
ArcPy 模块 |
模块通常是一个包含函数和类的 Python 文件。ArcPy 由一系列模块支持,包括数据访问模块 (arcpy.da)、制图模块 (arcpy.mapping)、ArcGIS Spatial Analyst 扩展模块 模块 (arcpy.sa) 以及 ArcGIS Network Analyst 扩展模块 模块 (arcpy.na)。 |
ArcPy 类 |
类的作用类似于建筑设计蓝图。蓝图为如何创建事物提供了一个框架,类可用于创建对象,即通常所说的实例。ArcPy 类,如 SpatialReference 和 Extent类,通常用作地理处理工具参数设置的快捷方式,否则的话,这些参数会使用更加复杂的字符串。 |
ArcPy 函数 |
函数是用于执行某项特定任务并能够纳入更大的程序的已定义功能。 在 ArcPy 中,所有地理处理工具均以函数形式提供,但并非所有函数都是地理处理工具。除工具之外,ArcPy 还提供多种函数来更好地支持 Python 地理处理工作流。函数(通常称为方法)可用于列出某些数据集、检索数据集的属性、在将表添加到地理数据库之前验证表名称,或执行其他许多有用的脚本任务。 |
如果需要用到包里的一部分类、对象、或者函数,可以写为:
from arcpy import env
也可将类、对象、模块进行标识(取名):
from arcpy import env as myenv
myenv.workspace="c:/data"
arcpy站点包还包含了许多模块,如自动化制图模块(arcpy.mapping) 和数据访问模块(arcpy.da),导入方式如下:
import arcpy.mapping
编写python脚本前,需设置当前工作空间,如:
import arcpy
arcpy.env.workspace="c:/data"
注:路径表达方式一般有三种
斜杠:
"c:/data"
反斜杠:
"c:\\data"
特殊字符r:
r"c:\data"
“\”在编码中需转义,前面加r,直接按照原文意思输出。
工具
地理处理工具是指arcgis软件工具箱中工具的统称,每个工具都会给出相应的图形界面、使用帮助和arcpy语法和使用方式,比如矢量裁剪工具:
打开空间分析的裁剪工具图形界面:
打开裁剪工具帮助:
裁剪工具语法结构:
Clip_analysis (in_features, clip_features, out_feature_class, {cluster_tolerance})
参数 | 说明 | 数据类型 |
in_features |
要裁剪的要素。 |
Feature Layer |
clip_features |
用于裁剪输入要素的要素。 |
Feature Layer |
out_feature_class |
待创建的要素类。 |
Feature Class |
cluster_tolerance (可选) |
所有要素坐标之间的最小距离以及坐标可以沿 X 和/或 Y 方向移动的距离。如果此值设置得较高,则数据的坐标精度将会较低;如果此值设置得较低,则数据的坐标精度将会较高。 |
Linear unit |
裁剪工具脚本代码:
import arcpy from arcpy import env # Set workspace env.workspace = "C:/data" # Set local variables in_features = "majorrds.shp" clip_features = "study_quads.shp" out_feature_class = "C:/output/studyarea.shp" xy_tolerance = "" # Execute Clip arcpy. Clip_analysis(in_features, clip_features, out_feature_class, xy_tolerance)
地理处理工具以锤子状的图标形式呈现,有相关的图形界面和代码表现方式(如裁剪工具:arcpy.Clip_analysis()),我们在使用arcgis过程中经常用到工具箱,此处不详细说,我们侧重描述arcpy代码部分。
确切的说,arcpy地理处理工具是一个python脚本函数,该类函数可以直接调用并进行相关地理处理。
一个完整的地理处理脚本包含函数名和调用参数。调用参数一般有输入参数、输出参数和附加参数。附加参数常常指处理过程中的设置条件,如上述的裁剪函数的附加参数是容差{cluster_tolerance}。在裁剪时,我们有可能需要设置裁剪的容差。很多时候,设置条件是默认选项,不需要进行设置。
地理处理工具脚本按照地理处理功能分类,有数据管理、数据转换、地理编码、地理分析、地理统计、服务器工具等大类和几百个工具函数,应当在具体应用是细细体会。
地理处理工具脚本具体调用方式有两种。
(1)按照命名方式逐层展开调用,工具箱和函数以点号隔开,如:
arcpy.analysis.Clip()
(2)按照函数直接调用,函数和工具箱用_隔开,如:
arcpy.Clip_analysis()
其中,analysis是Analysis Tools(分析工具)别名。很多时候我们记不住他们的名字,可以对着工具箱属性查阅。。
非工具函数
正如官方描述所述:在 ArcPy 中,所有地理处理工具均以函数形式提供,但并非所有函数都是地理处理工具。除工具之外,ArcPy 还提供多种函数来更好地支持 Python 地理处理工作流。函数(通常称为方法)可用于列出某些数据集、检索数据集的属性、在将表添加到地理数据库之前验证表名称,或执行其他许多有用的脚本任务。函数比较多,具体用用时查询。
函数名称 |
类别 |
---|---|
AcceptConnections |
地理数据库管理 |
AddDataStoreItem |
数据存储 |
AddError |
消息和错误处理 |
AddFieldDelimiters |
字段 |
AddIDMessage |
消息和错误处理 |
AddMessage |
消息和错误处理 |
AddReturnMessage |
消息和错误处理 |
AddToolbox |
工具和工具箱 |
AddWarning |
消息和错误处理 |
AlterAliasName |
常规 |
AsShape |
几何 |
CheckExtension |
许可授予和安装 |
CheckInExtension |
许可授予和安装 |
CheckOutExtension |
许可授予和安装 |
CheckProduct |
许可授予和安装 |
ClearEnvironment |
环境和设置 |
Command |
常规 |
CopyParameter |
获取和设置参数 |
CreateObject |
常规 |
CreateGeocodeSDDraft |
发布 |
CreateGPSDDraft |
发布 |
CreateImageSDDraft |
发布 |
CreateRandomValueGenerator |
常规 |
CreateScratchName |
常规数据函数 |
CreateSQLiteDatabase |
工作空间 |
CreateUniqueName |
常规数据函数 |
DecryptPYT |
工具和工具箱 |
描述 |
描述数据 |
DisconnectUser |
地理数据库管理 |
EncryptPYT |
工具和工具箱 |
Exists |
常规数据函数 |
FromWKB |
几何 |
FromWKT |
几何 |
GetActivePortalURL |
ArcGIS Online/Portal |
GetArgumentCount |
获取和设置参数 |
GetIDMessage |
消息和错误处理 |
GetImageEXIFProperties |
栅格 |
GetInstallInfo |
许可授予和安装 |
GetLogHistory |
日志历史 |
GetMaxSeverity |
消息和错误处理 |
GetMessage |
消息和错误处理 |
GetMessageCount |
消息和错误处理 |
GetMessages |
消息和错误处理 |
GetPackageInfo |
打包 |
GetParameter |
获取和设置参数 |
GetParameterAsText |
获取和设置参数 |
GetParameterCount |
获取和设置参数 |
GetParameterInfo |
获取和设置参数 |
GetParameterValue |
获取和设置参数 |
GetReturnCode |
消息和错误处理 |
GetSeverity |
消息和错误处理 |
GetSeverityLevel |
消息和错误处理 |
GetSigninToken |
ArcGIS Online/Portal |
GetSystemEnvironment |
环境和设置 |
GetUTMFromLocation |
空间参考和变换 |
ImportToolbox |
工具和工具箱 |
InsertCursor |
游标 |
IsSynchronous |
工具和工具箱 |
ListDatasets |
列出数据 |
ListDataStoreItems |
数据存储 |
ListEnvironments |
环境和设置 |
ListFeatureClasses |
列出数据 |
ListFields |
列出数据 |
ListFiles |
列出数据 |
ListIndexes |
列出数据 |
ListInstallations |
许可授予和安装 |
ListPortalURLs |
ArcGIS Online/Portal |
ListPrinterNames |
常规 |
ListRasters |
列出数据 |
ListSpatialReferences |
空间参考和变换 |
ListTables |
列出数据 |
ListToolboxes |
工具和工具箱 |
ListTools |
工具和工具箱 |
ListTransformations |
空间参考和变换 |
ListUsers |
地理数据库管理 |
ListVersions |
列出数据 |
ListWorkspaces |
列出数据 |
LoadSettings |
环境和设置 |
NumpyArrayToRaster |
栅格 |
ParseFieldName |
字段 |
ParseTableName |
常规数据函数 |
ProductInfo |
许可授予和安装 |
RasterToNumPyArray |
栅格 |
RefreshActiveView |
常规 |
RefreshCatalog |
常规 |
RefreshTOC |
常规 |
RemoveDataStoreItem |
数据存储 |
RemoveToolbox |
工具和工具箱 |
ResetEnvironments |
环境和设置 |
ResetProgressor |
进度对话框 |
SaveSettings |
环境和设置 |
SearchCursor |
游标 |
SetLogHistory |
日志历史 |
SetParameter |
获取和设置参数 |
SetParameterAsText |
获取和设置参数 |
SetProduct |
许可授予和安装 |
SetProgressor |
进度对话框 |
SetProgressorLabel |
进度对话框 |
SetProgressorPosition |
进度对话框 |
SetSeverityLevel |
消息和错误处理 |
TestSchemaLock |
常规数据函数 |
UpdateCursor |
游标 |
Usage |
常规 |
ValidateDataStoreItem |
数据存储 |
ValidateFieldName |
字段 |
ValidateTableName |
常规数据函数 |
无论我们使用什么样的工具,首先第一步就是访问数据。空间数据的访问既可以是软件访问,也可以是代码方式访问。在软件方面,有如:arcgisd,mapinfo、QGIS、GRASS GIS uDig等,代码库方式访问有arcpy、GDAL/OGR、Spectral Python、GeoPandas、GEOS等等。当然编码语言本身也能访问空间数据,但是我们需要很清楚地知道数据本身的结构(如python 中的open\read\write函数)。
按照存储模型的不同,一般将空间数据分为矢量数据和栅格数据(你也可以按照维度把数据分为二维数据或者三维数据),两种类型的数据(栅格数据包含影像数据)有着不同的访问方式,即便是矢量数据或者栅格数据,也因为厂商或者标准的不一样,也有着不同的访问方式。如影像:tif,img,bmp,HDF等格式。相对而言,影像比较容易访问,影像内部存储顺序一般比较规律:BSQ 、BIL、BIP,只要知道行列号,波段数目、像元深度,即可方便地访问每个像元值,而矢量数据的关键性信息不仅有行列号、字段值,还需知道字段的数据类型、长度等等,需使用游标或者更加准确的说,使用sql语句进行访问才行。庆幸的是制作arcpy代码库或者函数库的编写者们会考虑到单个函数使用的通用性,即便是不同的数据类型也希望封装成一个函数进行访问,我们在外部几乎看不出数据类型的不同导致的访问函数不一样。
arcgis将各类数据看作是数据集,无论是矢量的、栅格的、数据库、抑或是文件型的(文件夹)。其访问方式全部封装在列表函数中---list()。列表系列的函数有:
ListFiles--文件列表、
ListWorkspaces--工作空间列表、
ListDatasets--数据集列表、
ListFeatureClasses--要素类列表、
ListRasters--栅格列表、
ListTables--属性表列表等等。
只要事先设置工作空间,即可将所有数据读入列表中,而如果再配合arcpy的工具函数和循环语句,即可做大量的批处理工作。
import arcpy
from arcpy import env
env.workspace="c:/data"
imgs=arcpy.ListRasters("","img")
for img in imgs:
arcpy.BuildPyramids_management(img)
以上代码就是为“data”文件夹下的所有img栅格数据创建金字塔。
使用列表函数可以轻松地将数据直接导入内存中,进而交给工具函数处理。
矢量数据中,最出名的莫过于shapefile 文件了,其表现方式为:
- .shp - 存储要素几何的主文件;必需文件。
- .shx - 存储要素几何索引的索引文件;必需文件。
- .dbf - 存储要素属性信息的 dBASE 表;必需文件。
- .prj - 存储坐标系信息的文件;由 ArcGIS 使用。
- .xml - ArcGIS 的元数据 - 用于存储 shapefile 的相关信息。
- .sbn 和 .sbx - 存储要素空间索引的文件。
- .fbn 和 .fbx - 存储只读 shapefile 的要素空间索引的文件。
- .ain 和 .aih - 存储某个表中或专题属性表中活动字段属性索引的文件。
- .atx - .atx 文件针对各个 shapefile 或在 ArcCatalog 中创建的 dBASE属性索引而创建。
- .ixs - 读/写 shapefile 的地理编码索引。
- .mxs - 读/写 shapefile(ODB 格式)的地理编码索引。
- .cpg - 可选文件,指定用于标识要使用的字符集的代码页。
从以上也可以看出,矢量数据有几个基本组成部分:1、几何要素、2、属性表、3、空间坐标信息、4、地理编码。
在其他矢量格式数据中都需要这四类信息,几何要素用以表示图形,属性表用以表示属性信息,空间坐标信息用以表示该矢量数据存在于那类空间坐标中,地理编码用于几何要素的空间定位。
因此,围绕矢量数据的访问,也就有着不同的访问方式,或以几何对象访问(几何图形),或以游标访问(属性表),或以几何对象的封装属性访问(空间坐标信息、地理编码),相对而言,矢量数据的访问方式较为复杂。
(这里我们不讨论矢量点、线、面的不同几何类型)
栅格数据中,img表现方式为: :索引文件, :金字塔文件, 栅格数据。 :在某些情况下,金字塔文件()也会超过2GB,这时会创建文件来存储这些信息
其中img文件像其他图像格式的文件(如:bmp,tiff,hdf等)一样,存有图像一些文件头信息,如:图像的大小、波段、行列数,分辨率、是否压缩、像素的行列数、位深等,还有空间坐标信息等,其基本组成部分有:1、栅格信息(R、G、B、NIR等)2空间坐标信息、3、波段、行列数、分辨率、位深
因此,栅格数据的访问一般只是访问栅格信息,其他的基本很少过问,虽然波段、行列数、分辨率、位深如此多的信息,但是它们都是相对单一的。
arcpy在解决以上的差异性问题时,提供的工具有:
游标是包含从要素类或表中获取的一行或多行数据的内存对象。每行数据包含了数据源中每个字段中的属性以及每个要素的几何信息。游标可对表和要素类的数据进行搜索,增加,插入,更新以及删除。arcpy.da
提供了三个游标函数。
SearchCursor() | SearchCursor | 只读查看表或要素类数据 |
InsertCursor() | InsertCursor | 向表或要素类插入行 |
UpdateCursor() | UpdateCursor | 编辑或删除表和要素类行 |
SearchCursor():用于在要素类或表上建立只读游标。SearchCursor 可用于遍历 Row 对象并提取字段值。可以使用 where 子句或字段限制搜索,并对结果排序。
语法
SearchCursor (dataset, {where_clause}, {spatial_reference}, {fields}, {sort_fields})
参数 | 说明 | 数据类型 |
dataset |
包含要搜索行的要素类、shapefile 或表。 |
String |
where_clause |
用于限制在游标中返回的行的可选表达式。有关 where 子句和 SQL 语句的详细信息,请参阅 构建 SQL 查询。 |
String |
spatial_reference |
指定后,要素将使用提供的 spatial_reference 进行动态投影。 |
SpatialReference |
fields |
游标中包含以分号分隔的字符串字段。默认情况下,包含所有字段。 |
String |
sort_fields |
用于在游标中对行进行排序的字段。每个字段的升序和降序排列表示为 "field1 A;field2 B" 形式,A 表示升序,D 表示降序。 |
String |
返回值
数据类型 | 说明 |
Cursor | 可分发 Row 对象的 Cursor 对象。 |
列出 Counties.shp 的字段内容。游标按州名称和人口进行排序。
import arcpy # Open a searchcursor # Input: C:/Data/Counties.shp # Fields: NAME; STATE_NAME; POP2000 # Sort fields: STATE_NAME A; POP2000 D rows = arcpy.SearchCursor( "c:/data/counties.shp", fields= "NAME; STATE_NAME; POP2000", sort_fields= "STATE_NAME A; POP2000 D") # Iterate through the rows in the cursor and print out the # state name, county and population of each. for row in rows: print( "State: {0}, County: {1}, Population: {2}". format( row.getValue( "STATE_NAME"), row.getValue( "NAME"), row.getValue( "POP2000")))
InsertCursor():向要素类、shapefile 或表中插入行。InsertCursor 可返回一个分发 Row 对象的枚举对象。
语法
InsertCursor (dataset, {spatial_reference})
参数 | 说明 | 数据类型 |
dataset |
将向其中插入行的表、要素类或 shapefile。 |
String |
spatial_reference |
在提供的 spatial_reference 中指定的坐标,并动态转换到数据集的坐标系。 |
SpatialReference |
返回值
数据类型 | 说明 |
Cursor | 返回针对指定要素类、shapefile 或表的 Cursor 对象。 |
向表中插入 25 个新行。
import arcpy # Create insert cursor for table rows = arcpy.InsertCursor("c:/base/data.gdb/roads_lut")