将点进行排序并编号---ArcGIS脚本工具的制作

好久没更新博客了,就好像好久没谈过恋爱,实际压根没谈过(手动滑稽),今天跟别人说,他们都很诧异,想想自己已近中年(联合国的标准),确实不可思议,所以很遗憾呀!
有人说到了什么年龄就该做什么事,这样才不负时光,而我感觉在这十年里,时光仿佛静止了一样,自己停滞不前,任风云万变,如今却一声长叹。
唉,又发了个牢骚,人到中年是不是这个状态呢?

切到正题!
前段时间,和同事都接到一个问题,是关于点排序的,用户想将一些点,按照空间位置,从左到右,再从上之下排序编号,如下图所示:
样例

本来是个很简单的事情,主要使用sort工具就可以。
但是用户觉得麻烦,
因为详细的步骤还是有些繁琐的,步骤如下:
1、先要在点要素属性表中添加X和Y两个字段,
添加XY字段
2、然后将这两个作为排序字段,生成排序后的点数据
使用sort工具
3、之后再添加一个排序结果字段,将OBJECTID字段值赋给这个字段
使用sort工具
确实步骤有些多,最后通过脚本工具一键生成排序序号
创建脚本工具的过程如下
1、首先创建工具箱
工具箱创建
2、添加脚本
添加脚本
3、打开脚本工具创建向导,填写信息
工具向导
4、添加Python脚本
这一步要加载已经写好的Python文件(*.py格式)
Python脚本的思路主要为:
4.1 首先规划好该工具需要多少个参数

1
2
3
4
5
6
# Script Tool Parameters
InputFeature = arcpy.GetParameterAsText(0)
Order = arcpy.GetParameterAsText(1)
Sort_X = arcpy.GetParameterAsText(2)
Sort_Y = arcpy.GetParameterAsText(3)
OutputFeature = arcpy.GetParameterAsText(4)

4.2 然后使用arcpy.CopyFeatures_management()将原数据复制一下
4.3 再使用arcpy.AddXY_management()将复制得到的数据添加XY两个字段
4.3 随后判断一下点排序的大体方向
这里要注意一下,由于编码问题,当代码有中文字符,需要使用.decode()方法解码中文,不然工具运行时会报错

1
2
3
4
if Order == '横向'.decode('UTF-8'):
sortfield = [["POINT_Y", Sort_Y],["POINT_X", Sort_X] ]
elif Order == '纵向'.decode('UTF-8'):
sortfield = [["POINT_X", Sort_X],["POINT_Y", Sort_Y]]

4.4 准备好输入参数后,使用arcpy.Sort_management(),生成排序后数据
4.5 接着用arcpy.AddField_management()添加排序编号字段
4.6 最终使用字段计算工具arcpy.CalculateField_management(),将OBJECTID字段值赋给这个字段

python脚本完成!

所有代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import arcpy
import time

# Script Tool Parameters
InputFeature = arcpy.GetParameterAsText(0)
Order = arcpy.GetParameterAsText(1)
Sort_X = arcpy.GetParameterAsText(2)
Sort_Y = arcpy.GetParameterAsText(3)
OutputFeature = arcpy.GetParameterAsText(4)

tempfea = InputFeature+str(time.time()).split('.')[0][-5:-1]

arcpy.CopyFeatures_management(InputFeature, tempfea)
arcpy.AddXY_management(tempfea)
if Order == '横向'.decode('UTF-8'):
sortfield = [["POINT_Y", Sort_Y],["POINT_X", Sort_X] ]
elif Order == '纵向'.decode('UTF-8'):
sortfield = [["POINT_X", Sort_X],["POINT_Y", Sort_Y]]
arcpy.Sort_management(tempfea,OutputFeature,sortfield)
arcpy.AddField_management(OutputFeature,'order1','DOUBLE')
arcpy.CalculateField_management(OutputFeature, 'order1','!OBJECTID!', "PYTHON_9.3")

添加完Python脚本文件后,继续往下
5、添加界面参数
这一步很重要,各个参数属性要逐个填入,分别如下
其中Order、Sort_X、Sort_Y属于list参数
InputFeature
Order
Sort_X
Sort_Y
OutputFeature

6、脚本工具创建向导完后,要对上述的三个参数设置list列表
6.1 点击脚本工具的属性
工具属性
6.2 切换至验证选项卡(Validation),点击Edit,编辑验证代码,添加如下3行代码

1
2
3
self.params[1].filter.list = ['横向','纵向']
self.params[2].filter.list = ["ASCENDING","DESCENDING"]
self.params[3].filter.list = ["ASCENDING","DESCENDING"]

编辑验证代码
至此,ArcGIS的点排序编号脚本工具基本完成,为了方便别人使用,可以添加描述等辅助信息
打开工具描述
编辑工具信息

体验一下该工具
工具界面
工具结果
查看结果编号
结果