使用 FME 将勘测定界坐标交换格式文本文件转换成 GIS 格式

平常我们向国土部上报(或获取)坐标数据时基本都是使用“勘测定界界址点坐标交换格式”,这个格式是一个纯文本格式,示例如下(来源于国土部网站):


 [属性描述]

格式版本号=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 选择的文件即为交换文件。

使用 FME 将勘测定界坐标交换格式文本文件转换成 GIS 格式_第1张图片


2. 无论是 Text、CSV 还是包含有图像对象的 GIS 文件,FME 处理时都是一个一个对象读取出来处理。在这里,Text 文件中的每一行就是一个 Feature。从文件格式定义中可以知道,当出现:

    9,0.018,2003-10,双桥乡地块1,面,I-50-77-(22),公共基础设施,,@

时就表示开始定义一个图形对象。一行一行的下去,再次出现行结尾是“@”符号时,上一个图形定义完毕,并开始下一个图形的定义。下面我们在 Workbench 中加入一个 StringSearcher 来处理带有“@”的行数据。

如上图所示,Regular Expression 输入 (.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),@正则表达式,让 FME 找出所有 @ 结尾的行。将 Reader 和 Searcher 连接起来,如下图:

使用 FME 将勘测定界坐标交换格式文本文件转换成 GIS 格式_第2张图片

MATCHED 对应“是 @ 结尾的行”,NOT_MATCHED 对应其他行,我们先处理 MATCHED。当发现 @ 结尾的话时,说明要开始生成图行了,所以我们先给这个步骤编个号。加入一个 Counter,如下图:

使用 FME 将勘测定界坐标交换格式文本文件转换成 GIS 格式_第3张图片       

后面处理紧接下去的行时,需要获取这个 Counter 值,所以再加入一个VariableSetter,用于保存当前的 Counter 值。Variable Name 设置了这个变量的名称,后面还需要引用这个名称。

这一行数据里面,还包含有这个图形的基本属性,文档中的说明如下:

    界址点数,地块面积,地块编号,地块名称,记录图形属性(点、线、面),图幅号,地块用途,地类编码,@

这样我们还要多使用几个 VariableSetter 来记录这些字段内容,并且将前面说到的 MATCHED 和 Counter 与这些变量连接起来。如下图:

使用 FME 将勘测定界坐标交换格式文本文件转换成 GIS 格式_第4张图片



4. 然后接着处理不带 @ 结尾的行数据,即带有坐标的行。前面说过,FME 是一行一行处理 Text 文件的。先读取到一个 MATCHED 行,Counter 计数一次,然后接着处理一个 NOT_MATCHED 行。再增加一个 StringSearcher,Regular Expression 输入^(.*?),(.*?),(.*?),(.*?)$ ,将一行拆分成四个部分。使用 VariableRetriever 接收上面定义的 Counter 变量,如下图:

使用 FME 将勘测定界坐标交换格式文本文件转换成 GIS 格式_第5张图片   使用 FME 将勘测定界坐标交换格式文本文件转换成 GIS 格式_第6张图片

为了能区分出地块圈号,再增加一个 StringConcatenator,将 Counter 和 圈号合并起来作为坐标点的标识符。如上右图所示。并且,把上步设置的所有属性变量都用 VariableRetriever 接收回来。

5. 最后生成图斑。增加一个 2DPointReplacer 和一个 PointConnector 将坐标“翻译”成线和面。

使用 FME 将勘测定界坐标交换格式文本文件转换成 GIS 格式_第7张图片   使用 FME 将勘测定界坐标交换格式文本文件转换成 GIS 格式_第8张图片

其中,X Value 和 Y Value 对应文本中的坐标,Connection Break Attributes 对应 Counter 和地块圈号的组合。

在增加 LineCloser 将没有首尾封闭的图形封闭,增加 AttributeRemover 删除多余的字段,增加 DonutBuilder 用于将内多边形挖空。如下图:


最后在 Visualizer 里面就可以看到生成的图形了,将他替换为 ESRI Shape Writer 就可以生成 Shape 数据,也可以替换成其他 Writer。

使用 FME 将勘测定界坐标交换格式文本文件转换成 GIS 格式_第9张图片



整个步骤如下:





完整的工作空间: 下载

你可能感兴趣的:(编程,正则表达式,csv,图形,dataset,attributes)