1. 程式人生 > >通過sqlview動態釋出地圖圖層

通過sqlview動態釋出地圖圖層

1.SQL Views簡介

Geoserver+postgresql+openlayers(leaflet)是目前主流的gis開發工具。Postgresql用於儲存地圖資料,geoserver用於釋出地圖資料,openlayers或者leaflet用於訪問釋出地圖。正常情況下當shapefile格式的資料匯入postgresql資料庫中之後,我們需要通過geoserver把所有的資料釋出出去,這樣才能訪問。常規情況下這種操作方式是沒有問題的,因為地圖作為基礎服務,一旦釋出出去是不會變化的。但是對於室內地圖來說就不行了,假如一個商場有5層,每一樓層又層有5個地圖圖層,對於這樣一個商場需要把這25個地圖圖層在geoserver中全部發布出來才能訪問該商場的全部地圖。假如釋出這一個商場的25個圖層你還能忍受的話,那釋出成千上萬個商場的地圖你還能忍受嗎?既然忍受不了那就要想辦法解決。由於釋出地圖是機械的重複的工作,我們是否能想一些辦法來幫我們完成這些工作呢。這時候就是我們的sqlView出場了。

首先介紹一下sql View,通過SQLViews可以做如下事情:

(1)資料庫view可以在geoserver中當作表完全一樣的釋出,而geoserver的SQLViews不僅能實現簡單的查詢釋出,還能輸入引數作為查詢檢視的條件。

(2)SQLViews可以釋出資料庫的儲存過程或者function,執行更加複雜的邏輯操作與查詢。

(3)SQL Views查詢可以通過字串替換的方式進行引數化,引數值可以在wms和wfs請求總使用,輸入值可以通過設定的正則表示式進行驗證從而消除SQL 注入攻擊的風險。

(4)SQLViews是對資料庫操作與查詢的一個結果,不能使用wfs_t去操作它,但是wfs,wms都可以正常請求或者查詢。

2.建立帶查詢條件的SQL Views檢視:

(1)登入geoserver,點選圖層,選擇工作空間,新建圖層。

(2)新建SQL Views檢視圖層,併發布。

 


這裡建立了一個檢視,釋出傳入的表名資料。

tbl的預設值設定為資料庫中一直會存在的表格,設定的正則表示式為只允許輸入字母數字和下劃線。


在屬性值對輸出結果的型別和座標系做了設定。

(3)圖層訪問

在通過wms獲取地圖的時候只需要把tbl的值通過viewparams傳遞過去就行了

http://10.20.135.14/geoserver/parking/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&LAYERS=parking%3AvTingchewei&CRS=EPSG%3A4326&STYLES=&WIDTH=2700&HEIGHT=1200&BBOX=20.02708134918213%2C110.33805803565978%2C20.03351865081787%2C110.3525419643402&viewparams=tbl%3Awanghaiguojia_b2_tingchewei

viewparams格式一般是viewparams=p1:v1;p2:v2;…可以加若干個引數。不同引數之間以;隔開,單個引數是鍵值對,即p1是引數名稱,v1是引數值。

通過wms方式訪問釋出的檢視方法為:

var params = {

                            LAYERS:'parking:vTingchewei',

                            FORMAT:'image/png'

                   };

                   varviewparams = [

                            'tbl:wanghaiguojia_b2_tingchewei'

                   ];

                   params.viewparams= viewparams;

                   varvTingchewei = new ol.layer.Image({

                            source:new ol.source.ImageWMS({

                            url:'http://10.20.135.14/geoserver/parking/wms',                 

                            params:params,

                            serverType:'geoserver',

                   })

    });

通過這種方式,再多的商場只需要在geoserver中釋出5次檢視即可,而且該釋出檢視的程式碼可以預先寫入geoserver中打包進去。這樣該系統在任何商場使用都不需要釋出地圖了。

3.建立包含function的SQL View檢視

解決了圖層釋出的問題,終於可以鬆一口氣了。但是,沒想到棘手的問題還在後面。領導讓做室內導航功能。做就做吧,誰讓咱是苦逼的碼農呢。那該怎麼做室內導航呢,做這個功能之前,咱還是要規劃一下的。首先要寫最短路徑查詢演算法;然後查詢路徑的時候只需要把起點和終點的位置輸入演算法查詢即可;最後把查詢的結果通過wms或wfs方式獲取,顯示在地圖上。

編寫最短路徑規劃演算法的時候我們需要的輸入有:使用者所在樓層的道路名,起點和終點的位置,然後我們吭哧吭哧,大戰3天三夜,搞定。

接著查詢,好辦,直接按照上面的放吧,把該商場的5個樓層都發佈一個基於對應樓層的結果路徑檢視,機智吧?NO,NO,NO!簡直遇事情不懂腦子啊。這個時候肯定需要換一個新的方法,把最短路徑規劃演算法寫成一個Function嵌入到postgresql資料庫中,該function的輸入引數為:使用者所在樓層,起點位置,終點位置;輸出引數為起點和終點直接經過的點座標。

最後,通過wms或者wfs的方式獲取得到的最短路徑結果即可。