在傳統 GIS 開發棧(PostgreSQL/PostGIS + GeoServer + OpenLayers/Leaflet)中,Shapefile 匯入資料庫後,通常需在 GeoServer 逐一發布每個圖層。對於靜態基礎圖層這無可厚非,但面對室內地圖、多樓層商場等動態場景時,這種機械重複的操作將成為災難:一個擁有 5 樓層、每層 5 個圖層的商場就需發布 25 個圖層;成千上萬個商場更是無法想像。SQL View 的出現正是為了解決這一痛點。
viewparams 傳遞,並支援正則驗證,有效防範 SQL 注入。登入 GeoServer 管理介面 → 「圖層」 → 選擇工作空間 → 「新增圖層」 → 選擇資料存儲 → 「新增 SQL View」。

以下範例動態指定資料表名稱 tbl:
SELECT * FROM %{tbl}
設定參數 tbl:預設值指向一個永久存在的資料表,正則限制為 ^[a-zA-Z0-9_]+$,僅允許字母、數字、底線,杜絕注入風險。

在「屬性」頁簽確認幾何欄位類型(如 Polygon)與 SRID(如 EPSG:4326),儲存並發布。
var params = {
LAYERS: 'parking:vTingchewei',
FORMAT: 'image/png'
};
var viewparams = ['tbl:wanghaiguojia_b2_tingchewei'];
params.viewparams = viewparams.join(';');
var vTingchewei = new ol.layer.Image({
source: new ol.source.ImageWMS({
url: 'https://10.20.135.14/geoserver/parking/wms',
params: params,
serverType: 'geoserver'
})
});
WMS 請求 URL 範例:
https://10.20.135.14/geoserver/parking/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=parking:vTingchewei&CRS=EPSG:4326&STYLES=&WIDTH=2700&HEIGHT=1200&BBOX=20.027,110.338,20.034,110.353&viewparams=tbl:wanghaiguojia_b2_tingchewei
優勢:無論多少商場、多少樓層,GeoServer 僅需發布 5 個通用 SQL View(對應 5 類圖層),系統部署至新商場零配置,真正實現「一次開發,到處執行」。
需求:室內最短路徑導航。輸入:樓層、起點、終點座標;輸出:路徑節點座標串。
plpgsql 函數 fn_shortest_path(floor_id, start_pt, end_pt),內部實現 Dijkstra/A* 演算法,回傳 SETOF geometry。SELECT * FROM fn_shortest_path(%floor%, %start%, %end%),定義三個參數並設正則驗證。

SQL View 將「發布圖層」從人工重複勞動轉化為「參數化服務」,結合資料庫函數更能將複雜空間運算下推至資料庫層,極大提升系統擴展性與維護效率。此法已在多個商業級室內 GIS 專案落地驗證,推薦給面臨大量同構圖層發布困擾的團隊。