`
longgangbai
  • 浏览: 7343391 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GIS的学习(二十)基于Geoserver的WFS服务与Openlayers实现地理查询

阅读更多

基于Geoserver发布的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规范的语言,一种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规范的语言。SLD用它来实现复杂的Rule选择。WFS在所有需要定位操作对象的地方都会使用FilterFilter的作用是构建一个表达式,返回值就是Feature的集合,换句话说Filter就如他的名字一般为我们从一个集合中过滤出一个满足我们要求的子集。而过滤的方法就是Filter定义的操作符。Filter定义了三种操作符:地理操作符(Spatial operators),比较操作符(Comparison operators)和逻辑操作符(Logical operators)。

u      Spatial operators定义了地理属性的操作方式,他们有:EqualsDisjointTouchesWithinOverlapsCrossesIntersectsContainsDWithinBeyondBBOX

名称

含义

举例

Equals

等于

 

Disjoint

不相交

 

Intersects

相交(存在交集)

 

Touches

 

 

Within

..内部

 

DWithin

外部

 

Overlaps

叠加

 

Crosses

通过

 

Contains

包含

 

Beyond

 

 

BBOX

矩形范围

 

 

u      Comparison operators定义了标量属性的操作方式,他们有:PropertyIsEqualToPropertyIsNotEqualToPropertyIsLessThanPropertyIsGreaterThanPropertyIsLessThanOrEqPropertyIsGreaterThanOPropertyIsLikePropertyIsNullPropertyIsBetween

名称

含义

举例

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逻辑操作符,定义了组合这些操作的方式,他们有:AndOrNot

举例:构建一个表达式,人口在一千万以上,并且在指定的空间范围内的城市。

<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编码,后来发现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.openplans.org/topp"' + "/n";

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

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

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

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

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

    XML += '                      http://schemas.opengis.net/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.opengis.net/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

    });

查询结果展示:地图上深色的部分为根据坐标点与行政区域面相交分析出的结果

 

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.openplans.org/topp"' + "/n";

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

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

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

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

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

    XML += '                      http://schemas.opengis.net/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.opengis.net/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

    });

查询结果展现:地图上深色的部分为查询到的行政辖区面要素

 

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) {

    //openlayersGML解析器

    var gmlParse = new OpenLayers.Format.GML();//如果使用wfs1.1.0,则需要增加如下参数:{xy:false }//更改xy坐标的读取顺序

    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.someserver.com/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>

分享到:
评论

相关推荐

    geoserver wfs过滤查询

    在GIS(地理信息系统)领域,GeoServer是一款开源的、基于Java的服务器软件,它能够发布和操作地理空间数据。WFS(Web Feature Service)是OGC(Open Geospatial Consortium)制定的一种标准接口,用于在网络上交换...

    openlayers 编辑geoserver图层

    OpenLayers是一个JavaScript库,用于在Web浏览器中显示地图,而GeoServer则是一个基于Java的服务,它允许用户发布、管理和操作地理空间数据。本资源主要针对初级学习者,介绍如何使用OpenLayers对GeoServer图层进行...

    geoServer+openLayers简单小例子

    GeoServer是一个基于Java的Web服务,用于发布和管理地理空间数据,而OpenLayers则是一个JavaScript库,用于在Web浏览器中创建交互式地图应用。 GeoServer的核心功能是作为Web服务提供地理信息,它支持多种开放标准...

    Geoserver+openlayer+postGis要素增删改查

    GeoServer 是一个开源的、基于 Java 的地理信息服务器,它可以读取多种GIS数据格式,并通过WMS(Web Map Service)、WFS(Web Feature Service)等OGC(开放地理空间联盟)标准进行数据发布。在本项目中,GeoServer...

    Geoserver/OpenLayers-世上最详细配置资料

    同时,还会涵盖OpenLayers与GeoServer的协同工作,通过WMS和WFS请求获取和编辑地理数据。 **3. WebGIS基础** 在深入讲解Geoserver和OpenLayers之前,资料可能首先会介绍WebGIS的基本概念,包括地理坐标系统、投影...

    wfs获取图层信息并返回geoJson数据集

    GeoServer是一款开源的GIS服务器,它支持WFS服务,使得用户能够通过HTTP协议进行地理数据的查询、添加、修改和删除。WFS通常与Web Map Service (WMS) 配合使用,WMS负责渲染地图图像,而WFS则处理地理数据的交换。 ...

    openlayers3+geoserver地图交互

    通过与GeoServer的WFS服务配合,这些点还可以存储回服务器,形成新的地理空间数据。 b. 点击地图街道选中要素:这个功能依赖于OpenLayers的“getFeatureIdAtPixel”方法。当用户点击地图时,这个方法可以确定鼠标...

    geoserver 地图专题图

    【描述】提到的"geoserver+openlayers 地图专题图"是指使用开源的GIS服务器Geoserver和JavaScript库OpenLayers共同实现的地图服务。Geoserver是一款基于Java的Web服务,用于发布、管理和共享地理空间数据。它支持...

    基于geoserver专题图

    6. **客户端应用**:最后,我们可以在WebGIS客户端(如OpenLayers、Leaflet等)中调用GeoServer的WMS服务,动态请求不同规则的专题图层,以实现地图的交互和更新。 在实际应用中,GeoServer还可以与GeoWebCache结合...

    geoserver 开源gis服务器

    GeoServer是一款开源的GIS(地理信息系统)服务器,它基于Java技术构建,并遵循GNU General Public License。作为GIS领域的重要工具,GeoServer提供了丰富的功能,用于发布、管理和共享地理空间数据。这款服务器是...

    openlayers编辑地图图层并保存到geoserver

    这个程序示例展示了如何结合OpenLayers和GeoServer实现地图图层的编辑功能,这在GIS(地理信息系统)开发中是非常常见的需求。GeoServer是一个开源的GIS服务器,能够发布地图数据并提供WFS(Web Feature Service)等...

    基础WebGIS应用程式_基于openlayers,与GeoServer和PostGIS联动.zip

    在本压缩包中,我们关注的是一个基础的WebGIS(Web地理信息系统)应用程序,它主要依赖于OpenLayers库,同时与GeoServer和PostGIS数据库进行交互。这些技术都是GIS领域中非常重要的组成部分,用于构建可在线访问的...

    geoserver_OpenLayers配置

    ### Geoserver与OpenLayers配置知识点详解 #### 一、基础知识概述 **Geoserver**是一种开源的服务器解决方案,用于发布地理数据,并提供强大的功能来处理、管理和分发空间信息。它支持多种开放地理信息系统(OGC)...

    geoserver与OpenLayers配置说明文档

    《Geoserver与OpenLayers配置详解》 在GIS(地理信息系统)领域,Geoserver和OpenLayers是两个非常重要的开源工具。...记住,不断学习和实践是掌握Geoserver与OpenLayers的关键,这将使你在GIS开发领域更加游刃有余。

    geoserver_OpenLayers 配置文档

    GeoServer是一款基于Java的开源地理空间服务器,它能够发布和操作地理空间数据,而OpenLayers则是一个用于创建交互式地图的JavaScript库。这两者的结合,使得Web GIS应用的开发变得更加简单和高效。 GeoServer的...

    geoserver与OpenLayers配置入门

    【Geoserver与OpenLayers配置入门】是一篇指导初学者如何搭建和配置地理信息系统环境的教程,主要涉及两个核心组件:Geoserver和OpenLayers。本文将详细介绍这两个工具的使用和配置过程。 **Geoserver** 是一个开源...

    GeoServer OGC服务文档

    总结起来,GeoServer OGC服务文档是开发者进行地图服务二次开发的重要参考资料,它详细阐述了各种服务接口的参数、用法和示例,为构建基于地理信息的Web应用提供了有力的支持。开发者可以根据需求选择合适的服务,并...

    uDig定制地图样式发布到Geoserver并使用Openlayers和Cesium验证.rar

    Geoserver是一款基于Java的开源GIS服务器,它可以发布和管理地理空间数据,并支持多种标准如WMS(Web Map Service)和WFS(Web Feature Service)。在本项目中,uDig定制的地图样式将被发布到Geoserver上。发布过程...

    geoserver.ppt

    在现代地理信息系统(GIS)领域,GeoServer、PostGIS和OpenLayers是构建基于Web的地理信息应用的重要组件。GeoServer是一款开源的地理信息服务器,实现了OpenGIS标准,能够提供Web Feature Service (WFS) 和Web Map ...

Global site tag (gtag.js) - Google Analytics