python编写arcgis脚本教程_ArcGIS二次开发(1)arcpy简介及编写一个自己的脚本

1.1.前言

在数据处理过程中,一般需要做一些数据的整理,如图层合并、裁剪等工作。虽然在ArcMap中也有提供对应的工具(批量处理、建模等),但对于多个步骤之前的衔接及其它特殊处理存在困难,本系列文章将带你一步步理解ArcGIS二次开发并编写自己的工具。本系列文章内容并非来自课程教材,而是作者在日常工作的基础上进行总结,如果你有更好的数据处理方法可通过站点(GIS数据共享)或者微信公众号(GIS数据共享)进行留言。

1.2.什么是arcpy

ArcPy是一个 Python 站点包,可提供以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化。

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

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

1.3.如何使用arcpy

1.导入arcpy

import arcmap即可导入arcpy,由于比较简单,相信各位读者在该步骤上不会有什么问题。但需要注意如果你是在ArcMap里面的python(如下图所示)运行,那么不需要添加import arcpy,因为ArcMap窗口下打开的python在启动时已经导入了arcpy。

15902131194709364.png

2.获取函数方法

方法一:在你不知道函数名时,可以采用此方法:在toolbox打开其中一个工具后,在右下角会显示Tool Help按钮,点击该按钮,进入ArcGIS Help界面并自动进入对应的方法,往下翻,可以看到Syntax和Code sample,前者描述了函数如何使用,后者使用该函数编写了python实列代码,你的代码也应该按照实例代码进行编写,但你可以删除不必要的注释。

15902131292428602.png

15902131386203504.png

方法二:在你知道对应ArcMap中工具名称或函数名时,可以使用此方法。打开ArcGIS help(网上有在线ArcGIS online help、可以在开始菜单、ArcGIS任意产品的help菜单下都可以打开),在search菜单栏进行搜索查看,截图图方法一的第二个图一致。

3.编写脚本

从步骤2中,我们可以获取到函数名及函数对应的参数,在熟悉每一个参数后,将函数复制到自己的脚本下,并填写相应的参数及对应的数据,程序就可以开始跑了。示例代码见ArcGIS 二次开发系列之Python版示例代码——矢量栅格数据批量投影转化[http://qhftdx.cn/Home/Info/2222]

4.连接多个步骤

在步骤2和步骤3的引导下,你可以获取多个函数,并填写到你的脚本中。通过阅读步骤2我么可以发现几乎每个函数都有一个共同点就是有数据输入和数据输出,此时我们可以将上一个函数的输出当作下一个函数的输入,那么所有函数就串起来了。

ArcGIS提供了一个可写入输出要素类和表的内存工作空间。作为将地理处理输出写入磁盘上的某个位置或网络位置的备选方案,可将输出写入内存工作空间中。通常,将数据写入内存工作空间要明显快于写入其他格式(如 shapefile 或地理数据库要素类)。但写入内存工作空间的数据是临时性的,将在关闭应用程序时被删除。

要将数据写入内存工作空间,使用路径 in_memory。

5.批量运算

在前面步骤介绍的基础上,可以发现你的整个数据处理流程可以看作原始数据的输入和最终数据的输出,那么你可以将你写的代码改写为一个函数,这样只需要关注你的输入数据和输出数据。此时你可以通过python筛选得到你输入文件夹下面的所有输入文件作为输入参数,并使用python设置输出文件的规则,那么你的整个批处理代码就写出来了。

1.4.注意事项:

通过5个步骤,相信你已经编写好自己的程序,但是有时候你会发现你的程序运行越来越慢甚至出现错误以及硬盘开销越来越大的问题,可以尝试如下方法:

1.提示输出数据已经存在:使用python或arcpy删除上一次循环保存的数据,或在你函数的最开始加上arcpy.env.overwriteOutput = True。这样如果输出数据已经存在,那么会被直接删除。

2.硬盘占满:使用in_memory将中间输出数据存储到内存中,这样可解决中间数据占用硬盘存储空间的问题,同时也能提高计算机运算速度,或者使用arcpy删除临时数据。

3.脚本提示内存已满:这种情况不一定是因为1描述的原因导致,可能是。在将临时数据写入到in_memory,可以使用arcpy的数据管理进行删除,或者每次写入数据到in_memory时都是用相同的名称。