基于开源技术的地图应用设计与实现
——以天地图·合肥医疗卫生为例
2022-09-02胡正星
胡正星
(合肥市测绘设计研究院,安徽 合肥 230061)
1 引 言
按照安徽省地理信息公共服务平台(天地图)市级节点2020年综合技术评估要求,升级平台的统一门户建设服务能力,天地图·合肥需要新增医疗卫生作为示范应用。本文探讨基于开源GIS技术栈构建地理信息服务应用平台,该方式兼备灵活、开放的优点。
本文详细阐述如何使用GeoServer、OpenLayers、QGIS、PostgreSQL等开源GIS软件快速构建地理信息服务,实现天地图·合肥医疗卫生示范应用。
2 开源GIS框架
2.1 GeoServer
GeoServer是OpenGIS Web服务器规范的J2EE实现,利用GeoServer可以方便地发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过GeoServer可以比较容易地在用户之间迅速共享空间地理信息。GeoServer是社区开源项目,可以直接通过社区网站下载相关资料。
GeoServer支持OGC标准规范的系列服务,支持PostgreSQL、MySQL等数据库以及ArcSDE、Shapefile等中间件和文件资源,能够将网络地图输出为JPEG、PNG、KML等多种图片和数据格式,可以运行在任何基于J2EE/Servlet的容器之上,支持多种客户端框架。
2.2 OpenLayers
OpenLayers是一个专为WebGIS客户端开发提供的前端类库,用于访问以标准格式发布的地图数据,实现访问空间数据的方法都符合行业标准。
OpenLayers是一个开源项目,其目的是为互联网客户端提供强大的地图展示功能,包括地图数据显示与相关操作,并具有灵活的扩展机制。目前OpenLayers封装了部分公共地图数据,如OpenSteetMap、Bing地图的数据源等。
2.3 QGIS
QGIS是一个跨平台的桌面端开源GIS软件,支持数据的可视化、管理、编辑、分析等功能。通过QGIS进行图层的样式配置,将图层效果导出为符合OGC标准的SLD样式文件,在Geoserver中导入SLD文件,完成地理空间数据发布后的地图渲染效果。QIS也支持向PostgreSQL中导入SHP数据。
2.4 PostgreSQL和PostGIS
PostgreSQL是一个强大的、开源的对象-关系数据库系统。PostGIS则是PostgreSQL的一个扩展插件,目的是使PostgreSQL支持空间数据的存储和使用。PostGIS提供了上百个空间运算的SQL方法,可用于空间数据的关系运算、处理、编辑等功能。
3 系统设计
3.1 设计思路与目标
天地图·合肥医疗卫生应用系统建设目标包括以下几方面:①是围绕医疗卫生信息可浏览、可定位、可查询的基本工作目标,借助开源GIS,应用“天地图”地理信息服务和功能,构建覆盖全市范围医疗卫生信息管理新模式;②是梳理和处理全市各区域的医院、社区诊所、急诊点、药店、医疗器械点等数据,构建统一的医疗卫生信息资源数据库。
3.2 系统体系架构
天地图·合肥医疗卫生应用的整体架构如图1所示。应用以公共地图数据服务、医疗卫生相关数据为基础,客户端使用OpenLayers框架,后台使用.NET框架,从而构建一个涵盖地图显示与操作、医疗卫生查询展示等功能的WebGIS系统。
图1 医疗卫生应用的整体架构
3.3 系统功能设计
根据设计需求,医疗卫生应用采用B/S架构,以Visual Studio平台作为开发工具,采用.NET Core和JavaScript进行编程,利用OpenLayers进行Web开发。应用的功能主要包括:地图管理、医疗卫生信息浏览与查询等,如图2所示。
图2 系统功能设计示意图
4 多源异构数据集成
天地图·合肥医疗卫生应用涉及五类数据,分别是:综合医院、社区诊所、急诊点、药店和医疗器械。其中综合医院为面状数据,其他均为点状数据。
4.1 空间数据库整合
空间数据库因其具备空间位置、拓扑关系等空间特性,其存储方式一般采用文件型方式,但随着关系型数据库的不断流行,且主流关系型数据库均支持存储空间数据,开源数据库PostgreSQL及其空间扩展PostGIS能够提供对空间数据的完美支持。本文利QGIS客户端,连接PostgreSQL数据库,进行数据的空间检查、整理与导入,如图3所示。
图3 PostgreSQL数据库
4.2 数据发布
GeoServer采用登录GeoServer,新建工作区和数据存储,发布图层。服务发布成功后,可以在GeoServer中预览图层,如图4所示。
图4 GeoServer预览服务
5 应用搭建
医疗卫生应用主要功能包括地图数据的显示操作、医疗卫生数据的查询定位,地名地址周边医疗卫生点查询等。本应用使用JavaScript的客户端方式,结合开源框架.NET Core开发模式实现。
5.1 加载天地图数据
天地图提供免费开放的基础地图服务,为瓦片地图形式,在应用中作为底图直接调用。本应用加载天地图的在线地图作为底图,默认显示天地图的矢量底图,通过底图列表实现切换天地图数据类型的功能,如图5所示。
图5 地图加载
5.2 基础功能
(1)缩放功能
底图缩放都是由OpenLayers的View类中的setZoom方法实现,缩放的级数由setZoom方法的参数设置。首先通过view.getZoom()获得当前地图的级数,然后调用setZoom方法进行缩放,通过view.setZoom(zoom-1)可将地图缩小一级,通过view.setZoom(zoom+1)可将地图放大一级。
(2)测量功能
测量功能包括距离测量与面积测量。距离测量是指计算鼠标绘制的线条实际长度,面积测量则是指计算鼠标绘制范围的实际面积大小。OpenLayers的测量功能没有提供封装好的测量控件,但提供了相应接口,需要基于几何对象的相应接口并结合图形绘制功能来实现,如图6所示。
图6 量测
(3)搜索功能
搜索功能调用天地图的地名搜索服务。天地图的地名搜索服务API是一类简单的HTTP/HTTPS接口,包括普通搜索、视野内搜索、周边搜索、拉框搜索、普通建议词搜索等。使用搜索服务前需要申请自己的Key。
图7 地名搜索
5.3 聚合功能
聚合标准是指在不同地图分辨率下,通过聚合方式展现标注点信息的一种方式,其目的是为了减少当前视窗下地图添加标注点的数量,提升客户端渲染速度。如果在地图上添加很多标注点,当地图缩放到小级别时则会出现标注点重叠的现象,既不美观,多点渲染的效率也会受到影响。此时,可以根据地图缩放级数的大小,将当前视窗的标注点聚合显示。
OpenLayers提供了相应的聚合标注功能,以此方式来提升速度,增强用户体验。OpenLayers封装了聚合数据源(ol.source.Cluster),可通过此数据源实现矢量要素的聚合功能,如图8、图9所示。
图8 药店聚合分布
图9 社区诊所聚合分布
5.4 医疗卫生服务查询
医疗卫生服务查询调用GeoServer的WFS服务,将结果展示在地图上,点击结果行,弹出相应Popup标注,如图10、图11所示。
图10 医疗卫生查询面板
图11 医院查询结果
5.5 周边搜索功能
在用户搜索地名地址时,能查找到该地名地址周边一定距离的医疗卫生点,如图12所示。该功能用Post GIS计算空间距离。对应的SQL语句为:
图12 周边搜索
select st_astext(geom) as geometry,* from table where ST_DWithin(st_astext(geom),('POINT(X,Y)'),radius/ (2 *PI * 6371004) * 360)=true ;