3上面的步骤完成后,点击 完成 按钮就会出现 Data Interoperability界面,对应FME的Workbench。 如图所示数据源,可能有很多层,这里的层,可以是按属性,可以按空间数据类型等数据流,数据流是箭头,手动连接从哪里到哪里,很直观目标层,细心观察,不难发现目标层颜色和数据源有差异。这里颜色,是区分各种类型的一种标志左侧上部,是数据源、目标的详细情况;工具、环境参数详情左侧中部,是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,填入一下表达式:
- ' ----------------------------------------
- ' @ Tsonghua 090924
- ' ----------------------------------------
- Dim Output As string
- Dim pPoint As IPoint
- Set pPoint = [Shape]
- Output = pPoint.X & "," & pPoint.Y
复制代码
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
复制代码
3.这样,只需要挑选出[Dup]字段值为1的删掉即可。
4.思考:这里可以不可以删除在一定精度下不完全重复但是靠的很近的点呢?
可以在把坐标写入字段的时候控制一下,用format 函数规定好xy坐标输出的小数位数