ArcGIS教程:删除重复的要素之---点
大家在用数据的时候,经常会碰到有重复的点。此文做了一个归总,提供给需要的人员。
1 使用ArcGIS工具,组合解决删除重复点
思路:buffer \ merge \ explodemulti-part feature \ feature to point \ spatial join
说明:
重复点,在某个精度下很相近而可以认为是同一个点的点。
这里所谓的删除重复点,其实是通过点做缓冲,构成面;然后把构成的面合并起来,这样,重复点<< span="">或者近距离点>所形成的面的边界就会消融而形成一个面;然后打散,把不相邻的面分散成独立的要素;最后,生成这些面的质心点,即为所求。
1.1 Buffer对点层做缓冲,生成面
这里有个重要的参数,就是缓冲距离,怎么定呢?可以参考数据精度;还可以用 Analysis tools\ proximity\ point distince算一下各点距离,找到认为不重复的点之间的最近距离,设置的缓冲距离应该比这个距离的一半要小。
1.2 Merge
这里说的Merge是编辑下的合并功能。Editor \Starting editing \全选buffer后的面层,选择Merge,合并到一个空图班上。这一步的作用是将相邻过近,以至于重复的点形成的面的边界消掉,融合一起。
1.3 ExplodeMulti-part Feature
在Editor下拉菜单选择AdvancedEditing,调出高级编辑工具条。
点击一下Merge后的面层,选择ExplodeMulti-part Feature。这一步的作用是将上一步生成的不相邻不重合而被融合在一起的多部件面给炸开,打散。
1.4 Featureto point
Arctoolbox\ data management tools\features \Features to points,生成打散后面的质心点。这样生成的点层,就达到了消除重复点的目的。
1.5 SpatialJoin
这一步,主要是把原始点层含的属性给带过来。可以点击图层,右键\Join and Relates \Join\Joindata from another layer based on spatial location,也可以从工具箱里analysistools\overlay \spatial Join,位置关系匹配方式,可以选择closest。
2 完全通过field Calculate实现
思路:先将点的坐标按 "x,y" 的格式写入一个字段,然后对这个字段进行重复项检查。两步都是使用field Calculate,输入VBA的计算字符即可。
2.1 计算"x,y"的格式的坐标串
新建字段[coordinate] ,类型设置为text,长度默认50,右击该字段,选择field Calculate,点advanced,填入一下表达式:
Dim Output As string
Dim pPoint As IPoint
Set pPoint = [Shape]
Output = pPoint.X& "," & pPoint.Y
2.2 找到重复的字符串
新建字段[Dup],类型设置为long integer,右键选field Calculate,在advanced的表达式框中填入:
Static d As Object
Static i As Long
Dim iDup As Integer
Dim sField
'----------------------------------------
'这里填写需要检查的字段名
sField = [coordinate]
'----------------------------------------
If (i = 0) Then
Set d =CreateObject("Scripting.Dictionary")
End If
If(d.Exists(CStr(sField))) Then
iDup = 1
Else
d.Add CStr(sField), 1
iDup = 0
End If
i = i + 1
以下是原作者对上段代码的解释:
这段代码的思路,就是在第一行的时候,新建了一个"Scripting.Dictionary" 这算是一个容器(存放二维数组)。当VBA脚本在每一行执行的时候,都会把该条记录的[sField]字段值放到容器里比较一下。如果容器里没有,那么就添加进去,与此同时,把标识符 iDup赋值为 0;如果该条记录的[sField]字段值容器里已经存在了,那么,标识符iDup赋值为1。依次循环,一直到记录结束。
从思路里不难看出,不重复的,标记为0;重复值的第一条记录,会被标记为 0,剩下重复的都被标记为1.比如,该字段里有 4个A,A,A,A,第一个A,放到容器里一查,没有,那么把A放到容器里,该条记录标记为0,剩下的3个A,放到容器里查的时候,会发现已经存在了,会被标记为1。从而达到查找和标记重复记录的目的。
if(d.Exists(Str(sField)) Then
iDup=1
这句话,就是说如果字段 [sField]的值在容器里已经存在了。
Else
d.Add Cstr(sField),1
iDup=0
这里,说的是不存在,就添加进去。
"Scripting.Dictionary" 这个容器存放的是二维数组,所以 d.add 后面跟着的2个参数。第一个参数是键,第二个参数是值。因为[sField] 已经不同了,所以后面那个值,可以是 1,也可以写2 或者其他。
在字段计算器里,[字段名]是取了该行的字段值。
2.3 挑选出[Dup]字段值为1的删掉即可
2.4 思考
这里可不可以删除在一定精度下不完全重复但是靠的很近的点呢?
可以在把坐标写入字段的时候控制一下,用format 函数规定好xy坐标输出的小数位数。
3 selectby attributes属性查询
思路:如果数据是Geodatabase(mdb或gdb)格式,可考虑用SQL语句查询点x、y值相同的记录,并进行删除。
3.1 计算点x、y坐标值
Data Management Tools\Features\Add XYCoordinates工具,为点数据计算x、y坐标值,结果会在属性表中生成POINT_X和POINT_Y两个字段。
3.2 SQL语句查询坐标值相同的点
在select by attributes窗口里输入:[OBJECTID]not in (select max(OBJECTID) from 图层名 group by point_x,point_y)。
选中的要素删掉即可。
4 DeleteIdentical工具
此工具是ArcGIS10新推出的工具,可以删除重复的要素。Filed里勾上通过AddXY Coordinates工具计算的x、y坐标值,通过比较重复坐标值的要素,将其删除。用之前,可用Find Identical工具查找有无重复的点。
Delete Identical工具也可以选择用shape字段进行比较,并可以设置XY Tolerance来查找非常近的点。但是执行效果不佳,不知ArcGIS10.1有无改进。
5 Dissolve工具
可以把多个要素,通过指定的属性(属性值相同),溶解成一个要素。但dissolve会丢失没有指定的不同的属性。因此,该工具适合几何和属性完全重合的点数据。
这里,我们可以用Add XY Coordinates工具计算的x、y坐标值,然后用dissolve工具根据x、y两个字段进行溶解。