1. 程式人生 > >OpenLayers + GeoServer 實現(擴充套件的)通用查詢語言(CQL/ECQL)

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的方式是一樣的,如有問題,可進行溝通。