您好,登錄后才能下訂單哦!
Sqlview動態(tài)發(fā)布地圖圖層的方法是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
1.SQL Views簡介
Geoserver+postgresql+openlayers(leaflet)是目前主流的gis開發(fā)工具。Postgresql用于存儲地圖數據,geoserver用于發(fā)布地圖數據,openlayers或者leaflet用于訪問發(fā)布地圖。正常情況下當shapefile格式的數據導入postgresql數據庫中之后,我們需要通過geoserver把所有的數據發(fā)布出去,這樣才能訪問。常規(guī)情況下這種操作方式是沒有問題的,因為地圖作為基礎服務,一旦發(fā)布出去是不會變化的。但是對于室內地圖來說就不行了,假如一個商場有5層,每一樓層又層有5個地圖圖層,對于這樣一個商場需要把這25個地圖圖層在geoserver中全部發(fā)布出來才能訪問該商場的全部地圖。假如發(fā)布這一個商場的25個圖層你還能忍受的話,那發(fā)布成千上萬個商場的地圖你還能忍受嗎?既然忍受不了那就要想辦法解決。由于發(fā)布地圖是機械的重復的工作,我們是否能想一些辦法來幫我們完成這些工作呢。這時候就是我們的sqlView出場了。
首先介紹一下sql View,通過SQLViews可以做如下事情:
(1)數據庫view可以在geoserver中當作表完全一樣的發(fā)布,而geoserver的SQLViews不僅能實現簡單的查詢發(fā)布,還能輸入參數作為查詢視圖的條件。
(2)SQLViews可以發(fā)布數據庫的存儲過程或者function,執(zhí)行更加復雜的邏輯操作與查詢。
(3)SQL Views查詢可以通過字符串替換的方式進行參數化,參數值可以在wms和wfs請求總使用,輸入值可以通過設置的正則表達式進行驗證從而消除SQL 注入攻擊的風險。
(4)SQLViews是對數據庫操作與查詢的一個結果,不能使用wfs_t去操作它,但是wfs,wms都可以正常請求或者查詢。
2.創(chuàng)建帶查詢條件的SQL Views視圖:
(1)登錄geoserver,點擊圖層,選擇工作空間,新建圖層。
(2)新建SQL Views視圖圖層,并發(fā)布。
這里創(chuàng)建了一個視圖,發(fā)布傳入的表名數據。
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方式訪問發(fā)布的視圖方法為:
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中發(fā)布5次視圖即可,而且該發(fā)布視圖的代碼可以預先寫入geoserver中打包進去。這樣該系統(tǒng)在任何商場使用都不需要發(fā)布地圖了。
3.創(chuàng)建包含function的SQL View視圖
解決了圖層發(fā)布的問題,終于可以松一口氣了。但是,沒想到棘手的問題還在后面。領導讓做室內導航功能。做就做吧,誰讓咱是苦逼的碼農呢。那該怎么做室內導航呢,做這個功能之前,咱還是要規(guī)劃一下的。首先要寫最短路徑查詢算法;然后查詢路徑的時候只需要把起點和終點的位置輸入算法查詢即可;最后把查詢的結果通過wms或wfs方式獲取,顯示在地圖上。
編寫最短路徑規(guī)劃算法的時候我們需要的輸入有:用戶所在樓層的道路名,起點和終點的位置,然后我們吭哧吭哧,大戰(zhàn)3天三夜,搞定。
接著查詢,好辦,直接按照上面的放吧,把該商場的5個樓層都發(fā)布一個基于對應樓層的結果路徑視圖,機智吧?NO,NO,NO!簡直遇事情不懂腦子啊。這個時候肯定需要換一個新的方法,把最短路徑規(guī)劃算法寫成一個Function嵌入到postgresql數據庫中,該function的輸入參數為:用戶所在樓層,起點位置,終點位置;輸出參數為起點和終點直接經過的點坐標。
通過wms或者wfs的方式獲取得到的最短路徑結果即可。
以上所述實現小編給大家介紹的Sqlview動態(tài)發(fā)布地圖圖層的方法,希望對大家有所幫助!
看完上述內容,你們掌握Sqlview動態(tài)發(fā)布地圖圖層的方法是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。