技术专栏

gis培训

删除重复的要素之---面

作者:胡婷婷 邮箱:hutt@lreis.ac.cn  发布时间:2014-01-02 21:37:31 阅读(7324)

删除重复的要素之---

1使用ArcGIS工具,组合解决删除重复面

思路:面生成线——线转面——获取面属性

1 Feature to line,将面生成线

Data Management Tools\Features\Featureto line

2featureto polygon将线再转成面new_polygon

3Spatialjoin空间连接属性

若要保持原面的属性,用feature to point将原面要素类转成点,然后用spatial joinnew_polygon进行空间连接,或者在上一步线转面时,Label Features选项勾上原面生成的点。

 

 

2工具Delete Identical

  1. 2.1    计算面质心坐标

添加两个字段分别记录质心的xy坐标值,用CalculateGeometry计算X Coordinate of CentroidYCoordinate of Centroid

  1. 2.2    Delete Identical删除重复的面

工具界面里勾上2.1中计算的质心xy坐标字段,此工具会比较属性值相同的要素,并进行删除。

(注:Delete Identical工具可比较shape字段,即要素的位置,但执行起来效果不佳)

 

 

3 Dissolve工具

可以把多个要素,通过指定的属性(属性值相同),溶解成一个要素。

2.1,用CalculateGeometry计算面的质心坐标xcenterycenter

Dissolve工具,按字段xcenterycenter进行溶解。重复的面要素会被溶解掉。

dissolve会丢失没有指定的不同的属性,例如没有勾选的parcelID。因此,该工具适合几何和属性完全重合的面数据。

 

4创建拓扑

对该面要素创建拓扑,使用拓扑规则Must not overlap

 

红色的部分,即发生的面的重合。借助拓扑内置的解决方案,可以解决该类问题。在错误监视器里,选中单条错误,右键Merge,让重合的两个面融合,可选择融合到哪一个面中去。

说明: C:\Users\Administrator.E3UBRFON1SCOEOO\Desktop\QQ截图20130118164933.jpg

但是该方法较花费时间,如果有太多的面重合,不推荐。

 

 

 

 

 


思路:buffer \ merge \ explodemulti-part feature \ feature to point \ spatial join

说明:

重复点,在某个精度下很相近而可以认为是同一个点的点。

这里所谓的删除重复点,其实是通过点做缓冲,构成面;然后把构成的面合并起来,这样,重复点<< span="">或者近距离点>所形成的面的边界就会消融而形成一个面;然后打散,把不相邻的面分散成独立的要素;最后,生成这些面的质心点,即为所求。

  1. 1.1         Buffer对点层做缓冲,生成面

这里有个重要的参数,就是缓冲距离,怎么定呢?可以参考数据精度;还可以用 Analysis tools\ proximity\ point distince算一下各点距离,找到认为不重复的点之间的最近距离,设置的缓冲距离应该比这个距离的一半要小。

  1. 1.2         Merge

这里说的Merge是编辑下的合并功能。Editor \Starting editing \全选buffer后的面层,选择Merge,合并到一个空图班上。这一步的作用是将相邻过近,以至于重复的点形成的面的边界消掉,融合一起。

  1. 1.3         ExplodeMulti-part Feature

Editor下拉菜单选择AdvancedEditing,调出高级编辑工具条。

点击一下Merge后的面层,选择ExplodeMulti-part Feature。这一步的作用是将上一步生成的不相邻不重合而被融合在一起的多部件面给炸开,打散。

  1. 1.4         Featureto point

Arctoolbox\ data management tools\features \Features to points生成打散后面的质心点。这样生成的点层,就达到了消除重复点的目的。

  1. 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的计算字符即可。

  1. 2.1         计算"x,y"的格式的坐标串

新建字段[coordinate] ,类型设置为text,长度默认50,右击该字段,选择field Calculate,点advanced,填入一下表达式:

'----------------------------------------

' @Tsonghua  090924

'----------------------------------------

Dim Output As string

Dim pPoint As IPoint

Set pPoint = [Shape]

Output = pPoint.X& "," & pPoint.Y

  1. 2.2         找到重复的字符串

新建字段[Dup],类型设置为long integer,右键选field Calculate,在advanced的表达式框中填入:

'----------------------------------------

' @ Tsonghua 090924

' ----------------------------------------

 

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.比如,该字段里有 4A,A,A,A,第一个A,放到容器里一查,没有,那么把A放到容器里,该条记录标记为0,剩下的3A,放到容器里查的时候,会发现已经存在了,会被标记为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 或者其他。

在字段计算器里,[字段名]是取了该行的字段值。

  1. 2.3         挑选出[Dup]字段值为1的删掉即可

  2. 2.4         思考

这里可不可以删除在一定精度下不完全重复但是靠的很近的点呢?

可以在把坐标写入字段的时候控制一下,用format 函数规定好xy坐标输出的小数位数。

 

 

3 selectby attributes属性查询

思路:如果数据是Geodatabasemdbgdb)格式,可考虑用SQL语句查询点xy值相同的记录,并进行删除。

  1. 3.1         计算点xy坐标值

Data Management Tools\Features\Add XYCoordinates工具,为点数据计算xy坐标值,结果会在属性表中生成POINT_XPOINT_Y两个字段。

  1. 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工具计算的xy坐标值,通过比较重复坐标值的要素,将其删除。用之前,可用Find Identical工具查找有无重复的点。

说明: C:\Users\Administrator.E3UBRFON1SCOEOO\AppData\Roaming\Tencent\Users\327085302\QQ\WinTemp\RichOle\CAYDB$6A_F4T})}K%%8[FRU.jpg

Delete Identical工具也可以选择用shape字段进行比较,并可以设置XY Tolerance来查找非常近的点。但是执行效果不佳,不知ArcGIS10.1有无改进。

 

5 Dissolve工具

可以把多个要素,通过指定的属性(属性值相同),溶解成一个要素。但dissolve会丢失没有指定的不同的属性。因此,该工具适合几何和属性完全重合的点数据。

这里,我们可以用Add XY Coordinates工具计算的xy坐标值,然后用dissolve工具根据xy两个字段进行溶解。


作者:胡婷婷 邮箱:hutt@lreis.ac.cn

HiGIS技术交流QQ群:336076300

关键词:ArcGIS、重复面、删除

中科地理信息系统培训中心-原创文章
转载请注明出处:www.higis.cn/Tech/tech/tId/11/

创新地理知识,共享地理价值

http://www.higis.cn

中科地理信息系统培训中心

关于我们

gis培训

苏州高新区中科地理信息系统培训中心是“国家专业技术人员继续教育基地”指定培训点,是3S方向唯一指定的培训点。同时也是国内唯一获得Esri授权的ArcGIS专业培训与认证机构,为广大用户提供ArcGIS培训、开发和咨询服务,中心已经为中国用户服务20年...详细情况...

联系方式

Email:actc@lreis.ac.cn
苏州总部电话: 0512-68076858
        0512-68075672
北京分部电话: 010-64855687
苏州总部地址:苏州市高新区科灵路78号苏高新软件园5号楼3层
北京分部地址:北京市朝阳区大屯路甲11号中科院地理所2406

顶部 返回
地理信息系统国际培训中心