胡正星
(合肥市測(cè)繪設(shè)計(jì)研究院,安徽 合肥 230061)
按照安徽省地理信息公共服務(wù)平臺(tái)(天地圖)市級(jí)節(jié)點(diǎn)2020年綜合技術(shù)評(píng)估要求,升級(jí)平臺(tái)的統(tǒng)一門戶建設(shè)服務(wù)能力,天地圖·合肥需要新增醫(yī)療衛(wèi)生作為示范應(yīng)用。本文探討基于開(kāi)源GIS技術(shù)棧構(gòu)建地理信息服務(wù)應(yīng)用平臺(tái),該方式兼?zhèn)潇`活、開(kāi)放的優(yōu)點(diǎn)。
本文詳細(xì)闡述如何使用GeoServer、OpenLayers、QGIS、PostgreSQL等開(kāi)源GIS軟件快速構(gòu)建地理信息服務(wù),實(shí)現(xiàn)天地圖·合肥醫(yī)療衛(wèi)生示范應(yīng)用。
GeoServer是OpenGIS Web服務(wù)器規(guī)范的J2EE實(shí)現(xiàn),利用GeoServer可以方便地發(fā)布地圖數(shù)據(jù),允許用戶對(duì)特征數(shù)據(jù)進(jìn)行更新、刪除、插入操作,通過(guò)GeoServer可以比較容易地在用戶之間迅速共享空間地理信息。GeoServer是社區(qū)開(kāi)源項(xiàng)目,可以直接通過(guò)社區(qū)網(wǎng)站下載相關(guān)資料。
GeoServer支持OGC標(biāo)準(zhǔn)規(guī)范的系列服務(wù),支持PostgreSQL、MySQL等數(shù)據(jù)庫(kù)以及ArcSDE、Shapefile等中間件和文件資源,能夠?qū)⒕W(wǎng)絡(luò)地圖輸出為JPEG、PNG、KML等多種圖片和數(shù)據(jù)格式,可以運(yùn)行在任何基于J2EE/Servlet的容器之上,支持多種客戶端框架。
OpenLayers是一個(gè)專為WebGIS客戶端開(kāi)發(fā)提供的前端類庫(kù),用于訪問(wèn)以標(biāo)準(zhǔn)格式發(fā)布的地圖數(shù)據(jù),實(shí)現(xiàn)訪問(wèn)空間數(shù)據(jù)的方法都符合行業(yè)標(biāo)準(zhǔn)。
OpenLayers是一個(gè)開(kāi)源項(xiàng)目,其目的是為互聯(lián)網(wǎng)客戶端提供強(qiáng)大的地圖展示功能,包括地圖數(shù)據(jù)顯示與相關(guān)操作,并具有靈活的擴(kuò)展機(jī)制。目前OpenLayers封裝了部分公共地圖數(shù)據(jù),如OpenSteetMap、Bing地圖的數(shù)據(jù)源等。
QGIS是一個(gè)跨平臺(tái)的桌面端開(kāi)源GIS軟件,支持?jǐn)?shù)據(jù)的可視化、管理、編輯、分析等功能。通過(guò)QGIS進(jìn)行圖層的樣式配置,將圖層效果導(dǎo)出為符合OGC標(biāo)準(zhǔn)的SLD樣式文件,在Geoserver中導(dǎo)入SLD文件,完成地理空間數(shù)據(jù)發(fā)布后的地圖渲染效果。QIS也支持向PostgreSQL中導(dǎo)入SHP數(shù)據(jù)。
PostgreSQL是一個(gè)強(qiáng)大的、開(kāi)源的對(duì)象-關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。PostGIS則是PostgreSQL的一個(gè)擴(kuò)展插件,目的是使PostgreSQL支持空間數(shù)據(jù)的存儲(chǔ)和使用。PostGIS提供了上百個(gè)空間運(yùn)算的SQL方法,可用于空間數(shù)據(jù)的關(guān)系運(yùn)算、處理、編輯等功能。
天地圖·合肥醫(yī)療衛(wèi)生應(yīng)用系統(tǒng)建設(shè)目標(biāo)包括以下幾方面:①是圍繞醫(yī)療衛(wèi)生信息可瀏覽、可定位、可查詢的基本工作目標(biāo),借助開(kāi)源GIS,應(yīng)用“天地圖”地理信息服務(wù)和功能,構(gòu)建覆蓋全市范圍醫(yī)療衛(wèi)生信息管理新模式;②是梳理和處理全市各區(qū)域的醫(yī)院、社區(qū)診所、急診點(diǎn)、藥店、醫(yī)療器械點(diǎn)等數(shù)據(jù),構(gòu)建統(tǒng)一的醫(yī)療衛(wèi)生信息資源數(shù)據(jù)庫(kù)。
天地圖·合肥醫(yī)療衛(wèi)生應(yīng)用的整體架構(gòu)如圖1所示。應(yīng)用以公共地圖數(shù)據(jù)服務(wù)、醫(yī)療衛(wèi)生相關(guān)數(shù)據(jù)為基礎(chǔ),客戶端使用OpenLayers框架,后臺(tái)使用.NET框架,從而構(gòu)建一個(gè)涵蓋地圖顯示與操作、醫(yī)療衛(wèi)生查詢展示等功能的WebGIS系統(tǒng)。

圖1 醫(yī)療衛(wèi)生應(yīng)用的整體架構(gòu)
根據(jù)設(shè)計(jì)需求,醫(yī)療衛(wèi)生應(yīng)用采用B/S架構(gòu),以Visual Studio平臺(tái)作為開(kāi)發(fā)工具,采用.NET Core和JavaScript進(jìn)行編程,利用OpenLayers進(jìn)行Web開(kāi)發(fā)。應(yīng)用的功能主要包括:地圖管理、醫(yī)療衛(wèi)生信息瀏覽與查詢等,如圖2所示。

圖2 系統(tǒng)功能設(shè)計(jì)示意圖
天地圖·合肥醫(yī)療衛(wèi)生應(yīng)用涉及五類數(shù)據(jù),分別是:綜合醫(yī)院、社區(qū)診所、急診點(diǎn)、藥店和醫(yī)療器械。其中綜合醫(yī)院為面狀數(shù)據(jù),其他均為點(diǎn)狀數(shù)據(jù)。
空間數(shù)據(jù)庫(kù)因其具備空間位置、拓?fù)潢P(guān)系等空間特性,其存儲(chǔ)方式一般采用文件型方式,但隨著關(guān)系型數(shù)據(jù)庫(kù)的不斷流行,且主流關(guān)系型數(shù)據(jù)庫(kù)均支持存儲(chǔ)空間數(shù)據(jù),開(kāi)源數(shù)據(jù)庫(kù)PostgreSQL及其空間擴(kuò)展PostGIS能夠提供對(duì)空間數(shù)據(jù)的完美支持。本文利QGIS客戶端,連接PostgreSQL數(shù)據(jù)庫(kù),進(jìn)行數(shù)據(jù)的空間檢查、整理與導(dǎo)入,如圖3所示。

圖3 PostgreSQL數(shù)據(jù)庫(kù)
GeoServer采用登錄GeoServer,新建工作區(qū)和數(shù)據(jù)存儲(chǔ),發(fā)布圖層。服務(wù)發(fā)布成功后,可以在GeoServer中預(yù)覽圖層,如圖4所示。

圖4 GeoServer預(yù)覽服務(wù)
醫(yī)療衛(wèi)生應(yīng)用主要功能包括地圖數(shù)據(jù)的顯示操作、醫(yī)療衛(wèi)生數(shù)據(jù)的查詢定位,地名地址周邊醫(yī)療衛(wèi)生點(diǎn)查詢等。本應(yīng)用使用JavaScript的客戶端方式,結(jié)合開(kāi)源框架.NET Core開(kāi)發(fā)模式實(shí)現(xiàn)。
天地圖提供免費(fèi)開(kāi)放的基礎(chǔ)地圖服務(wù),為瓦片地圖形式,在應(yīng)用中作為底圖直接調(diào)用。本應(yīng)用加載天地圖的在線地圖作為底圖,默認(rèn)顯示天地圖的矢量底圖,通過(guò)底圖列表實(shí)現(xiàn)切換天地圖數(shù)據(jù)類型的功能,如圖5所示。

圖5 地圖加載
(1)縮放功能
底圖縮放都是由OpenLayers的View類中的setZoom方法實(shí)現(xiàn),縮放的級(jí)數(shù)由setZoom方法的參數(shù)設(shè)置。首先通過(guò)view.getZoom()獲得當(dāng)前地圖的級(jí)數(shù),然后調(diào)用setZoom方法進(jìn)行縮放,通過(guò)view.setZoom(zoom-1)可將地圖縮小一級(jí),通過(guò)view.setZoom(zoom+1)可將地圖放大一級(jí)。
(2)測(cè)量功能
測(cè)量功能包括距離測(cè)量與面積測(cè)量。距離測(cè)量是指計(jì)算鼠標(biāo)繪制的線條實(shí)際長(zhǎng)度,面積測(cè)量則是指計(jì)算鼠標(biāo)繪制范圍的實(shí)際面積大小。OpenLayers的測(cè)量功能沒(méi)有提供封裝好的測(cè)量控件,但提供了相應(yīng)接口,需要基于幾何對(duì)象的相應(yīng)接口并結(jié)合圖形繪制功能來(lái)實(shí)現(xiàn),如圖6所示。

圖6 量測(cè)
(3)搜索功能
搜索功能調(diào)用天地圖的地名搜索服務(wù)。天地圖的地名搜索服務(wù)API是一類簡(jiǎn)單的HTTP/HTTPS接口,包括普通搜索、視野內(nèi)搜索、周邊搜索、拉框搜索、普通建議詞搜索等。使用搜索服務(wù)前需要申請(qǐng)自己的Key。

圖7 地名搜索
聚合標(biāo)準(zhǔn)是指在不同地圖分辨率下,通過(guò)聚合方式展現(xiàn)標(biāo)注點(diǎn)信息的一種方式,其目的是為了減少當(dāng)前視窗下地圖添加標(biāo)注點(diǎn)的數(shù)量,提升客戶端渲染速度。如果在地圖上添加很多標(biāo)注點(diǎn),當(dāng)?shù)貓D縮放到小級(jí)別時(shí)則會(huì)出現(xiàn)標(biāo)注點(diǎn)重疊的現(xiàn)象,既不美觀,多點(diǎn)渲染的效率也會(huì)受到影響。此時(shí),可以根據(jù)地圖縮放級(jí)數(shù)的大小,將當(dāng)前視窗的標(biāo)注點(diǎn)聚合顯示。
OpenLayers提供了相應(yīng)的聚合標(biāo)注功能,以此方式來(lái)提升速度,增強(qiáng)用戶體驗(yàn)。OpenLayers封裝了聚合數(shù)據(jù)源(ol.source.Cluster),可通過(guò)此數(shù)據(jù)源實(shí)現(xiàn)矢量要素的聚合功能,如圖8、圖9所示。

圖8 藥店聚合分布

圖9 社區(qū)診所聚合分布
醫(yī)療衛(wèi)生服務(wù)查詢調(diào)用GeoServer的WFS服務(wù),將結(jié)果展示在地圖上,點(diǎn)擊結(jié)果行,彈出相應(yīng)Popup標(biāo)注,如圖10、圖11所示。

圖10 醫(yī)療衛(wèi)生查詢面板

圖11 醫(yī)院查詢結(jié)果
在用戶搜索地名地址時(shí),能查找到該地名地址周邊一定距離的醫(yī)療衛(wèi)生點(diǎn),如圖12所示。該功能用Post GIS計(jì)算空間距離。對(duì)應(yīng)的SQL語(yǔ)句為:

圖12 周邊搜索
select st_astext(geom) as geometry,* from table where ST_DWithin(st_astext(geom),('POINT(X,Y)'),radius/ (2 *PI * 6371004) * 360)=true ;