免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 3595|回复: 11
收起左侧

2020FME博客大赛——基于FMEServer实现shp、dwg等常用空间数据在webgis系统的展示

[复制链接]

324

主题

56万

铜板

1172

好友

管理员

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
349368

宣传勋章爱心勋章组织勋章官方团队冰雪节勋章

发表于 2020-12-17 14:17 | 显示全部楼层 |阅读模式

作者:刘军

单位:天津市渤海城市规划设计研究院


摘要:一般WebGIS系统上,用户只能被动查看系统数据,用户和系统的交互性较低。将用户自己的数据上传到WebGIS系统上,与其他业务数据叠加,进行查看和分析,极大的增强了系统与用户的交互。传统的实现方式是通过后端语言解析用户数据,但是面对多种数据格式和复杂的数据处理和转换流程,后端开发接口的难度很大。本项目基于FME系列产品,将一系列复杂的数据处理和转换流程通过FMEWorkbench写成模板发布到FMEServer,前端直接调用FMEServer自动生成的接口。这种方式极大地简化了工作流程,提高了开发效率。项目自上线后,此功能受到很好的的评价,直接提高系统用户使用率。

一、背景

在WebGIS系统下,用户上传自己的数据,展示在地图上,可以与系统业务数据叠加,这种需求其实很常见。但是大多数情况下,用户自己的数据格式不能直接被前端支持,那么就需要后端对数据进行解析并最终返回给前端可以直接使用的数据格式(如Geojson)。不同的数据格式,如果用后端语言解析,需要各类复杂的api。如果用户上传的数据还要进行坐标转换、数据处理等复杂操作,那么后端接口开发会耗时很长时间,耽误项目进度。

FMEServer是FME产品系列的一款基于Server服务的产品。FME Workbench生成的模板文件可以发布到FMEServer中,实现自动运行。FMEServer针对每个模板都会有对应的丰富接口可以调用。FME几乎支持所有的空间数据格式,并且拥有几百个空间数据处理和转换的模块,这些模块相互组合,几乎能完成支持任何格式的空间数据复杂的处理和转换。针对上述的项目需求,基于FMEServer可以很方便完成。

对于GIS数据,用户最常使用的是shp文件,对于CAD数据,用户最常使用的是dwg文件。针对以上两种数据格式,在FMEWorkbench上分别开发两个模块,上传到FMEserver,提供接口给前端调用。Shp文件的模板和CAD数据的模板处理流程类似,而且CAD数据结构不标准,类型复杂,所以下面就CAD数据处理的模板进行展开。

二、解决方案2.1模板编写2.1.1模板内容

由于特定原因,系统是基于GCJ-02(火星坐标系)的,但是支持天津90、国家2000,WGS84、GCJ-02四种不同坐标系的数据上传并展示。因此,模板的主要内容如下:

读取源数据,根据选择的坐标系进行坐标转换,目标是GCJ-02。

天津90:有坐标系参数,在FME中自定义了天津90坐标系,通过Reprojector模块转换成wgs84坐标系,利用网络公共算法,通过pythoncaller转换成GCJ-02。

国家2000:没有坐标系参数,利用公共点求国家2000与天津90之间的转换参数,通过Affiner进行转换,转换成天津90坐标系,后面与天津90坐标系的转换流程一致。

WGS84:利用网络公共算法,通过pythoncaller调用转换方法,转换成GCJ-02。

GCJ-02:不做处理。

                                                                    图 1 坐标转换流程

进行数据处理和坐标转换。数据结构相对比较复杂,数据处理的主要原则是:

对于填充数据,那么系统上以面的形式显示。(后文中的源数据面都默认代表填充hatch)

对于多段线数据,无论闭合与否,那么系统上以线的形式显示。

对于点数据,系统上以点的形式展示。

对于注记数据,系统上以点的形式附带信息显示。

2.1.2模板难点

1.wgs84转换成GCJ-02

基础工作做好,从国家2000到WGS84之间的转换并不复杂,但是从WGS84到GCJ-02的转换,则相对复杂。转换前需要通过Counter转换器,对要素生成唯一ID,用于转换后重新组装点、线、面。之后将要素打散,生成点。然后提取点的坐标,调用pythoncaller转换器上写的转换方法,生成新的坐标。然后根据之前生成的ID重新组装要素。

                                                                图 2 转换成GCJ-02流程


2.针对带洞填充的处理

由于坐标转换是针对点坐标的转换,因此,需要将线和面都打散成点,转换后重新再组装成点。对于普通的面、线和点,没有问题,但是对于带洞的面,则相对比较复杂。主要是如果带洞的面直接打散,再重新组装,则转换结果不会生成面,而是生成混乱的线,如下图所示。

                                                          图 3 带洞面转换结果示意

因此需要针对带洞的面,进行处理。这里的处理方案是,将带洞的面通过DountHoleExtractor转换器进行处理,一个面生成两个面,分别是外边框outer shell和洞hole。此时再经过打散、坐标转换和重新组装,就会生成两个面。最后再通过DountBuilder将两个面成功新生成一个带洞的面。

利用LineBuilder组装后生成的面(如下图所示),包含三种类型,第一种是源数据为闭合的多段线,下一步要转换成线要素。第二种是源数据为不带洞的填充(hatch),下一步不再进行几何处理。第三种为带洞的填充(这里一个填充应该为两个要素,外边框和洞) ,下一步要利用DuntBuilder生成带洞的面。如何区分这三种类型的面是关键。

                                                          图 4 LineBuilder转换器组装成面


区分多段线和填充

FME读取CAD文件后,源文件要素为填充,autocad_original_entity_type属性autocad_hatch,而源文件要素为普通的多段线,autocad_original_entity_type属性autocad_lwpolyline。通过这一步,可以区分多段线和填充。


区分普通填充和带洞填充

要素再进行DountHoleExtractor之后,所有没有洞的要素没有进行处理,输出的要素autocad_entity属性没有发生变化。而带洞的要素则进行拆分,生成的要素的autocad_entity属性丢失。通过这个特性,区分普通填充和带洞填充。



2.1.3模板整体流程

模板整体的流程如下:

                                                             图 5 模板处理流程

虽然流程相对简单,但是由于数据类型丰富,数据结构复杂,考虑的情况较多,所以模板一共用了23个转换器。整体模板如下图所示:

                                                                  图 6 模板示意

2.2模板发布

模板参数

模板完成后,将模板发布到FMEServer之前,要将所需要的参数暴漏出来。本模板一共需要六个参数,但是开发人员需要关注的只有两个:分别是用户上传的数据的坐标系,源文件目录,其它的均为默认就可以。

服务类型

FMEServer为模板发布提供了5中服务类型,其中前三种是经常会用到的,分别为:

Data Download Service :数据下载服务  模板运行后自动将生成的数据打包成压缩包提供下载

Job Summitter Service :任务运行服务  直接运行模板

Data Streaming Service : 数据流服务  运行后会以数据流的形式返回结果。

所以当需要下载数据时,选择Data Download;当想将结果以数据流的形式返回时(比如json、Geojson、KML)等,可以选择Data Streaming;当只是利用FMEServer运行模板,则选择Job Submitter。本项目是想直接获取转换结果(GeoJson数据),加载在前端,所以直接调用Data Streaming Service返回的结果就可以。因此服务类型选择Data Streaming Service。

2.3接口调用

上传到FMEServer后,打开FMEServer就可以看到对应目录下刚上传的模板。FMEServer为用户提供的接口类型主要包含两种,一种是REST Service,一种是Transformation Service。Rest Service是一种粒度比较细的Restful接口服务,每个API只完成单独的任务。Transformation Service包含上一节中叙述的Job Submitter、Data Download、Job Submitter三种模板服务。相当于是对restful接口的一种封装,简化了调用接口的复杂度。除此之外,为了更加简化用户的请求接口的复杂度,开发出了FMEServer.js库文件,将ajax请求封装在里面,用户不需要关心内部如何实现,只需要将固定请求参数填好,可以实现复杂的功能。

用户上传文件后,将要素显示在地图上,需要调用两个接口,第一个接口是文件上传,第二个接口是运行模板获得Geojson数据。本项目接口直接使用FMEServer封装好的接口库FMEServer.js文件。调用接口前,需要先进行token验证。如下所示:

      FMEServer.init({

        server:'用户FMEServer地址',

        token:"用户token"

      });

然后,分别调用FMEServer.dataUpload和FMEServer.runDataStreaming方法实现数据上传和运行模板。

三、作品成果

基于FMEServer提供的运行模板的接口,成为项目中一个功能模块,让用户可以上传自己的数据,实现与业务数据叠加分析。目前支持最常用的SHP和CAD数据两种数据格式,坐标系支持天津90、国家2000、WGS84和火星坐标系,如下图 6所示。原始数据和数据上传系统后的对比如图 7。

                                                                    图 7 功能示意图

                                                                    图 8 成果展示图


四、总结

此模板结合FMEServer应用于系统中,取得了良好的效果和反馈。但是仍然有不足之处:

效率问题。Wgs84转换成GCJ-02的过程,要素要拆分成点,转换之后,重新生成点、线、面。如果用户上传的文件过大,要素量过多,或者线或者面复杂度过高,那么将会有非常多的点,模板运行非常消耗时间,用户等待时间过长,甚至失败。

模板中只是将要素的颜色提取出来,对于线型、文字大小等其它样式,并没有提取出,都是系统默认的配置的,系统显示和原始数据会有偏差。

目前只支持用户上传,并不支持用户下载。

因此,模板还有很大可以优化的空间。

利用FMEServer开发后端接口,帮助开发者极大的简化了工作流程,提高了开发效率,找到了针对复杂数据的数据转换和空间分析的新方案。当然FMEServer功能远远不只这些,相信在大数据和云计算蓬勃发展的未来,FMEServer、FMECloud等Server产品会有更大的发挥空间。

本文转载来自CSDN作者:fmechina  版权归作者所有

评分

参与人数 1铜板 +1 收起 理由
redflyrock + 1 感谢分享!

查看全部评分

10

主题

2万

铜板

34

好友

黄金会员

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

积分
4394

精华勋章灌水勋章活跃勋章贡献勋章

发表于 2020-12-17 14:57 | 显示全部楼层
谢谢分享

评分

参与人数 1威望 +10 铜板 +20 收起 理由
远方~ + 10 + 20 感谢回复!

查看全部评分

回复

使用道具 举报

141

主题

982万

铜板

3万

好友

管理员

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
621916
发表于 2020-12-17 15:12 | 显示全部楼层
回复

使用道具 举报

0

主题

1595

铜板

2

好友

助理工程师

Rank: 5Rank: 5

积分
101
发表于 2020-12-18 08:16 | 显示全部楼层
不错 学习了~
回复 支持 反对

使用道具 举报

13

主题

1万

铜板

4

好友

至尊VIP

Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24

积分
869

冰雪节勋章

发表于 2020-12-22 22:11 手机频道 | 显示全部楼层
这个思路很亮眼
回复 支持 反对

使用道具 举报

43

主题

5万

铜板

19

好友

至尊VIP

Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24

积分
3492

精华勋章12周年纪念勋章

发表于 2021-1-11 22:03 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

3万

铜板

9

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
5551
发表于 2021-12-6 14:43 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

5140

铜板

1

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2100
发表于 2022-7-3 16:39 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

30

主题

2万

铜板

59

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
6290
QQ
发表于 2023-3-16 16:05 | 显示全部楼层
:zt:zt:zt:zt
回复 支持 反对

使用道具 举报

3

主题

2380

铜板

1

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
995
发表于 2023-3-20 08:41 | 显示全部楼层
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表