小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

GIS的學習(二十)基于Geoserver的WFS服務與Openlayers實現地理查詢

 primivite_ 2017-09-11

基于Geoserver發(fā)布的wfs服務,與Openlayers結合實現空間和屬性信息的查詢。wfs包含getFeature操作,用來檢索要素信息,支持返回gml格式的地理要素表達。

WFSgetFeature操作需要提供的參數:

參數名稱

是否必須

默認值

舉例

含義

VERSION

1.1.0

version=1.1.0version=1.0.0

版本號

SERVICE

WFS

WFS

服務名稱

REQUEST=GetFeature

 

 

請求操作(固定值)

TYPENAME

text/xml; subtype=gml/3.1.1

typeName=bj.xzqy

typeName=bj.xzqy, bj:sqdw_font_point

圖層名稱(命名空間.圖層名稱),多個圖層名稱用逗號隔開

OUTPUTFORMAT

 

 

outputFormat=GML2

輸出類型

BBOX

 

 

BBOX=-75.102613,40.212597,-72.361859,41.512517,EPSG:4326

矩形范圍(左下角X坐標,左下角Y坐標,右上角X坐標,右上角Y坐標,EPSG4326

FILTER

 

 

FILTER=<Filter><Within><PropertyName>InWaterA_1M/wkbGeom<PropertyName> <gml:Envelope><gml:lowerCorner>10,10</gml:lowerCorner> <gml:upperCorner>20 20</gml:upperCorner></gml:Envelope></Within></Filter>

過濾條件,gml格式定義空間范圍,可包含屬性條件。Filter是一種符合OGC規(guī)范的語言,一種XML實現的語言。SLD用它來實現復雜的Rule選擇。WFS在所有需要定位操作對象的地方都會使用FilterFilter的作用是構建一個表達式,返回值就是Feature的集合。

SORTBY

 

 

 

排序字段

MAXFEATURES

 

 

 

最多返回結果個數

PROPERTYNAME

 

 

propertyName=STATE_NAME,PERSONS

字段名稱,逗號隔開

SRSNAME

 

 

 

投影方式名稱

FEATUREID

 

 

FEATUREID=states.3

ID(圖層名稱.ID),多個用逗號隔開

EXPIRY

 

 

 

排除

RESULTTYPE

 

 

 

 

FEATUREVERSION

 

 

 

 

 

舉例:

 

FILTER詳解:Filter是一種基于XML的并且符合OGC規(guī)范的語言。SLD用它來實現復雜的Rule選擇。WFS在所有需要定位操作對象的地方都會使用Filter。Filter的作用是構建一個表達式,返回值就是Feature的集合,換句話說Filter就如他的名字一般為我們從一個集合中過濾出一個滿足我們要求的子集。而過濾的方法就是Filter定義的操作符。Filter定義了三種操作符:地理操作符(Spatial operators),比較操作符(Comparison operators)和邏輯操作符(Logical operators)。

u      Spatial operators定義了地理屬性的操作方式,他們有:Equals,Disjoint,Touches,WithinOverlaps,CrossesIntersects,Contains,DWithinBeyond,BBOX。

名稱

含義

舉例

Equals

等于

 

Disjoint

不相交

 

Intersects

相交(存在交集)

 

Touches

 

 

Within

..內部

 

DWithin

外部

 

Overlaps

疊加

 

Crosses

通過

 

Contains

包含

 

Beyond

 

 

BBOX

矩形范圍

 

 

u      Comparison operators定義了標量屬性的操作方式,他們有:PropertyIsEqualToPropertyIsNotEqualTo,PropertyIsLessThan,PropertyIsGreaterThan,PropertyIsLessThanOrEq,PropertyIsGreaterThanO,PropertyIsLikePropertyIsNull,PropertyIsBetween。

名稱

含義

舉例

PropertyIsEqualTo

==

 

PropertyIsNotEqualTo

!=

 

PropertyIsLessThan

 

PropertyIsGreaterThan

 

PropertyIsLessThanOrEq

<=

 

PropertyIsGreaterThanO

>=

 

PropertyIsLike

利用通配符等符號對字符進行模糊匹配

<Filter>

<PropertyIsLike wildCard="*" singleChar="#" escapeChar="!">

<PropertyName>LAST_NAME</PropertyName>

<Literal>JOHN*</Literal>

</PropertyIsLike>

</Filter>

PropertyIsNull

為空

 

PropertyIsBetween

之間

 

 

u      Logical operators邏輯操作符,定義了組合這些操作的方式,他們有:And,OrNot。

舉例:構建一個表達式,人口在一千萬以上,并且在指定的空間范圍內的城市。

<Filter>
    <And>
        <PropertyIsGreaterThan>
            <PropertyName>population</PropertyName>
            <Literal>10000000</Literal>
        </PropertyIsGreaterThan>
        <BBOX>
            <PropertyName>geom</PropertyName>
            <Envelope srsName="EPSG:4326">
                <lowerCorner>-180 -90</lowerCorner>
                <upperCorner>180 90</upperCorner>
            </Envelope>
        </BBOX>
    </And>
</Filter>

 

驗證實例:之前走了一些彎路,自己構建Filterxml編碼,后來發(fā)現OpenLayers已經寫好了Filter過濾條件和轉成xml的類,這樣Filter標簽里的內容不用逐個編寫了。

1.       拓撲查詢(點與面相交- Intersects

查詢條件設置如下:

var XML;

    XML = '<?xml version="1.1.0" encoding="UTF-8"?>' + "/n";

    XML = '<wfs:GetFeature service="WFS" version="1.0.0" outputFormat="GML2"' + "/n";

    XML += '  xmlns:topp="http://www./topp"' + "/n";

    XML += '  xmlns:wfs="http://www./wfs"' + "/n";

    XML += '  xmlns:ogc="http://www./ogc"' + "/n";

    XML += '  xmlns:gml="http://www./gml"' + "/n";

    XML += '  xmlns:xsi="http://www./2001/XMLSchema-instance"' + "/n";

    XML += '  xsi:schemaLocation="http://www./wfs' + "/n";

    XML += '                      http://schemas./wfs/1.1.0/WFS-basic.xsd">' + "/n";

 

    //上面是查詢用的gml的前綴

    XML += '<wfs:Query typeName="bj:xzqy">' + "/n";

    XML += '<wfs:PropertyName>bj:ENTITY_ID</wfs:PropertyName>' + '/n';

    XML += '<wfs:PropertyName>bj:the_geom</wfs:PropertyName>' + '/n';

 

    XML += '<ogc:Filter>' + "/n";

    XML += '<ogc:Intersects>' + "/n";

    XML += '<ogc:PropertyName>bj:the_geom</ogc:PropertyName>' + "/n";

    XML += ' <gml:Point srsName="http://www./gml/srs/epsg.xml#4326">' + "/n";

    XML += '<gml:coordinates>116.817265,40.5296504</gml:coordinates>' + "/n";

    XML += '</gml:Point>' + "/n";

    XML += '</ogc:Intersects>' + "/n";

    XML += '</ogc:Filter>' + "/n";

    XML += '</wfs:Query>' + "/n";

    XML += '</wfs:GetFeature>';

 

 

    var xmlPara = XML; //返回結果無法解析為gml??-已解決(增加返回結果樣式標簽)

    var request = OpenLayers.Request.POST({

        url: "http://localhost:8080/geoserver/wfs?",

        data: xmlPara,

        callback: onComplete

    });

查詢結果展示:地圖上深色的部分為根據坐標點與行政區(qū)域面相交分析出的結果

 

2.      拓撲查詢(面與面相交- Intersects

查詢條件設置:

var XML;

    XML = '<?xml version="1.1.0" encoding="UTF-8"?>' + "/n";

    XML = '<wfs:GetFeature service="WFS" version="1.0.0" outputFormat="GML2"' + "/n";

    XML += '  xmlns:topp="http://www./topp"' + "/n";

    XML += '  xmlns:wfs="http://www./wfs"' + "/n";

    XML += '  xmlns:ogc="http://www./ogc"' + "/n";

    XML += '  xmlns:gml="http://www./gml"' + "/n";

    XML += '  xmlns:xsi="http://www./2001/XMLSchema-instance"' + "/n";

    XML += '  xsi:schemaLocation="http://www./wfs' + "/n";

    XML += '                      http://schemas./wfs/1.1.0/WFS-basic.xsd">' + "/n";

 

    //上面是查詢用的gml的前綴

    XML += '<wfs:Query typeName="bj:xzqy">' + "/n";

    XML += '<wfs:PropertyName>bj:ENTITY_ID</wfs:PropertyName>' + '/n';

    XML += '<wfs:PropertyName>bj:the_geom</wfs:PropertyName>' + '/n';

 

    XML += '<ogc:Filter>' + "/n";

    XML += '<ogc:Intersects>' + "/n";

    XML += '<ogc:PropertyName>bj:the_geom</ogc:PropertyName>' + "/n";

    XML += '<gml:Polygon srsName="http://www./gml/srs/epsg.xml#4326">' + "/n";

 

    XML += '<gml:outerBoundaryIs>' + "/n";

    XML += '<gml:LinearRing>' + "/n";

    XML += '<gml:coordinates>115.40316,39.425701 116.40316,39.425701 116.40316,40.245 115.40316,40.245 115.40316,39.425701</gml:coordinates>' + "/n"; //0,0 100,0 100,100 0,100 0,0

    XML += '</gml:LinearRing>' + "/n";

    XML += '</gml:outerBoundaryIs>' + "/n";

 

    XML += '</gml:Polygon>' + "/n";

    XML += '</ogc:Intersects>' + "/n";

    XML += '</ogc:Filter>' + "/n";

    XML += '</wfs:Query>' + "/n";

    XML += '</wfs:GetFeature>';

 

 

    var xmlPara = XML; //返回結果無法解析為gml??-已解決(增加返回結果樣式標簽)

    var request = OpenLayers.Request.POST({

        url: "http://localhost:8080/geoserver/wfs?",

        data: xmlPara,

        callback: onComplete

    });

查詢結果展現:地圖上深色的部分為查詢到的行政轄區(qū)面要素

 

3.      拓撲查詢(面與面包含- Contains

使用Openlayers提供的方法構造過濾條件

1.      拓撲查詢(空間相交與屬性過濾)

查找指定空間范圍(傳入Geometry類型參數)內NAME字段以“幼兒園”結尾的要素。

或者NAME字段的值為“西羅園第三幼兒園”的要素。

或者OBJECTID字段的值的范圍是從01000。

//驗證利用Filter構建過濾條件

function conformationFilter(geo) {

var filter_1_0 = new OpenLayers.Format.Filter.v1_0_0();

//也可以使用1.1版本構造過濾條件

    //var filter_1_1 = new OpenLayers.Filter({ version: "1.1.0" });

    var xml = new OpenLayers.Format.XML(); //構造xml格式的文件

    var filter = new OpenLayers.Filter.Logical({//邏輯操作符

        type: OpenLayers.Filter.Logical.AND, //并且更改為或者

        filters: [

        new OpenLayers.Filter.Spatial({

            type: OpenLayers.Filter.Spatial.INTERSECTS, //INTERSECTS, //相交OK

            value: geo,

            projection: "EPSG:4326"

        }),

//BBOX方式OK

        //        new OpenLayers.Filter.Spatial({

        //            type: OpenLayers.Filter.Spatial.BBOX,

        //            value: new OpenLayers.Bounds(115.40316, 39.425701, 116.40316, 40.245),

        //            projection: "EPSG:4326"

        //        }),

         new OpenLayers.Filter.Comparison({//比較操作符

             type: OpenLayers.Filter.Comparison.LIKE, //模糊查詢(通配符:*/#/!),速度很慢

             property: "bj:NAME",

             value: "*幼兒園"

 

         }),

         new OpenLayers.Filter.Comparison({//比較操作符

         type: OpenLayers.Filter.Comparison.EQUAL_TO, //精確查詢

             property: "bj:NAME",

             value: "西羅園第三幼兒園"

 

         }),

new OpenLayers.Filter.Comparison({//比較操作符

             type: OpenLayers.Filter.Comparison.BETWEEN, //在。。。之間(數值型)

             property: "bj:OBJECTID",

             lowerBoundary: 0,

             upperBoundary: 1000

 

         })

    ]

    });

 

    //構造指定格式的xml

    return result = xml.write(filter_1_0.write(filter));

 

};

 

展示結果:

 

 

返回結果的高亮顯示和屬性信息展示:

//AJAX請求結果處理函數(添加標注+屬性列表)

function onComplete(req) {

    //openlayers的GML解析器

    var gmlParse = new OpenLayers.Format.GML();//如果使用wfs1.1.0,則需要增加如下參數:{xy:false }//更改x,y坐標的讀取順序

    var features = gmlParse.read(req.responseText);

 

    var icon = new OpenLayers.Icon("img/marker-blue.png");

    var feature, lonlat, marker;

    var attributes = [];

    //高亮顯示       

    for (var feat in features) {

        feature = features[feat];     

       //高亮顯示

        switch (feature.geometry.CLASS_NAME) {

            case "OpenLayers.Geometry.MultiPolygon":

                {

                    var polygon = feature.geometry.components[0].clone();

                    var vec = new OpenLayers.Feature.Vector(polygon);

                    temVectorLayer.addFeatures([vec]);

                }

                break;

            case "OpenLayers.Geometry.Point":

                {

                    //經度緯度是相反的,所以需要重新構建

                    var pt = feature.geometry.clone();

                    var vec = new OpenLayers.Feature.Vector(pt);

                    temVectorLayer.addFeatures([vec]);

                }

                break;

        }

        attributes.push(feature.attributes);

    }

    var strAttributes = "";

    if (!document.all("attr")) return;

    if (document.all("attr").firstChild) {

        document.all("attr").firstChild.removeNode(true);

    }

    for (var key in attributes) {

        var attr = attributes[key];

        strAttributes += "[";

        var trHead = document.all("attr").insertRow();

        var tdHead = trHead.insertCell();

        tdHead.innerText = "編號:" + key;

 

        for (var k in attr) {

            var tr = document.all("attr").insertRow();

            var td0 = tr.insertCell();

            td0.innerText = k;

            var td1 = tr.insertCell();

            td1.innerText = attr[k];

 

            strAttributes += k + ":" + attr[k];

        }

        strAttributes += "]";

 

    };

    alert(strAttributes);

};

http://www./wfs?SERVICE=WFS& VERSION=1.1.0& REQUEST=GetFeature& PROPERTYNAME=InWaterA_1M/wkbGeom,InWaterA_1M/tileId& TYPENAME=InWaterA_1M& FILTER=<Filter><Within><PropertyName>InWaterA_1M/wkbGeom<PropertyName> <gml:Envelope><gml:lowerCorner>10,10</gml:lowerCorner> <gml:upperCorner>20 20</gml:upperCorner></gml:Envelope></Within></Filter>

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多