GeoServer之SqlView

jiym發表於2017-05-24

原文:http://www.cnblogs.com/hanhuibing/articles/5642703.html

Geoserver+postgresql+openlayers是目前主流的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引數。

相關文章