使用python制作ArcGIS插件(3)ArcPy的使用说明

时间:2024-01-11 21:01:14

使用python制作ArcGIS插件(3)ArcPy的使用说明

by 李远祥

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

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

在 Python 中使用 ArcPy 的另一个主要原因是,Python 是一种通用的编程语言。Python 是一种支持动态输入的解释型语言,适用于交互式操作以及为称为脚本的一次性程序快速制作原型,同时其具有编写大型应用程序的强大功能。用 ArcPy 编写的 ArcGIS 应用程序的优势在于,可以使用由来自多个不同领域的 GIS 专业人员和程序员组成的众多 Python 小群体开发的附加模块。

上述灰色字体介绍部分来自ArcGIS的官方帮助说明,可以帮助大家了解ArcPy的来龙去脉。从帮助上看出,Arcpy可以做的几项重要的工作,地理数据分析、数据转换、数据管理和地图自动化创建。其中,地理数据分析、数据转换、数据管理都是toolbox的工具都可以实现,地图自动化创建则是需要工具以外的东西,则需要开放更多的接口进行地图的交互。

接下来可以看看ArcPy到底提供了哪些操作的接口。学习ArcPy最重要的还是使用Desktop的帮助,这个帮助基本上就是一个cookbook,所需要的都可以在帮助里面找到,可以根据帮助看看那些操作能用,哪些不能用。

使用python制作ArcGIS插件(3)ArcPy的使用说明

从帮助里面可以看到ArcPy里面设计到的功能部分,涉及到常规操作的一些函数、类、数据接入、制图等,还有提供一些非工具调用的扩展模块的特殊接口,这些接口都是交互性的接口。如果希望能够完全使用python进行插件开发,那必须掌握工具的调用(也就是说知道哪些工具能实现什么什么功能),以及ArcPy的函数和类,与地图交互部分,必须掌握Mapping模块,因为该模块涉及到地图的交互操作。

ArcPy函数部分,基本上将AO常用的操作部分进行了封装,而且调用相当简介。可以看到游标、字段、地理数据库管理等的接口。

使用python制作ArcGIS插件(3)ArcPy的使用说明

例如看搜索游标的调用实例,相对与AO来说,简直就是简单到极致,完全符合常规的思维模式。指定数据源,查找字段等就能查出结果。

import arcpy

fc = "c:/data/base.gdb/roads"
field = "StreetName"
cursor = arcpy.SearchCursor(fc)
for row in cursor:
    print(row.getValue(field))

例如列出数据,非常简介的调用,遍历出各种数据的列表

使用python制作ArcGIS插件(3)ArcPy的使用说明

调用也是非常简单

import arcpy

# For each field in the Hospitals feature class, print
#  the field name, type, and length.
fields = arcpy.ListFields("c:/data/municipal.gdb/hospitals")

for field in fields:
    print("{0} is a type of {1} with a length of {2}"
          .format(field.name, field.type, field.length))

从这两个例子可以看出,ArcPy的设计都是以极简思维去设计接口和函数的,尽可能符合人类思维模式,避免了像其他高级语言那样严格的通过定义变量、变量类型等严格的操作。

再看涉及到的类型,一些常规的细粒度控制也做得相当不错。哪怕是图形的控制,都可以通过ArcPy来控制。

使用python制作ArcGIS插件(3)ArcPy的使用说明

例如创建一个面,通过ArcPy只需要几行简单的代码,完成面要素创建并加入到已有的面图层中

import arcpy

# A list of features and coordinate pairs
feature_info = [[[1, 2], [2, 4], [3, 7]],
                [[6, 8], [5, 7], [7, 2], [9, 5]]]

# A list that will hold each of the Polygon objects
features = []

for feature in feature_info:
    # Create a Polygon object based on the array of points
    # Append to the list of Polygon objects
    features.append(
        arcpy.Polygon(
            arcpy.Array([arcpy.Point(*coords) for coords in feature])))

# Persist a copy of the Polyline objects using CopyFeatures
arcpy.CopyFeatures_management(features, "c:/geometry/polygons.shp")

在制图方面,同样可以看到一些细粒度的控制,如涉及到地图文档控制、符号控制等

使用python制作ArcGIS插件(3)ArcPy的使用说明

可以说,这些都是可以从各个细节地方去控制地图,并做出一些交互操作。掌握了这些基本的函数和类,对于基本一定GIS基础的开发人员来说,基本上可以制作出各种的插件了,避免使用AO去做长周期的开发。

个人认为,如果将ArcGIS插件式开发定义为使用ArcPy去开发的话,那就太局限了。因为python是一个优秀的语言,有着活跃的开发社区,有非常多的优秀算法和优秀的资源,可以通过python的模式而不是仅仅限于ArcPy去开发插件,这才能做出更加优秀的功能。