分享

在ArcGIS中如何删除重复的点要素

 昵称QAb6ICvc 2013-08-08

在ArcGIS中如何删除重复的点要素

作者:tj051181    文章来源:tj051181    
摘要:在ArcGIS中如何删除重复的点要素,第一种方法是借助ArcGIS自带的扩展,Spatial ETL Tool,该工具是FME的一个模块,通过介绍在ArcGIS环境下逐步地新建一个Spatial ETL Tool,熟悉FME这款软件的风格和主要思想。第二种方法是ArcGIS自身的工具方法,打一套组合拳,亦可以得到想要的结果。第三种方法是新近补上去的,主要思路和FME处理一样:先将点的坐标按 "x,y" 的格式写入一个字段,然后对这个字段进行重复项检查<两步都是使用field Calculate>
最近看到很多朋友碰到这个个问题,在这里我和大家分享一下我处理此种问题的思路,共同探讨

第一种方法是借助ArcGIS自带的扩展,Spatial ETL Tool,该工具是FME的一个模块,通过介绍在ArcGIS环境下逐步地新建一个Spatial ETL Tool,熟悉FME这款软件的风格和主要思想。

第二种方法是ArcGIS自身的工具方法,打一套组合拳,亦可以得到想要的结果。


第三种方法是新近补上去的,主要思路和FME处理一样:先将点的坐标按 "x,y" 的格式写入一个字段,然后对这个字段进行重复项检查<两步都是使用field Calculate>


=================================


ArcGIS Spatial ETL Tool

1.
打开Arctoolbox,选中Arctoolbox根目录,右击,选择new toolbox,自定义一个工具箱。因为在ArcGIS自带的工具箱中,是没法自己新建工具或者脚本的。
 
  

紧接着,选中自定义的工具箱,右击,依次 New\Spatial ETL Tool

注:
这里如果报错Error Unable to create a new tool .You do not have the necessary license to create a new tool. 

这不是什么许可不够,只是扩展没有选择而已。
解决办法:arcmap\Tools\Extension 勾选 Data Interoperability 如果Extension里面没有这项呢?得重新安装一下扩展,找到ArcGIS desktop 安装文件,开始安装\Modify\Application项叉掉;点开Extension,选择安装需要的常用的扩展

2.
在新建Spatial ETL Tool后,会出现设置向导,如果取消向导呢?直接弹出出错框。

这里个人感觉不是很合理,比如老手在新建的时候,就可以跳过这些繁琐的设置。

下面分别详细介绍一下这个设置向导的每一步。


2.1
2.1.1
设置向导第一个页面是设置 数据源格式。点击浏览按钮,在弹出窗口中的左下角输入数据源文件的扩展名<比如 shpdxfdwg等等>
  


2.1.2
选中后双击,或者选中,点下面的ok确定选择,点 Next,进入下一页

这一页是选择数据源,两个按钮,左侧一个是浏览文件,右侧 “+” 号那个是添加文件夹。
 
  

2.2
选好数据源格式,数据源之后,再next出现的是目标格式,选择方式同 2.1.1,略

2.3
数据源,目标都设好之后,再下来,向导页面有个 Setting按钮。在这里,我们可以设置环境参数
  


eg: Contains Z Value
拿这一项做例子。不知道大家有没有碰到过数据的shape字段出现 point zpolyline zpolygon z等字样,这时候,是不可以等同于 pointpolylinepolygon处理的,因为存储数据类型不一致。有时候,明明z值就没有,可数据类型还是 含有 z。通过实践,我发现这里的参数 Contains Z valuesNo,如此,转换结果的shape就是我们常见的pointpolylinepolygon
3
上面的步骤完成后,点击 完成 按钮就会出现 Data Interoperability界面,对应FMEWorkbench
 
  

如图所示
数据源,可能有很多层,这里的层,可以是按属性,可以按空间数据类型等
数据流,数据流是箭头,手动连接从哪里到哪里,很直观
目标层,细心观察,不难发现目标层颜色和数据源有差异。这里颜色,是区分各种类型的一种标志

左侧上部,是数据源、目标的详细情况;工具、环境参数详情
左侧中部,是FME转换函数区,可以通过关键词搜索。点击,会显示函数详细情况。本文章会附录 FME转换函数对照表
下部是Log日志。

注:参照各人环境,可能稍有出入。

更详细的FME使用,参见 lucy1114 版主 【学习笔记】 SpatialETLTool(FME)空间数据交换引擎-抛砖引玉

4.
以删除重复点为例,说明一下FME工作环境里的具体参数设置以及使用方法
  
 

数据源 左侧,中间有两个蓝色的框是转换函数,右侧有个浅色的框是目标层 

如果按照向导添加进来的数据过多或者不是自己想要的,很简单,全选,delete。然后把你的数据源拖拽添加进来即可。

删除重复点的思路是:
将点坐标作为字段生成,格式为
x,y

根据属性相同,删除重复记录

查找FME函数转换对照表,很容易找到这两个函数
生成点的坐标,作为属性字段 CoordinateConcatenator
根据重复属性删除点          DuplicateRemover

转换函数是典型的I/O形式,输入啥,做什么处理,输出啥,一目了然。很简洁清晰明了
 
  

具体,DuplicateRemover这个函数设置如上图所示。
还有一点要注意的,我现在也没想明白,目标层的字段是要自己新建的。新建好之后,通过箭头一个个把原始的属性挂到目标层。<寻求一种简单的方式>

最后,点击Run Translation,就可以跑起来啦。

 

 
可以保存新建的Spatial ETL Tools
 

对新建好的可以编辑


使用ArcGIS工具,组合解决删除重复点问题

思路:buffer \ merge \ explode \ feature to point \ spatial join

说明:
1.重复点,在某个精度下很相近而可以认为是同一个点的点

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

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

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

2.3 Explode 右击工具栏,选择Advanced Editing,调出高级编辑工具条。


点击一下Merge后的面层,选择Explode Multi-part Feature。这一步的作用是将上一步本不相邻不重合而被融合在一起的构成的复杂多边形的面给炸开,打散。

2.4Feature to point 
Arctoolbox\ data management tools\ features \Features to points 生成buffer后融合的面的质心点。这样生成的点层,就达到了消除重复点的目的。

2.5 Spatial Join
这一个,主要是把原始点层含的属性给带过来。可以点击图层,右键\ Join \Spatial Join
也可以 analysis tools\overlay \spatial Join

位置关系匹配方式,可以选择 closest。属性获取上,可以右键字段,选择属性,然后修改属性合并的规则,是First,还是last 或者join等等 不同方式。


第三种方式是完全通过field Calculate实现:

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

  1. ' ----------------------------------------
  2. ' @ Tsonghua  090924
  3. ' ----------------------------------------
  4. Dim Output As string
  5. Dim pPoint As IPoint
  6. Set pPoint = [Shape]
  7. Output = pPoint.X & "," & pPoint.Y
复制代码



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

  1. ' ----------------------------------------
  2. ' @ Tsonghua 090924
  3. ' ----------------------------------------

  4. Static d As Object 
  5. Static i As Long 
  6. Dim iDup As Integer 
  7. Dim sField 
  8. ' ----------------------------------------
  9. '这里填写需要检查的字段名
  10. sField = [coordinate] 
  11. ' ----------------------------------------
  12. If (i = 0) Then 
  13. Set d = CreateObject("Scripting.Dictionary") 
  14. End If 
  15. If (d.Exists(CStr(sField))) Then 
  16. iDup = 1 
  17. Else 
  18. d.Add CStr(sField), 1 
  19. iDup = 0 
  20. End If 
  21. i = i + 1
复制代码



3.这样,只需要挑选出[Dup]字段值为1的删掉即可。

4.思考:这里可以不可以删除在一定精度下不完全重复但是靠的很近的点呢?
可以在把坐标写入字段的时候控制一下,用format 函数规定好xy坐标输出的小数位数



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多