ArcGIS开发权威指南

随着WebGIS2.0时代的到来,单个研发技术的实施已经不能满足当前GIS项目的基本需求。如今用户既需要专业人士进行业务管理,又要求整个企业进行协作分享,而且还需要将信息通过网络或者移动端进行发布,这无疑需要多源技术的共同结合才能完成。那么从事GIS行业的开发者就需要了解GIS多源的开发技术。本书主要介绍ArcGIS平台及相关产品的开发模式,包括桌面端开发、Web端开发、移动端开发、数据库开发、脚本开发等主流的ArcGIS开发技术。

 本书要求用户具有ArcGIS for Desktop、ArcGIS for Server、ArcSDE等ArcGIS产品相关基础,同时要求具有C#、Java、Python、JavaScript、PL/SQL等编程基础。本书适合ArcGIS开发工程师、GIS项目经理、GIS系统建设者,以及即将步入社会的相关专业学生阅读。

https://developers.arcgis.com/labs/

新浪微博LBS部门总监 柴琦 & 腾讯街景系统集成架构师 李永韬表示:无论你是一名新手还是一名想要在此软件上有所耕耘积淀的资深专家,你都可以在本书找到答案,全书不仅有架构原理的知识,还有给GISer从业者的建议;从怎样用好Python脚本助力提升桌面开发效率,到Web2.0和3.0时代背景下,怎样搭建GIS服务来用好API、SDK开发适合移动端的应用,本书都给出了相当多的案例,特别值得一提的是其中的一技之长都是编者多年经验总结的干货,颇具参考价值,值得推荐。

纵观全书,ArcGIS平台的各项重要技术,如桌面端开发、服务器端开发、空间数据库开发面面俱全,书中还重点介绍了Javascript、Android、iOS这三项最为流行的开发技术。该书最大的特色在于,读者不仅可以通览ArcGIS平台全面的技术开发体系,同时又可以依据此书快速入门和掌握某项开发技术,可以说宏观中不失细节,丰富中不失体系。

无论是GIS初学者,还是资深人员;无论是学术研讨,还是工程应用,本书都提供了一套完备的ArcGIS平台开发体系和应用实践框架。本书全面、细致、周到,实为一本不可多得的拓展知识的好书,也是一份不可或缺的GIS系统建设者和规划者的手边工具书。

本书主要是以ArcGIS产品体系为基础,介绍相关产品的多种开发模式,分为基础知识篇、桌面开发篇、Web开发篇、移动开发篇、地理数据库开发篇。

第1章 ArcGIS技术概述 

第2章 ArcGIS Engine开发解析

第3章 ArcPy开发解析

3.2.2 数据类型

  -数字

    Python支持五种基本的数字类型,包括整型、长整型、布尔型、浮点型以及复数。其中布尔型是特殊的整型,我们可以将true当成整型值1,false当成整型值0。

  -字符串

    字符串是以单引号或双引号括起来的任意文本,比如“abc”,“xyz”,等等。

  -列表与元组

    可以将列表和元组当成普通“数组”,它能保持任意数量任意类型的Python对象,和数组一样,通过从0开始的索引来访问元素。

    当然,列表和元组还是有区别的。列表元素用中括号[]包裹,列表中的元素个数和值都可以改变,而元组用小括号包裹,元素个数和值不能改变。两者都可以通过切片运算得到子集。

  -字典

    字典是键值对。一般以数字或字符串作为键,而值可以是任意类型。

3.3 第一个ArcPy脚本

3.3.1 Python在ArcGIS的衍生过程

早在ArcGIS9.0版本已经支持Python21了,通过Dispatch Geoprocessor方式调用GP工具,还依赖于PythonWin。

import win32com.client
gp = win32com.client.Dispatch("esriGeoProcessing.GpDispatch.1")

ArcGIS9.2版本引入了arcgisscripting模块,支持跨平台操作,支持Python2.4版本,而且不再依赖于PythonWin,Calcute Field工具也支持Python作为解释器。

import arcgisscripting
gp = arcgisscripting.create()

在ArcGIS9.3/9.3.1时期,Python进行了微小的调整,支持了Python2.5版本,对arcgisscripting模块进行了升级。

import arcgisscripting
gp = arcgisscripting.create(9.3)

ArcGIS10是一个里程碑式的版本,该版本引入了ArcPy,这也是本章学习的焦点,支持Python2.6版本,Python Windows的引入让Python开发者使用更加方便,而且也引入了制图等模块来丰富相关的功能。ArcGIS10.1引入了Python AddinPython Toolbox,更加坚定了Esri支持Python的决心,而且Label Expression也支持Python作为解析器。

3.3.2 GeoProcessing框架中的ArcPy

对于ArcGIS用户来说,可能会弄不太清楚ArcPy、ModelBuilder、ArcToolbox的概念和区别,本节就简单介绍一下相关内容以及Python在其他两个对象中扮演的角色。

  -ArcToolbox

    ArcToolbox工具相当于Esri将ArcGIS桌面软件的组合功能模块化、具体化。ArcGIS提供了近千个工具,这些工具包括数据转换、查询分析、数据管理、制图综合等。

    如果用户发现某些工具并不能满足自己的业务需求,可以自己使用ArcPy编写脚本来扩展,相关方法在本章的ArcPy脚本工具会有所介绍。

  -ModelBuilder

    在实际工作中,用户的业务是流程化的。那么ModelBuilder就可以让用户利用添加工具以及设置逻辑流程方向的方式来完成,当然某个具体的功能也可以使用ArcPy来完成,然后充当工作流程的某一重要环节。

  -ArcPy

    ArcPy是一个以成功的arcgisscripting模块为基础并继承了arcgisscripting功能进而构建而成的站点包。目的是以实用高效的方式通过Python执行地理数据分析、数据转换、数据管理和地图自动化创建基础。

    ArcPy不仅包括一些核心的函数和类,ArcGIS10.2.2版本包括地图制图模块(mapping)、空间分析模块(sa)、数据访问模块(da)、网络分析模块(na)、时间模块(time)、地统计分析模块(ga)等。本章只介绍数据访问模块和地图制图模块的相关内容。

3.3.3 ArcPy的Hello World

ArcPy是一个以早期版本的arcgisscripting模块为基础构建而成的站点包。目的是以实用、高效、便捷的方式通过Python执行地理数据分析、数据转换、数据管理和地图自动化创建的功能实现。而且ArcGIS Desktop自动集成了Python Window,无需自己安装IDE,而且还可以直接利用现成加载的数据进行高效的功能执行,非常方便。

ArcPy开放了Python接口,提供了丰富而纯正的Python体验,具有代码自动完成功能(输入关键字和单击可获得该关键字所支持的属性和方法的弹出列表,从中选择一个属性或方法即可将其插入),并提供了针对每个函数、模块和类的参考文档,如图3.7所示。

使用ArcPy的另一个主要原因是Python十分流行,适合快速制作原型,而且具有编写大型应用程序的能力。并且,你可以接收来自多个不同领域的GIS专业人员和程序员组成的众多Python小群体开发的附加模块。

下面的例子是使用ArcPy获得一个ArcSDE地理数据库的连接用户,并打印出连接用户名和用户连接信息。

>>> users = arcpy.ListUsers(r'Database ConnectionsConnection to DESKTOP-NF3M1HO.sde')

  >>> for user in users:
  ... print ("Username:{0},Connected at:{1}".format(user.Name, user.ConnectionTime))
  ...
  Username:SDE,Connected at:2020-10-14 17:57:06

3.4 ArcPy的开发精解

3.4.1 ArcPy的导入

我们可以直接导入ArcPy,导入之后,用户需要以ArcPy开头来获得该基础包包含的相关函数,如下所示:

>>> import arcpy
>>> arcpy.CopyFeatures_management("road_1","road_2")
<Result 'C:\Users\Administrator\Documents\ArcGIS\Default.gdb\road_2'>

也可以使用from arcpy import *,只是这个时候需要注意变量名称之间冲突的问题。

3.4.2 ArcPy函数的命名规则

成熟的SDK或者API产品的命名都是有一定规范的。每一个ArcToolbox工具对应一个ArcPy函数。ArcPy函数以arcpy.<toolname>_<alias>方式进行规范,<toolname>表示该函数对应的工具的名称,<alias>表示该工具所在工具箱的别名。

3.4.3 ArcPy函数的参数

每个地理处理工具都具有一组固定的参数,这些参数为工具提供执行所需的信息。

-多值参数

 可以通过三种方式来指定多值参数:Python列表形式、字符串形式和值表形式。

#Python列表以中括号括起来
arcpy.Union_analysis([["DLTB",1],["FW",2],["ZD",3]],"union_result")
#字符串形式
arcpy.Union_analysis("DLTB 1;FW 2;ZD 3","union_result")
#ValueTable允许将值组织到一个由行和列组成的虚拟表中
#创建值表时需指定列数,默认为单列
vt=arcpy.ValueTable(3)
vt.addRow("DLTB 1")
vt.addRow("FW 2")
vt.addRow("ZD 3")
arcpy.Union_analysis(vt, "union_result")

3.5 ArcPy函数介绍

3.5.1 概述

在ArcPy中,所有地理处理工具都是以函数形式提供,但是反过来并非所有函数都是地理处理工具。除了工具函数之外,ArcPy还提供了多种函数来更好地支持Python地理处理工作流。比如这些函数可用于列出数据集等对象列表,设置环境变量

3.5.4 描述函数

ArcGIS的数据对象非常丰富,包括数据集、要素类、表、制图表达、几何网络、工作空间等,针对每一个对象都可能需要了解该对象的属性信息的需求,ArcGIS桌面用户选择目标对象,查看属性即可得到相关的对象描述信息。

3.5.5 列表函数

当用户访问一个地理数据库对象时,该对象可能包含多个数据集,每个数据集包含多个要素类,每个要素类包含多个字段,也包括多个索引对象,对于ArcSDE地理数据库来说也可能包括多个版本,我们需要循环每一个对象来进行操作。ArcPy提供了相关的列表函数,获得用户需要操作的对象集合,然后用户可以使用相关的循环语句将集合对象进行枚举,这在ArcPy脚本开发中经常用到。

>>> arcpy.env.workspace = r'Database ConnectionsConnection to DESKTOP-NF3M1HO.sde'

注意:要先导入from arcpy import *;否则要用arcpy.ListDatasets()

3.6 ArcPy几何类介绍

类是面向对象程序设计语言中的概念,是对某种类型的对象定义变量和方法的原型。ArcPy也提供了很多类对象,包括游标类使用游标来修改属性)(使用游标类来添加点要素)、错误异常类、字段类、通用类、几何类、统计分析类、参数类、记录集合类等。每个类对象提供了现成的属性和方法,用户通过这些类可以编写满足实际工作需要的脚本来提高工作效率。

很多情况下,用户在使用脚本处理数据时,都会收到数据生产商提供的坐标文件,这些以文本存储的x,y坐标有自己的规范,用户可以根据不同的规范将这些文本文件转换为点、线、面等对象。本节就对常用的几何类进行详细地介绍。

3.6.1 几何类

ArcPy的Geometry是一个基类,该类包括点、多点、线、面四种几何类型。值得注意的是截止到ArcGIS10.2.2版本,ArcPy还不支持弧段。Geometry类支持将对象转换为JSON、WKB、WKT等常用的数据格式以供用户的不同需求的使用;该类还提供了长度、面积、重心点、标注点、投影信息等属性查询,而且支持常用的空间关系函数的使用。

3.6.2 几何构造

-点

 ArcPy的Point类包含了X、Y、Z、M、ID这些属性方法,而且也包含空间关系的相关方法,但是ArcPy的Point对象并不属于Geometry对象,需要将Point对象转换为PointGeometry对象才能完全继承Geometry的相关方法。

-线

线对象是由一个或多个路径定义的形状,其中路径是指一系列相连的线段。每一个路径需要使用点对象来生成,通过Array对象将多个路径组成一个集合,然后再通过Polyline函数来获得线对象。

-面

面对象是指由一系列相连的x,y坐标对定义的闭合形状。在构建过程中可以参考线的构建方式。唯一有区别的是,线的坐标串是不闭合的,而面是闭合的。

>>> row_values=[('Anderson', (1409934.4442000017, 1076766.8192000017)),
...               ('Andrews', (752000.2489000037, 1128929.8114))]
...               
>>> cursor = arcpy.da.InsertCursor('检查井',
...                                ['Road_Name', 'SHAPE@XY'])
...                                
>>> for row in row_values:
...     cursor.insertRow(row)
...     
>>> del cursor

插入线

>>> import numpy as np
>>> from arcpy import *
>>> array = Array([Point(0,1),Point(1,2),Point(0,3)])

  >>> polyline = Polyline(array)

import arcpy

# Create a polyline geometry

array = arcpy.Array([arcpy.Point(459111.6681, 5010433.1285), arcpy.Point(472516.3818, 5001431.0808), arcpy.Point(477710.8185, 4986587.1063)])

polyline = arcpy.Polyline(array)

# Open an InsertCursor and insert the new geometry

cursor = arcpy.da.InsertCursor('C:/data/texas.gdb/counties', ['SHAPE@'])

cursor.insertRow([polyline])

# Delete cursor object

del cursor

3.6.3 空间关系

-空间关系判断

ArcPy提供了常用的空间关系的判断,比如包含关系(Contains)、解除关系(Touches)、重叠关系(Overlaps)、所属关系(Within)等,在很多业务需求中都会使用相关的叠加分析,利用丰富的关系函数来判别对象的空间关系,以满足不同的业务需求。

>>> from arcpy import *
>>> pt=Point(0.1,0.1)
>>> ptg=PointGeometry(pt)
>>> geo=ptg.buffer(100)
>>> geo.contains(ptg)
True

-生成新对象

ArcPy也同样提供了诸如边界函数(boundary)、缓冲区函数(buffer)、裁剪函数(clip)、分割函数(cut)、差异函数(difference)、相交函数(intersect)、合并函数(union)等,使用这些函数可以生成一个新的结果对象。

>>> from arcpy import *
>>> ptg1=PointGeometry(Point(1,1))
>>> ptg2=PointGeometry(Point(2,1))
>>> geo1=ptg1.buffer(5)
>>> geo2=ptg2.buffer(5)
>>> geo3=geo1.union(geo2)
>>> geo3.area
88.52476770763553

3.7 ArcPy的数据访问模块介绍

数据访问模块(arcpy.da)是ArcGIS10.1版本启用的新功能,用于处理数据的Python模块。通过它可控制编辑会话、编辑操作、改进的游标支持(包括更快的性能)、表和要素类与NumPy数组之间相互转换的函数,以及对版本化、复本、属性域和子类型工作流的支持。

3.7.1 高性能的游标支持

在ArcGIS10.1版本之前,也就是还没有引入数据访问模块时,用户在对数据进行查询或者修改操作时会使用ArcPy的游标函数arcpy.InsertCursor,在ArcGIS10.1版本中类似的操作也会使用数据访问模块的游标函数arcpy.da.InsertCursor,需要留意其中的不同,由于后者的高性能优化,建议读者尽可能地选择数据访问模块的游标函数。

-查询游标(SearchCursor)

 查询游标用于建立从要素类或表中返回的记录的只读访问权限,返回的是一组迭代的元组。元组中值的顺序与field_names参数指定的字段顺序相符。该游标函数支持对属性条件和空间条件的过滤,也可以限制返回记录,支持复杂的SQL语法使用(如top、Order by、group by等)。

SearchCursor(in_table,field_names,{where_clause},{spatial_reference},{explode_to_point},{sql_clause})

in_table:要素类、图层、表或表视图对象,必选;

field_names:字段名称列表,对于单个字段,可以使用一个字符串,而不使用字符串列表,如果要访问输入表中的所有字段,可以使用星号(*)代替字段列表。

一般情况下,用户都会访问空间数据的几何属性,也许只想得到X、Y坐标,也许只想得到WKT串或JSON串,那么我们可以使用ArcPy提供的令牌信息来提高访问效率。

SHAPE@XY——要素的x,y坐标
SHAPE@TRUECENTROID——要素的质心x,y坐标
SHAPE@X——要素的双精度x坐标
SHAPE@Y——要素的双精度y坐标
SHAPE@Z——要素的双精度z坐标
SHAPE@M——要素的双精度m值
SHAPE@JSON——几何的JSON字符串(ArcGIS10.1 SP1)
SHAPE@WKB——OGC几何的二进制WKB(ArcGIS10.1 SP1)
SHAPE@WKT——OGC几何的文本WKT(ArcGIS10.1 SP1)
SHAPE@——要素的几何对象
SHAPE@AREA——要素的双精度面积
SHAPE@LENGTH——要素的双精度长度
OID@——ObjectID字段的值

where_clause:类似于SQL语句的WHERE条件,可选;

spatial_reference:要素类的空间参考,可选。

explode_to_points:要素解构为单个点或折点,如果设置为True,则一个包含三个点的多点要素将表示为三行,默认为false。

sql_clause:以列表或元组的形式列出的可选SQL前缀(distinct)和后缀(order by)子句对。

-更新游标(UpdateCursor)

UpdateCursor用于建立从要素类或表返回的记录的读/写权限。该游标返回一组迭代列表。使用方法可以参考SearchCursor的相关说明。

语法介绍:UpdateCursor(in_table,field_names,{where_clause},{spatial_reference},{explode_to_points},{sql_clause})。

 

-插入游标(InsertCursor)

InsertCursor可在要素类或表上建立写入游标。可以使用InsertCursor来添加新行。对点要素类使用InsertCursor时,创建PointGeometry并将其设置到SHAPE@令牌操作的代价相对较高。此时,使用诸如SHAPE@XY、SHAPE@Z和SHAPE@M等令牌定义的点要素访问反而更为快速有效。

3.8 ArcPy的制图模块

ArcPy一共几个模块?:

https://desktop.arcgis.com/zh-cn/arcmap/10.3/analyze/arcpy/what-is-arcpy-.htm

第4章 ArcGIS API for JavaScript开发解析

第5章 服务对象扩展(SOE)开发解析

第6章 ArcGIS Runtime SDK for Android开发解析

第7章 ArcGIS Runtime SDK for iOS开发解析

第8章 ArcGIS的空间SQL开发解析

第9章 ArcSDE SDK开发解析

ArcSDE SDK For Java二次开发介绍、演示样例:https://www.cnblogs.com/hrhguanli/p/4080970.html

Python调用Java,Java调用ArcSDE SDK:https://www.cnblogs.com/bandaobudaoweng/p/10785766.html

原文地址:https://www.cnblogs.com/2008nmj/p/13801096.html