平常我们向国土部上报(或获取)坐标数据时基本都是使用“勘测定界界址点坐标交换格式”,这个格式是一个纯文本格式,示例如下(来源于国土部网站):
[属性描述]
格式版本号=1.01版本
数据产生单位=国土资源部
数据产生日期=2003-11-7
坐标系=54北京坐标系
几度分带=3
投影类型=高斯克吕格
计量单位=米
带号=31
精度=2
转换参数=0,0,0,0,0,0,0
[地块坐标]
9,0.018,2003-10,双桥乡地块1,面,I-50-77-(22),公共基础设施,,@
J01,1,3751508.5,39438683.65
J02,1,3751508.5,39438690.15
J03,1,3751502,39438690.15
J04,1,3751502,39438688.2
J05,1,3751494.5,39438688.2
J06,1,3751494.5,39438660.7
J07,1,3751499,39438660.7
J08,1,3751499,39438683.65
J01,1,3751508.5,39438683.65
5,0.0247,2003-12,双桥乡地块2,面,I-50-77-(14),公共基础设施,,@
J01,1,3755389.7,39437380.2
J02,1,3755389.7,39437410.7
J03,1,3755382.2,39437410.7
J04,1,3755382.2,39437380.2
J01,1,3755389.7,39437380.2
一般情况下,使用超图、ArcGIS、MapGIS 等 GIS 软件转换这个数据时,都会使用编程语言读取文件内容转换成 GIS 对象。FME 提供的 FME Workbench 可以不需要任何编程工作,就可以将上述格式转换成 GIS 支持的格式。下面将介绍如何使用 FME 将勘测定界坐标交换格式文本文件转换成 GIS 格式。
1. 打开 FME Workbench,加入 Text Reader。DataSet 选择的文件即为交换文件。
2. 无论是 Text、CSV 还是包含有图像对象的 GIS 文件,FME 处理时都是一个一个对象读取出来处理。在这里,Text 文件中的每一行就是一个 Feature。从文件格式定义中可以知道,当出现:
9,0.018,2003-10,双桥乡地块1,面,I-50-77-(22),公共基础设施,,@
时就表示开始定义一个图形对象。一行一行的下去,再次出现行结尾是“@”符号时,上一个图形定义完毕,并开始下一个图形的定义。下面我们在 Workbench 中加入一个 StringSearcher 来处理带有“@”的行数据。
如上图所示,Regular Expression 输入 (.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),@正则表达式,让 FME 找出所有 @ 结尾的行。将 Reader 和 Searcher 连接起来,如下图:
MATCHED 对应“是 @ 结尾的行”,NOT_MATCHED 对应其他行,我们先处理 MATCHED。当发现 @ 结尾的话时,说明要开始生成图行了,所以我们先给这个步骤编个号。加入一个 Counter,如下图:
后面处理紧接下去的行时,需要获取这个 Counter 值,所以再加入一个VariableSetter,用于保存当前的 Counter 值。Variable Name 设置了这个变量的名称,后面还需要引用这个名称。
这一行数据里面,还包含有这个图形的基本属性,文档中的说明如下:
界址点数,地块面积,地块编号,地块名称,记录图形属性(点、线、面),图幅号,地块用途,地类编码,@
这样我们还要多使用几个 VariableSetter 来记录这些字段内容,并且将前面说到的 MATCHED 和 Counter 与这些变量连接起来。如下图:
4. 然后接着处理不带 @ 结尾的行数据,即带有坐标的行。前面说过,FME 是一行一行处理 Text 文件的。先读取到一个 MATCHED 行,Counter 计数一次,然后接着处理一个 NOT_MATCHED 行。再增加一个 StringSearcher,Regular Expression 输入^(.*?),(.*?),(.*?),(.*?)$ ,将一行拆分成四个部分。使用 VariableRetriever 接收上面定义的 Counter 变量,如下图:
为了能区分出地块圈号,再增加一个 StringConcatenator,将 Counter 和 圈号合并起来作为坐标点的标识符。如上右图所示。并且,把上步设置的所有属性变量都用 VariableRetriever 接收回来。
5. 最后生成图斑。增加一个 2DPointReplacer 和一个 PointConnector 将坐标“翻译”成线和面。
其中,X Value 和 Y Value 对应文本中的坐标,Connection Break Attributes 对应 Counter 和地块圈号的组合。
在增加 LineCloser 将没有首尾封闭的图形封闭,增加 AttributeRemover 删除多余的字段,增加 DonutBuilder 用于将内多边形挖空。如下图:
最后在 Visualizer 里面就可以看到生成的图形了,将他替换为 ESRI Shape Writer 就可以生成 Shape 数据,也可以替换成其他 Writer。
整个步骤如下: