Openlayer4的wfs属性查询和空间查询遇到的坑

项目需求是在特定的区域下搜索地物,类似地理围栏里查找POI的功能。而且要求通过图层叠加的方式,不能直接访问数据库然后遍历绘制。这里创建了VectorLayer,网上例子很多就不再赘述,下面是引用官网提供的Example,通过fetch(类似ajax)请求,请求wfs的服务实现。

本文是记录下当时遇到的坑。查询部分的代码如下: 

           //测试用的geometry类型数据 (Polygon)
           var newPoly =new ol.geom.Polygon([[
                [119.89817,31.91181],                    
                [119.81655,31.85485],
                [119.95809,31.84721],
                [119.89817,31.91181]]]);
            //创建字符过滤器 可以过滤字段 添加%%可以模糊查询
            var fcodeFilter = ol.format.filter.equalTo('fcode', value)
            //创建空间过滤器 可以查询特定区域下的数据
            var areaFilter =  ol.format.filter.intersects(
                'points',
                newPoly
            )
            //来自官网Example
            // generate a GetFeature request
            let featureRequest = new ol.format.WFS().writeGetFeature({
                srsName: 'EPSG:4326',
                featureNS: 'www.coconut.com',    //命名空间
                featurePrefix: 'coconut',               //工作区域
                featureTypes: ['coconut:stats_feature_info'],       //图层名
                outputFormat: 'application/json',
                filter:
                    // fcodeFilter
                    //     areaFilter
                    //组合两种过滤器
                    new ol.format.filter.and(fcodeFilter,areaFilter)    //todo 条件查询过滤

            });

            // then post the request and add the received features to a layer
            fetch('http://172.16.100.103:8000/geoserver/wfs', {
                method: 'POST',
                body: new XMLSerializer().serializeToString(featureRequest)
            }).then(function(response) {
                return response.json();
            }).then(function(json) {
                features = new ol.format.GeoJSON().readFeatures(json);
                if(features.length === 0){
                    layer.msg('此区域暂无相关地物数据!',{icon:2});
                    return;
                }
                vectorSource.addFeatures(features);
                facilities.set(value,features);
                map.getView().fit(vectorSource.getExtent());
            });

        }

网上Openlayer例子真的很少,讲的也不够清晰,按照网上例子修改多次。但是查询报错,关键卡在了response.json()这里,总是报返回的数据转json失败。

有两个坑:

一。intersects filter下geometryName一定要和你的数据源geometry类型对应的字段匹配上,如楼主的数据源对应geometry字段为points,则filter第一个参数为points!!!切记!!

二。filter写完后,在json那块不停报错,数据也无法显示。查了半天的资料,最后通过自带的Filter语句找到报错原因,输入下面请求后报错,才知道是SRID的问题,数据库导入geometry类型。

通过http请求查询WFS数据语句如下:

http://172.16.100.103:8000/geoserver/coconut/ows?service=WFS&version=1.0.0
&request=GetFeature
&typeName=coconut:stats_feature_info
&maxFeatures=50
&outputFormat=application%2Fjson
&filter=  
<Filter xmlns="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml">  
    <Intersects>
	<PropertyName>points</PropertyName>
	<gml:Polygon>  
        <gml:outerBoundaryIs> 
	<gml:LinearRing>   
          <gml:coordinates>119.89817,31.91181 119.81655,31.85485 119.95809,31.84721 119.89817,31.91181</gml:coordinates> 
    </gml:LinearRing> 
        </gml:outerBoundaryIs> 
 </gml:Polygon>		
    </Intersects>
</Filter>

报错如下:

      org.postgresql.util.PSQLException:错误: Operation on mixed SRID geometries

查阅得知需要修改postgis的SRID字段,因为当时导入数据的同事没有设置坐标系,所以无法搜索出数据。进入Postgis数据库,输入:

      select st_srid(points) from stats_khb_surface_features_info  //查询SRID
      update stats_khb_surface_features_info set points =st_geomfromtext(ST_AsText(points),4326)//修改为4326

完成上面步骤后。数据正常显示,终于可以查看某类数据某个区域下的显示效果:

以上!解决!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值