地理处理框架与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脚本过程;创建地理处理工具、构建地理处理模型是制作脚本工具过程;共享地理处理服务是将脚本工具发布为地理处理服务过程。其中,地理处理函数和非工具函数涉及内容重复性过多,不能一一列举,但它也是arcpy最丰富、最出彩的地方,之所以把地理处理工具函数和非工具函数放在数据访问前面,也是因为如此。很多时候,地理处理函数,甚至都看不到专有数据驱动,就直接处理数据了。由于大部分地理处理过程需要用到python中的数据类型、函数、控制语句、类型等来连贯地理处理函数及数据处理过程,python相关内容也需补充的。
一、制作地理处理脚本
地理处理:arcpy编写环境
在安装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站点包引入
导入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表现方式为:
img:索引文件,
rrd:金字塔文件,
ige:栅格数据。
rde:在某些情况下,金字塔文件(rrd)也会超过2GB,这时会创建rde文件来存储这些信息
其中img文件像其他图像格式的文件(如:bmp,tiff,hdf等)一样,存有图像一些文件头信息,如:图像的大小、波段、行列数,分辨率、是否压缩、像素的行列数、位深等,还有空间坐标信息等,其基本组成部分有:1、栅格信息(R、G、B、NIR等)2空间坐标信息、3、波段、行列数、分辨率、位深
因此,栅格数据的访问一般只是访问栅格信息,其他的基本很少过问,虽然波段、行列数、分辨率、位深如此多的信息,但是它们都是相对单一的。
arcpy在解决以上的差异性问题时,提供的工具有:使用游标访问矢量数据单个属性项数据,使用numpy数组遍历栅格数据单个栅格值。
矢量属性访问
游标是包含从要素类或表中获取的一行或多行数据的内存对象。每行数据包含了数据源中每个字段中的属性以及每个要素的几何信息。游标可对表和要素类的数据进行搜索,增加,插入,更新以及删除。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")
-
#
Create
25
new rows.
Set the
initial
row ID
and distance
values
-
for x
in
range(
1,
26):
-
row
= rows.newRow()
-
row.setValue("rowid", x)
-
row.setValue("distance",
100)
-
rows.insertRow(
row)
-
#
Delete
cursor
and
row objects
to remove locks
on the data
-
del
row
-
del
rows
UpdateCursor():创建一个用于更新或删除指定要素类、shapefile 和表中的行的游标。该游标将数据锁定保留至脚本完成或更新游标对象被删除时。
语法
UpdateCursor (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 对象。 |
根据另一个字段值更新要素类中的字段值。
-
import arcpy
-
# Create update cursor for feature class
-
rows = arcpy.UpdateCursor(
"c:/data/base.gdb/roads")
-
# Update the field used in buffer so the distance is based on the
-
# road type. Road type is either 1, 2, 3, or 4. Distance is in meters.
-
for row
in rows:
-
# Fields from the table can be dynamically accessed from the
-
# row object. Here fields named BUFFER_DISTANCE and ROAD_TYPE
-
# are used
-
row.setValue(
"BUFFER_DISTANCE", row.getValue(
"ROAD_TYPE") *
100)
-
rows.updateRow(row)
-
# Delete cursor and row objects to remove locks on the data.
-
del row
-
del rows
以上三个游标函数都返回一个游标对象,游标对象根据实际对象的改变而改变。
矢量几何访问
空间数据需要同时维护属性表数据与图形数据信息,图形数据和属性数据之间通过唯一的ID号进行对象内部关联,涉及到空间数据更新时,一般是同时更新空间对象的属性数据和图形数据。空间图形对象定义了空间图形的空间位置、形状,空间图形包含点、多点、线、面、多面体等多种空间图形对象,空间图形对象是空间拓扑、空间分析、空间几何网络构造的基础,在创建空间几何对象的时候,空间边界、最小边界多边形、包含、相交、接触、相离、合并等空间关系等对象或者方法得以继承,可以直接使用空间图形对象更新图形信息,又因Arcpy调用了arcobject空间对象的方法,也可以使用图形令牌访问图形信息,同时也可以使用游标方式对属性数据和图形数据进行同步更新。如果只需要图形的某些特定属性,利用图形令牌访问几何属性即可,操作比图形对象访问更加简便,例如:SHAPE@XY 会返回一组代表要素质心的 x,y 坐标。
令牌 |
说明 |
---|---|
SHAPE@ |
要素的几何对象。 |
SHAPE@XY |
一组要素的质心 x,y 坐标。 |
SHAPE@TRUECENTROID |
一组要素的真正质心 x,y 坐标。 |
SHAPE@X |
要素的双精度 x 坐标。 |
SHAPE@Y |
要素的双精度 y 坐标。 |
SHAPE@Z |
要素的双精度 z 坐标。 |
SHAPE@M |
要素的双精度 m 值。 |
SHAPE@JSON |
表示几何的 esri JSON 字符串。 |
SHAPE@WKB |
OGC 几何的熟知二进制 (WKB) 制图表达。该存储类型将几何值表示为不间断的字节流形式。 |
SHAPE@WKT |
OGC 几何的熟知文本 (WKT) 制图表达。其将几何值表示为文本字符串。 |
SHAPE@AREA |
要素的双精度面积。 |
SHAPE@LENGTH |
要素的双精度长度。 |
使用几何对象
import arcpy
feature_info = [[[1, 2], [2, 4], [3, 7]],
[[6, 8], [5, 7], [7, 2], [9, 5]]]
features = []
for feature in feature_info:
features.append(
arcpy.Polygon(
arcpy.Array([arcpy.Point(*coords) for coords in feature])))
arcpy.CopyFeatures_management(features, "c:/geometry/polygons.shp")
使用图形令牌
import arcpy
feature_class = "c:/data/Hawaii.shp"cursor = arcpy.da.SearchCursor(feature_class, ["SHAPE@"])
for row in cursor:
print("Number of Hawaiian islands: {0}".format(row[0].partCount))
for island in row[0].getPart():
print("Vertices in island: {0}".format(island.count))
for point in island:
print("X: {0}, Y: {1})".format(point.X, point.Y))
几何数据、属性数据一起插入
import arcpy
row_values = [('Anderson', (1409934.4442000017, 1076766.8192000017)),
('Andrews', (752000.2489000037, 1128929.8114))]
cursor = arcpy.da.InsertCursor("C:/data/texas.gdb/counties",
("NAME", "SHAPE@XY"))
for row in row_values:
cursor.insertRow(row)
del cursor
栅格数据访问
import arcpy
arcpy.raster()
NumPy 数组是包含在 Python 的 SciPy 科学计算包中的最著名数组,很多现有 Python 函数都是为了处理 NumPy 数组而创建。
栅格可以使用 ArcPy 函数 RasterToNumPyArray 和 NumPyArrayToRaster 转换为 NumPy 数组,也可以使用同样的函数从这些数组反向转换。您可能想要将 ArcGIS 栅格转换为 NumPy 数组以:
- 执行可以应用到 NumPy 数组上的许多现有 Python 函数中的一个(例如,对数据运行过滤器、执行多维分析或使用优化例程)。
- 通过访问 NumPy 数组中的各个像元来开发自定义函数(例如,执行邻域记数法,更改各个像元值,或者对整个栅格运行累积运算符)。
用于处理栅格的 arcpy 函数
函数 | 说明 |
---|---|
RasterToNumPyArray | 将栅格转换为 NumPy 数组。 |
NumPyArrayToRaster | 将 NumPy 数组转换为栅格。 |
语法
RasterToNumPyArray (in_raster, {lower_left_corner}, {ncols}, {nrows}, {nodata_to_value})
参数 | 说明 | 数据类型 |
in_raster |
要转换为 NumPy 数组的输入栅格。 |
Raster |
lower_left_corner |
可从 in_raster 中的左下角提取处理块以转换为数组。x 值和 y 值采用地图单位。若未指定值,则将使用输入栅格的原点。 (默认值为 None) |
Point |
ncols |
in_raster 中要转换为 NumPy 数组的 lower_left_corner 中的列数。 若未指定值,则将使用输入栅格的列数。 (默认值为 None) |
Integer |
nrows |
in_raster 中要转换为 NumPy 数组的 lower_left_corner 中的行数。 若未指定值,则将使用输入栅格的行数。 (默认值为 None) |
Integer |
nodata_to_value |
在生成的 NumPy 数组中分配 in_raster NoData 值的值。 若未指定值,则将使用 in_raster 的 NoData 值。 (默认值为 None) |
Variant |
将栅格数据转换为 NumPy 数组旨在计算整个栅格行中的像元值的百分比。然后,将会创建一个新的栅格数据。
-
import arcpy
-
import numpy
-
my_array = arcpy.RasterToNumPyArray(
'C:/data/inRaster')
-
my_array_sum = my_array.
sum(
1)
-
my_array_sum.shape = (my_array.shape[
0],
1)
-
my_array_perc = (my_array *
1.0) / my_array_sum
-
new_raster = arcpy.NumPyArrayToRaster(my_array_perc)
-
new_raster.save(
"C:/output/fgdb.gdb/PercentRaster")
只要将栅格数据转换成为NumPy矩阵数组,那么遥感影像的分割、分类、聚类、机器学习等都将成为可能。它内置有很多数学运算函数,支持大量高级的维度数组与矩阵运算,是大量机器学习框架的基础库。它通常与SciPy一起用于科学计算,某种程度上可以取代matlab。
SciPy模块组成:
模块 | 功能 |
---|---|
scipy.cluster | 矢量量化 / K-均值 |
scipy.constants | 物理和数学常数 |
scipy.fftpack | 傅里叶变换 |
scipy.integrate | 积分程序 |
scipy.interpolate | 插值 |
scipy.io | 数据输入输出 |
scipy.linalg | 线性代数程序 |
scipy.ndimage | n维图像包 |
scipy.odr | 正交距离回归 |
scipy.optimize | 优化 |
scipy.signal | 信号处理 |
scipy.sparse | 稀疏矩阵 |
scipy.spatial | 空间数据结构和算法 |
scipy.special | 任何特殊数学函数 |
scipy.stats | 统计 |
元数据访问(或者说描述性数据访问)
地理信息数据类型多种多样,每种数据类型都有特定的属性,在实际使用过程中常常需要事先知道这些信息。arcpy中的describe函数就可以很好的实现这一点。describe函数可以识别很多数据集的类型,包括、要素类、要素数据集、数据库、栅格数据、栅格数据集、镶嵌数据集等等,同时,它返回一个多属性的describe对象,这个describe对象是动态的,它随着输入对象的改变而改变。
语法
Describe (value, {datatype})
参数 | 说明 | 数据类型 |
value |
要描述的指定数据元素或地理处理对象。 |
String |
datatype |
数据的类型。仅当存在命名冲突(例如,如果地理数据库包含同名的要素数据集 (FeatureDataset) 和要素类 (FeatureClass))时需要此项。在这种情况下,数据类型将用于确定要描述的数据集。 (默认值为 None) |
String |
返回值
数据类型 | 说明 |
Describe | 返回的对象属性中包含被描述对象的详细信息。某些返回的对象属性会包含文本值或对象。 |
Describe 对象属性
属性 | 说明 | 数据类型 |
baseName (只读) |
文件基本名称 |
String |
catalogPath (只读) |
数据路径 |
String |
children (只读) |
子元素列表 |
Describe |
childrenExpanded (只读) |
指示子元素是否已扩展 |
Boolean |
dataElementType (只读) |
元素的元素类型 |
String |
dataType (只读) |
元素类型 |
String |
extension (只读) |
文件扩展名 |
String |
file (只读) |
文件名称 |
String |
fullPropsRetrieved (只读) |
指示是否已检索完整属性 |
Boolean |
metadataRetrieved (只读) |
指示是否已检索元数据 |
Boolean |
name (只读) |
元素的用户分配名称 |
String |
path (只读) |
文件路径 |
String |
常见数据类型子Describe对象属性有:
要素类属性
属性 | 说明 | 数据类型 |
featureType (只读) |
要素类的要素类型。
|
String |
hasM (只读) |
指示几何是否启用 m 值。 |
Boolean |
hasZ (只读) |
指示几何是否启用 z 值。 |
Boolean |
hasSpatialIndex (只读) |
指示要素类是否具有空间索引。 |
Boolean |
shapeFieldName (只读) |
Shape 字段的名称。 |
String |
shapeType (只读) |
几何形状类型。
|
String |
栅格数据集属性
属性 | 说明 | 数据类型 |
bandCount (只读) |
栅格数据集内的波段数。 |
Integer |
compressionType (只读) |
压缩类型
|
String |
format (只读) |
栅格格式
|
String |
permanent (只读) |
指示栅格的永久状态:False 表示临时栅格;True 表示永久栅格。 |
Boolean |
sensorType (只读) |
用于捕获图像的传感器类型。 |
String |
表属性
属性 | 说明 | 数据类型 |
hasOID (只读) |
指示表是否包含 ObjectID 字段。 |
Boolean |
OIDFieldName (只读) |
OID 字段(如果存在)名称。 |
String |
fields (只读) |
此表的字段对象的 Python 列表。这与使用 ListFields 函数时相同。 |
Field |
indexes (只读) |
此表的索引对象的 Python 列表。这与使用 ListIndexes 函数时相同。 |
Index |
其他对象属性情况可参看describe函数:Describe—ArcGIS Pro | 文档
二、制作脚本工具
地理处理:制作地理处理工具
地理处理:制作地理处理模型
三、发布地理处理服务
地理处理:共享地理处理服务
不知这个需要写多久,估计也是像以前那篇关于坐标系的文章一样,断断续续需要个三年五载的。
附件:
argis中自带python其他站点包使用
1、将python和pip执行程序的路径添加进系统配置路径
检查argis中的python和pip是否可用
2、pip安装
pypi是Python编程语言的软件存储库,PyPI可帮助您查找和安装Python社区开发和共享的软件。pip用于搜索、下载、管理、卸载PyPI上的Python包。
PyPI · The Python Package Index
搜索pip
也可以直接以链接官网下载pip包,地址是pip · PyPI
下载完成之后,解压到一个文件夹,用cmd进入这个解压好的文件夹,输入:Python setup.py install
再次检查站点是否可用,cmd中输入:pip
3 因国外站点pypi速度较慢,使用国内pypi镜像站点
站点如下:
阿里云 http://mirrors.aliyun.com/pypi/simple
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple
豆瓣(douban) http://pypi.douban.com/simple
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
使用方法:
在pip下,执行以下命令,如下载request包
pip install request -i https://pypi.tuna.tsinghua.edu.cn/simple
会发现,网速果然比一起啊快了好多
如果出现这是未信任的源,修改上述命令,如下:
pip install request -i https://pypi.tuna.tsinghua.edu.cn/simple
- -trusted-host pypi.tuna.tsinghua.edu.cn
如果想使用其为默认源
windows下可修改%HOMEPATH%\pip\pip.ini文件
修改内容为:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=pypi.tuna.tsinghua.edu.cn
easy_install的安装:
1 在命令提示符或终端程序中执行“easy_install --version”检验在当前操作系统是否安装了easy_install.
C:\Users\liangxiang>easy_install --version
setuptools 28.8.0 from e:\python\lib\site-packages (Python 3.5)
2 若无前往https://pypi.python.org/pypi/ez_setup下载一个名叫ez_setup.py的程序。解压安装,方法:cmd进入到对应目录下(我的下载目录为E:\python\Lib\ez_setup-0.9),
执行命令:python ez_setup.py
C:\Users\liangxiang>e
E:\>cd E:\python\Lib\ez_setup-0.9
E:\python\Lib\ez_setup-0.9>python ez_setup.py
easy_install的用法:
1.0 通过库名安装(默认情况下安装最新版本)
easy_install 软件包名称
2.0安装指定版本
easy_install '软件包的名称==版本号'
3.0不指定版本号,要求某一个版本之前或之后的版本
easy_install '软件包名称<=版本号'
4.0安装已经下载的egg文件
easy_install /文件下载路径/egg文件名
5.0安装包卸载
easy_install -m 软件包名称
6.0安装包更新
#默认最新版本
easy_install --upgrade 安装包名称
easy_install -U 安装包名称
#指定升级的版本
easy_install " 安装包名称==版本号"
easy_install " 安装包名称>版本号"
pip的安装:
1 若已经安装easy_install,直接用命令安装
easy_install install pip
2 若无,前往https://pypi.python.org/pypi/pip 下载pip-18.0.tar.gz 文件,解压下载的文件,进入解压后的文件夹中,调出命令行窗口或者终端,输入 python setup.py install
python setup.py install
3 检验pip是否安装成功
C:\Users\liangxiang>pip --version
pip 18.0 from e:\python\lib\site-packages\pip-18.0-py3.5.egg\pip (python 3.5)
pip的用法:
1.0 通过库名安装
pip install 软件包名称
2.0 安装指定版本
pip install "软件包名称==版号"
3.0 不指定版本号,要求某一个版本之前或之后的版本
pip install "软件包名称>=版号"
4.0软件包卸载
pip uninstall 软件包名称
5.0 列出所有安装的库
pip list
pip freeze
6.0 列出所有过期的库
pip list --outdated
7.0 库更新
pip install --upgrade 库名
pip install -U 库名
8.0 过期库批量更新/安装
pip freeze > xxxx.txt #导出当前系统安装的库,保存为TXT文件
( pip freeze > E:\\XXX.txt #保存到指定文件夹 )
pip install -r xxxx.txt
9.0 查询某一个库的相关信息
pip search 库名
10.0 其他高级功能,用help查询
pip help
寄语
很多时候我们对arcpy是望而却步的,不仅仅是因为它需要编码,而是我们对于地理信息很多本身的逻辑思维都不甚了解。比如,你可能听说过空间统计分析,但是你是否知道自相关系数、欧式距离、线性/非线性回归、聚类等知识,我们的回答常常是否定的。大凡一类事物都有他独有的规则和范围体系,当我们说到一类编程语言的时候,就势必涉及语法规则、数据类型、控制结构、编写环境,编译工具等等,当编程语言触及web网络时,也势必涉及网络七层协议、数据交换、https、css、端口号等等,当我们谈到地图服务的时候,又会涉及到网络地址、服务类型、坐标体系、分辨率、比例尺、旋转参数等等。arcpy也同样有它的规则和体系,它属于python的,必须符合python规则,它又是属于arcgis的,它也必须符合arcgis甚至于地理信息的一些规则。掌握这些规则的过程,也是提升我们自身的过程。