AGS Python开发-ArcPy开发基础


1、Python与ArcGIS关系

ArcGIS提供了ArcPy包,Python是通过该ArcPy包来操作ArcGIS中的功能。ArcPy可以理解为ArcGIS针对Python语言提供的开发API。

2、导入ArcPy与模块搜索路径

(1)导入ArcPy
示例1:import arcpy
示例2:import arcpy.mapping
示例3:from arcpy import env
示例4:from arcpy import env as ENV
(2)模块搜索路径
导入ArcPy时,会先搜索PYTHONPATH环境变量。如何未定义环境变量,则搜索sys.path定义的路径:Python27\ArcGIS10.5\Lib\site-packagesPython27\ArcGISx6410.5\Lib\site-packages。ArcGIS在安装Python时,会在这两个目录下创建Desktop10.5.pth和Server10.5.pth。这两个文件记录了ArcPy需要的路径:
*C:\arcgis\Desktop10.5\bin
C:\arcgis\Desktop10.5\ArcPy
C:\arcgis\Desktop10.5\ArcToolBox\Scripts

如果出现提示找不到ArcPy模块的错误,可以手动创建该文件并添加上面的路径。

3、调用地理处理工具和地理处理服务

3.1、调用地理处理工具

所有工具可以ArcPy函数方式调用,也可以工具箱别名的模块调用。
函数方式:arcpy.GetCount_management(features)
工具箱模块方式:arcpy.management.GetCount(features)

3.2、调用自定义地理处理工具

建议在ImportToolbox()中定义自定义工具箱的别名,ArcPy使用arcpy.<工具名称>_<别名>方式调用。

arcpy.ImportToolbox("c:/mytools/geometrytools.tbx", "mytools")
arcpy.CreateRegularPolygons_mytools(params)

3.3、调用地理处理服务

地理处理服务器名称和工具箱名称使用分号隔开。

arcpy.ImportToolbox("http://flame7/arcgis/services;GP/BufferByVal","mytools")
arcpy.BufferPoints_mytools(inFeatureSet, "5 km")

3.4、调用地理处理工具的技巧

技巧1:调用ArcGIS自带的地理处理工具
ArcGIS提供了数量众多的地理处理工具,这些工具都可以通过ArcPy来调用。在调用地理处理工具时,需要清楚工具的处理流程,以及输入输出参数等信息。为了方便调用与调试,可按如下步骤进行:

  1. 在桌面软件中运行地理处理工具
    在工具运行窗口中可以查看工具说明,以及相关参数设置要求。同时还可以测试输入参数与输出结果。
  2. 查看地理处理工具调用方式
    方式1:在桌面软件中,工具拖拉到Python命令行窗口,即可查看到工具调用名称,以及相关参数设置要求。
    方式2:调用help()方法查看工具调用文档。在桌面软件或者IDE环境中的Python命令行中,输入help(arcpy.toolname)查询。
    方式3:直接查看桌面软件帮助中的工具参考。在参考中还包含了示例代码。
  3. 在Python中调用地理处理工具
    根据地理处理工具调用要求,编写Python调用代码。

技巧2:调用自定义的地理处理模型
对于自定义的地理处理模型,在Python中可以使用两种调用方式:

  1. 直接调用
    直接调用是将自定义处理模型当作整理看待,调用方式:
arcpy.importToolbox("toolbox_path", "mytoolbox")
arcpy.Mytool_mytoolbox("params")
  1. 将模型导出为Python脚本,再复用脚本内容
    ArcGIS提供了自定义地理处理模型导出为Python脚本的功能,导出的脚本可以直接在python中使用,也可以在其上修改增加自定义的功能。
    这种方式可以看作是可视化编码方式,可以减少调用系统地理处理工具的复杂度。

4、ArcPy中的OMD

ArcPy由三大部分组成:ArcPy函数、ArcPy类、ArcPy模块。
(1)ArcPy函数
ArcPy函数用于执行特定的任务,方便执行地理处理工作流。ArcPy中的函数分为两种:地理处理函数和非地理处理函数。所有地理处理工具都以地理处理函数提供。
(2)ArcPy类
ArcPy类存储地理对象相关的信息,通常用于解析地理数据,或者作为地理处理工具的参数。
(3)ArcPy模块
ArcPy模块是将共性的功能以模块方式提供,方便调用。ArcPy模块包括数据访问模块(arcpy.da)、制图模块(arcpy.mapping)、空间分析扩展模块(arcpy.sa)、网络分析扩展模块(arcpy.na)。以及工具类模块:时间模块(arcpy.time)。

4.1、ArcPy中的函数

ArcPy中的函数主要包括了:描述数据的函数(Describe)、判断数据是否存在的函数(Exists)、数据迭代相关的函数(如:ListFields)、外部输入参数相关的函数(如GetParameterAsText)、许可检查相关的函数(如CheckExtension)、环境设置相关的函数(如GetSystemEnvironment)、消息错误处理相关的函数(如GetMessage

详情参见:http://desktop.arcgis.com/zh-cn/arcmap/latest/analyze/arcpy-functions/alphabetical-list-of-arcpy-functions.htm

4.2、ArcPy中的类

分类 主要类 说明
要素类或表、栅格类 FeatureSet、RecordSet、Raster 代表要素图层或者表、栅格图层
要素数据内容相关类 Cursor、Row 代表要素图层或者表中记录的每行数据
要素图层字段相关类 Field、FieldInfo 代表要素图层或表的字段信息
几何类型与空间参考 Point、Multipoint、PointGeometry、Polyline、Polygon、Extent、SpatialReference
图表类 Graph、GraphTemplate 如:气泡图、直方图、饼图等
ToolValidator相关类 Filter、Parameter、Schema、Value 自定义Python工具箱所需要的参数类
异常类 ExecuteError、ExecuteWarning
其他核心类 环境设置类:env;地理处理结果类:Result;索引类(空间索引和属性索引):Index;多值参数类:ValueTable;SDE SQL操作类:ArcSDESQLExecute;辅助类:Array、RandomNumberGenerator

4.3、ArcPy中的模块

模块名称 主要功能
arcpy.da 数据访问模块。提供了增、删、查、改数据的类和函数。
arcpy.mapping 地图制图模块。提供了操作mxd文档、地图渲染、地图打印输出、地图服务发布等功能。
arcpy.na 网络分析扩展模块。用于访问网络分析地理处理工具。
arcpy.sa 栅格分析模块。用于访问空间分析地理处理工具。

5、描述数据的函数

通过Describe函数可以查询所有类型数据的属性信息。如:数据几何类型、字段、索引等。不同的数据类型可查询的属性信息不同。

ftClass="D:/mapdata/test/china/chinamap.gdb/citiesbuffer"
ftDesc = arcpy.Describe(ftClass)
print(ftDesc.shapeType)
print(ftDesc.featureType)
print(ftDesc.shapeFieldName)
print(ftDesc.OIDFieldName)
print(len(ftDesc.fields))
print(ftDesc.spatialReference.name)

6、环境设置类

ArcPy中环境设置定义在env类中。
(1)环境设置读取和更改

arcpy.env.scratchWorkspace = "c:/mapdata"
arcpy.env.workspace = "c:/mapdata"
arcpy.env.XYTolerance = 2.5
workspace = arcpy.env.scratchGDB

(2)检查环境变量名称

arcpy.ListEnvironments()

(3)重设环境设置

arcpy.ResetEnvironments()
arcpy.ClearEnvironment("workspace")

7、消息处理

(1)读取消息
在地理处理工具执行过程中,会输出处理消息,消息内容包括:时间、参数、错误等。可通过如下方式获取:

方式1:直接读取

result=arcpy.GetCount_management("D:/mapdata/test/worldshp/cities.shp")
print(arcpy.GetMessageCount())
print(arcpy.GetMessages())
print(arcpy.GetMessage(0))

方式2:从result中读取

result=arcpy.GetCount_management("D:/mapdata/test/worldshp/cities.shp")
print(result.messageCount)
print(result.getMessage(0))
print(result.getMessages(2))

(2)自定义消息
如果是控制台输出,可以直接使用print语句,也可以使用ArcPy提供的消息函数:

arcpy.AddMessage("info")
arcpy.AddWarning("warning")
arcpy.AddError("error")

8、错误处理

(1)ExecuteError类
地理处理工具失败时会抛出arcpy.ExecuteError类。其他的异常可以使用sys.exc_info()获取。

import arcpy
import sys
 
try:
    result = arcpy.GetCount_management("c:/erro.shp")
 
except arcpy.ExecuteError:
    arcpy.AddError(arcpy.GetMessages(2))
except:
    e = sys.exc_info()[1]
    print(e.args[0])

(2)错误跟踪
在较大复杂的脚本中,可结合systraceback模块来查找跟踪错误。

import arcpy
import sys
import traceback
arcpy.env.workspace = "C:/Data/myData.gdb"
try:
    arcpy.CreateSpatialReference_management()
except arcpy.ExecuteError: 
    msgs = arcpy.GetMessages(2) 
    print(msgs)
except:
    # Get the traceback object
    #
    tb = sys.exc_info()[2]
    tbinfo = traceback.format_tb(tb)[0]
    pymsg = "PYTHON ERRORS:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
    msgs = "ArcPy ERRORS:\n" + arcpy.GetMessages(2) + "\n"
    print(pymsg)
    print(msgs)

(3)Result对象中获取错误消息

result = arcpy.Clip_analysis("roads", "urban_area", "urban_roads")

消息总数:result.messageCount
按索引号获取消息:result.getMessage(index)
按类型获取消息:result.getMessages(severity)

消息类型分:0(消息)、1(警告)、2(错误)

9、许可检查

使用arcpy.CheckExtension("3D")和arcpy.CheckOutExtension("3D")检查许可。

import arcpy
try:
    if arcpy.CheckExtension("3D") == "Available":
        arcpy.CheckOutExtension("3D")
    else:
        print("license error")    
    arcpy.env.workspace = "D:/GrosMorne"
    arcpy.HillShade_3d("WesternBrook", "westbrook_hill", 300)
    arcpy.Aspect_3d("WesternBrook", "westbrook_aspect")
except arcpy.ExecuteError:
    print(arcpy.GetMessages(2))
finally:
    arcpy.CheckInExtension("3D")

10、地理数据路径设置与中文处理

(1)路径设置
在访问本地数据时,常需要设置数据存放路径,设置方式有两种:
方式1:绝对路径。
直接将绝对路径传入地理处理工具函数中。

arcpy.GetCount_management(r"c:\temp\streams.shp")

方式2:相对路径。
借助env.workspace,传入数据路径到地理处理工具函数中。

arcpy.env.workspace = "C:/data/base.gdb"
arcpy.GetCount_management("streams")

(2)中文处理
凡涉及到中文的地方,如中文路径,中文信息输出控制台,建议按如下方式处理:

  • 脚本文件头定义字符编码utf-8,同时脚本文件使用utf-8编码。
  • 中文字符串使用unicode标识,如:print(u"中文")
  • 中文信息输出到磁盘文件,将其转换为utf-8编码。如:output = u"输出内容".encode("utf-8")
  • 中文信息(utf-8编码)读取到内存,将其转换为unicode编码。如:input = f.read().decode("utf-8")

(3)自定义消息中的中文处理
如果使用AddMessages等消息函数输出中文,可按如下两种方式处理:

  1. 将所有编码统一到操作系统的默认编码中。如GBK

获取操作系统编码信息:sys.getfilesystemencoding()sys.getdefaultencoding()locale.getdefaultlocale()

  1. 如果只能用utf-8,则使用英文输出。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容