OpenLayers + GeoServer 實現(擴充套件的)通用查詢語言(CQL/ECQL)
1、CQL/ECQL簡述
CQL(Common Query Language,通用查詢語言)是OGC為目錄web服務規範建立的查詢語言,不像基於XML的編碼語言,CQL使用我們更熟悉的文字語法編寫,具有更好的可讀性和適應性。更多關於Geoserver中CQL的使用說明,參考CQL And ECQL。CQL的使用,要求屬性在比較運算子的左邊,基於此,Geoserver提供了擴充套件的CQL即ECQL,它提供了一種更類似於SQL的靈活語言。
2、使用規則說明
(1)比較運算子包括: =,<>,>,>=,<,<=,如要選取人口大於1500萬的洲,條件為PERSONS>15000000,其中PERSONS為人口數量的欄位,後面不再單獨說明。
(2)BETWEEN表示從一個範圍到另一個範圍,如PERSONS BETWEEN 1000000 AND 3000000。
(3)比較運算子支援文字值,可在運算子=的右側指定文字值,如 STATE_NAME='California',表示選擇加利福尼亞州;也可以使用LIKE操作符,與SQL中的用法一樣,如 STATE_NAME LIKE 'N%'會選擇所有以N開頭的州。
(4)對兩個屬性進行比較,如 MALE > FEMALE,選擇男性多餘女性的州。
(5)算術表示式可以使用 +, -, *, /構成,過濾條件 UNEMPLOY/(EMPLOYED + UNEMPLOY) > 0.07選擇所有失業率大於7%的州。
(6)使用IN操作符,可選擇屬性在給定值範圍內的,與SQL用法相同,如 ID IN ('states.1', 'states.12'),或查詢名字在給定值內的州,可使用 STATE_NAME IN ('New York','California', 'Texas')。
(7)可使用Geoserver中的任何過濾函式,如 strToLowerCase(STATE_NAME) like '%m%',表示名字中包含m的州,不區分M的大小寫。
(8)幾何過濾,使用BBOX,如 BBOX(the_geom, -90, 40, -60, 45)表示選擇在(-90, 40, -60, 45)範圍內的州。
3、示例
下面以載入WMS服務過程中,通過選擇省份名稱載入對應的省界及站點為例進行說明。程式碼如下:
function crtLayer(config){
var id = config.id, url = config.url, layer = config.layer, proj = config.projection;
var wmsParam = {
'LAYERS': layer,//此處可以是單個圖層名稱,也可以是圖層組名稱,或多個圖層名稱
//'TILED':false,
'VERSION': '1.1.0',
'BBOX': [89.17, 3.37, 135.31, 53.81],
'SRS': proj
};
if(config.CQL_FILTER){
wmsParam.CQL_FILTER = config.CQL_FILTER;
}
// wms.layer = new ol.layer.Tile({
// source:new ol.source.TileWMS({ //切片WMS服務,多個標註
wms.layer = new ol.layer.Image({
source:new ol.source.ImageWMS({
url: url,
//crossOrigin: 'anonymous',
params: wmsParam,
serverType:'geoserver' //伺服器型別
})
});
wms.layer.id = id;
return wms.layer;
}
wms.crtLayer = crtLayer;
return wms;
});
程式碼中,CQL_FILTER = config.CQL_FILTER即為構造的過濾條件,與在url中直接新增 cql_filter = name = 'zhangsan' 的效果是等同的,下面看效果。前一個圖載入全國的資料,後一個圖通過CQL_FILTER=PROVINCE_CODE='HA'查詢河南省資料。
WFS中使用CQL/ECQL的方式是一樣的,如有問題,可進行溝通。