​ 这篇是读书笔记。同事手里有本《面向ArcGIS的Python脚本编程》,系统的介绍了如何结合ArcGIS使用python。最近拿来阅读,觉得受益颇多。最早期我是通过python自身的学习资源、书籍、ArcGIS帮助文档入门的,知识体系虽然建立起来了,但是很多细节没有考虑到,对照书中的内容温故知新、查漏补缺。

arcpy与AO

​ 书的开篇就介绍了脚本语言和程序语言的区别。我将其引申到日常工作中用户会经常问到的,“为什么AO可以实现的东西,arcpy却不能?”“为什么arcpy的功能这么‘粗粒度’?”

​ AO中包含了ArcGIS用到的所有编程对象,包含了数以千计的不同对象,因此程序员可以精细控制软件的外观和运行机制。Python作为一种非常平易近人的语言,既是脚本语言又是程序语言,在ArcGIS平台中,python更多充当的是脚本语言的角色,例如:访问ArcGIS现有的功能,组合各种现有功能来扩展ArcGIS的功能,更可以作为一种“粘合剂”将更多的功能整合进来。用书中的话讲,脚本语言就是在“控制其他应用程序以实现任务自动化”。arcpy是ArcGIS提供的python站点包,用于访问ArcGIS 的地理处理功能,定位正在于此。

arcpymodel builder

​ model builder(简称MB吧)是ArcGIS Desktop中我认为最可爱的功能没有之一,它采用了编程的思想却免去了书写代码,是给非程序员实践创造的启航之地。日常工作中,很多逻辑简单、功能清晰的任务都可以使用MB实现。以前写过一篇,《如何在ArcGIS for Desktop中实现批量任务》,具体不再展开。你可能由这些疑问,“MB也能完成批量任务,我何时应该考虑使用python?” 当然这里回答的是“不得不”的问题,如果你本来就是编程高手,从一开始就会觉得MB限制了你的想象力,如下回答可能不需要考虑。

​ MB的局限性有什么?或者说相比之下,python能更多实现什么?

  • python可以实现更高级的编程逻辑。例如嵌套循环是MB的软肋,一遇到多重遍历之类的任务就只能呵呵了。
  • python可以实现更底层的处理任务。例如我们可以使用Cursor,遍历表并对其增删改等等。
  • python可以集成第三方的资源。例如R语言等第三方类库来处理数据执行任务。
  • python可以不在ArcGIS软件内部执行任务,只需要安装并授权ArcGIS软件,然后通过独立脚本的形式运行。既然可以独立运行,就可以定义系统任务定时执行。

python基础

命名规范

​ 这本书中也提到了命名规范的内容,这是我在初期没有考虑到的问题。随着时间的推移和协同工作的需要,渐渐发现这是个非常重要的内容,大型的科技公司会更重视这个方面。编程和写文章一样,仅仅懂得一种语言的语法、词汇是不足够的,更重要的是如何将文章写的清晰优雅,对应到代码中就是简洁高效。python的官方命名规范:Style Guide for Python Code,它是PEPs(Python Enhancement Proposals)中的一部分。

​ 变量名及脚本文件名:

  • 变量名以字母开头,不能使用特殊字符开头
  • 全部使用小写字母
  • 必要的时候使用下划线,增加代码可读性
  • 使用描述性变量,避免使用俚语或缩写
  • 变量名尽量简短

​ 缩进:

  • 建议使用四个空格表示缩进
  • 不要同时使用tab和空格进行缩进

​ 注释:

  • 建议每个功能块都有相关注释
  • 每个脚本工具或函数文件前需要有个头文件,应该包含脚本文件名、功能介绍、运行要求、作者、开发时间等信息。

从脚本外部输入参数

​ 使用系统参数 sys.agv 。系统参数sys.argv[0]存储的是脚本自身的地址,因此额外的系统参数是从1开始。

1
2
3
4
5
# This is content of testInputPara.py.
import sys
x = int(sys.argv[1])
y = int(sys.argv[2])
print(x*y)

​ 在命令行中执行:

1
2
D:\ForTempTest>python testInputPara.py 2 8
16

​ 在交互式python编译器中使用 input(),可以接收用户输入。

1
2
3
4
>>> x = input("")
bingo
>>> print(x)
bingo

​ ArcGIS 中通过创建脚本工具,与GP框架结合的调用方法,是更适合ArcGIS用户的方法。以前写过 《在ArcGIS中创建Python工具(一)(二)(三)》几篇,点击链接可以近一步了解脚本工具。