一、背景:某项建库工作中某图层中的一字段存在下面所述需求。
二、需求:将某数据按行政村为单位按照从上到下、从左到右的顺序编号。
三、解决办法:
(一)建库软件肯定可以实现这个功能,花钱买个软件,搞定。
(二)利用ArcMAP+基础python编程解决,其中ArcMAP用来解决排序问题,用python来解决编程问题。下面开始操作:
1.打开ArcToolbox找到—常规—排序工具,打开工具进行如图选择设置:
这个工具的本质是一个Sort_management (in_dataset, out_dataset, sort_field, {spatial_sort_method})语法的运用,在这里in_dataset和out_dataset代表输入和输出数据名称, sort_field代表排序字段及排序方式(ASCENDING 低到高排序、DESCENDING 高到低顺序),{spatial_sort_method}代表了指定对要素进行空间排序的方法(需要强调的是仅当将“Shape”作为排序字段之一时,排序方法才可用)。在工具使用时需要强调的是设置排序字段时候要***先选择ZLDM在选择Shape,***这样选择以后会先搜索行政区代码,在同一行政区代码内进行空间位置的排序。空间排序的方法有以下五中:
(1)UR —从右上角开始排序。这是默认设置。
(2)UL —从左上角开始排序。
(3)LR —从右下角开始排序。
(4)LL —从左下角开始排序。
(5)PEANO —使用空间填充曲线算法(也称为皮亚诺曲线)排序。 (想知道这是啥自行百度,一般用不上)
在这里需要说明的是该工具在进行空间排序时:从上到下 的优先级高于从右到左 的优先级。
2.第一步完成以后,此时对应图层的FID已经按照同一行政代码下“从上到下、从左到右”进行了排列,下面我们要做的就是利用python进行排序,排序的思路就是设置初始编号,然后以不同ZLDM为基础进行依次加1的循环,来实现不同行政村的编号,最后的结果前面补充“00000”,此时导出的结果分别为“000001、000002、000003……”,代码如下:
打开属性表,找到需要编号的那一列打开字段计算器,解译程序选择python然后点击显示代码块,在预逻辑代码脚本中输入以下代码:
rec=0fname = ""def autoIncrement(field):global recglobal fnameif field != fname:fname = fieldpStart = 1 rec = pStart return recelse:pInterval = 1 rec = rec + pInterval return rec
在结果框内出入以下代码(上张截图内地段名称应为DM不是MC),下列代码实现了输出结果加0及字符型的转换:
(str(autoIncrement( !ZLDWMC! ))).zfill(6)
运行结果如下:
到这里就实现了将该数据按行政村为单位按照从上到下、从左到右的顺序编号的需求了。剩下的根据工作要求继续进行即可。
四、缺点
(一)这种思路完全ArcMAP软件中排序工具,来进行排序工作,其软件上下的优先级优于左右,若需求优先级左右大于上下,则无法依靠软件实现。想到的解决办法:获取各要素的X坐标、Y坐标的最大值和最小值,然后进行排序。
(二)这种思路的编号方式,是以FID为基础进行的,当排列后个行政村对应要素的FID字段不连续,则程序运行结果错误。想到的解决办法:导出到Excel中,用表格函数实现编号再关联回来。
(三)为啥(二)的解决办法不用代码实现,因为我不会,望大佬指点。
(四)用VB肯定也可以实现,没有进行比较。