GeoServer系列之SqlView


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都可以正常請求或者查詢。

創建簡單的SQL Views

這里寫圖片描述
這里寫圖片描述
這里創建了一個視圖,從road表中只返回gid小於100的記錄。
這里寫圖片描述
一般可以將數據庫中主鍵比如gid設置為標識符,返回的圖形要手動選擇類型和srid。其他發布操作和其他的一模一樣。

創建帶查詢條件的SQL Views

定義參數化Views

這里寫圖片描述
這里使用%%定義了兩個參數,一個是下限low,一個是上限high。該視圖用於傳入這兩個參數,查詢結果。
這里寫圖片描述
點擊 ‘從sql中猜想參數’,自動彈出以上內容。可以在默認值中賦值,后面正則表達式用於驗證參數格式,防止sql注入,具體細節請學習正則表達式。任何不符 合表達式規定的參數,驗證都不會通過。(新手練習可以刪除正則表達式內容,為空即可。避免因為正則不通過,導致視圖使用不了)。發布的其他操作見上文。

使用參數化Views

在正常的wms的getMap請求中或者wfs的getFeature請求的url中加入viewparams參數,用來向視圖傳遞參數值。上文中我們定義了兩個參數,即low和high,下面看如何在請求中將參數傳遞給服務器。
正常getMap語句:

http://localhost:8090/geoserver/network/wms?service=WMS&version=1.1.0&request=GetMap&layers=network:road&styles=&bbox=1.31808014222456E7,3663612.77697468,1.32722445176114E7,3844254.1268673&width=259&height=512&srs=EPSG:3857&format='image.png'

可傳遞參數的getMap

http://localhost:8090/geoserver/network/wms?service=WMS&version=1.1.0&request=GetMap&layers=network:road&styles=&bbox=1.31808014222456E7,3663612.77697468,1.32722445176114E7,3844254.1268673&width=259
&format=’image.png’
&viewparams=low:200;high:400

`正常wfs的請求url后加上viewparmas即可。
viewparams格式一般是viewparams=p1:v1;p2:v2;…可以加若干個參數。不同參數之間以;隔開,單個參數是鍵值對,即p1是參數名稱,v1是參數值。
很明顯如’,’,’ ;’都是特殊符號,用來區分參數的,可是有人要問,要是我的參數值是字符串,並且就有特殊符號怎么辦?當然有辦法–轉義!轉義符號是’\’。
比如,v1值比如是’adsf;sdfjsdf’,那么viewparams就要這么寫viewparams=p1:’adsf\;sdfjsdf’,注意’,’,’:’都是特殊符號。

創建數據庫的Function視圖

在postgis中定義Function

CREATE OR REPLACE FUNCTION zj_showjgnsr( IN p_idcode text, OUT swglm text, OUT geom geometry) RETURNS SETOF record AS $BODY$ DECLARE sql text; rec record; the_geom geometry; BEGIN execute 'select geom from grid where idcode=$1' using p_idcode into the_geom; for rec in execute 'select * from jgnsr where ST_Within(geom,$1)' using the_geom loop swglm:=rec.swglm; geom:=rec.geom; return next; end loop; return; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE STRICT;

這個function接受一個參數,根據該參數從grid表中查詢出圖形,然后以該圖形為查詢條件,查詢這個jgnsr 表中與其相交的所有記錄,並返回出去。function一般處理比較復雜的邏輯和過程。

發布Function

這里寫圖片描述
這里寫圖片描述

使用:發布成功之后,該視圖圖層和普通表在查詢時幾乎都是一模一樣的操作,不同的是,表發布的圖層可以通過wfs_t修改,而視圖圖層不可以。此外,視圖圖層有參數的,在正常請求的wfs,wms的url中要加上viewparams參數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM