基于openlayers6的基本地图操作--6. 拉框查询

2020-02-14  本文已影响0人  初见_JS
  • 查询功能,参考官网示例:WFSWFS - GetFeature,前者通过extent获取内容,后者通过filter获取。
  • 拉框,利用Draw组件绘制Box实现

WFS实现

import GeoJSON from 'ol/format/GeoJSON';
import {bbox as bboxStrategy} from 'ol/loadingstrategy';
import VectorSource from 'ol/source/Vector';
import {Stroke, Style} from 'ol/style';
  /**主要参数设置**/
  var pGeoserverPort = 'https://ahocevar.com/';
  var pTypeName = 'osm:water_areas'; //命名空间:图层名
  var pSrsName = 'EPSG:3857'; //坐标系

  queryByDraw(fea) {
    return new Promise((resolve, reject) => {
      var queryUrl = pGeoserverPort  + 'geoserver/wfs?' +
        'version=1.1.0&request=GetFeature&typename=' + pTypeName  +
        '&srsname=' + pSrsName  + '&' +
        'bbox=' + fea.getGeometry().getExtent().join(',') + ',' + pSrsName  + '&outputFormat=application/json';
      //服务查询
      axios({
        url: queryUrl
      }).then((res) => {
        this.queryInfo = res.data.features;
        resolve(res.data.features);
      });
    });
  },

WFS - GetFeature实现

import {
  equalTo as equalToFilter,
  intersects
} from 'ol/format/filter';
import {WFS, GeoJSON} from 'ol/format';
//创建属性过滤器 可以过滤字段 添加%%可以模糊查询
var fieldFilter = equalToFilter('字段名', '字段值');
//创建空间过滤器 可以查询特定区域下的数据 即拉框查询
 var areaFilter =  intersects(
     geometryName,
     geometry
  );
// generate a GetFeature request
var featureRequest = new WFS().writeGetFeature({
  srsName: 'EPSG:3857',
  featureNS: 'http://openstreemap.org',
  featurePrefix: 'osm',
  featureTypes: ['water_areas'],
  outputFormat: 'application/json',
  filter: areaFilter
});

// then post the request and add the received features to a layer
fetch(pGeoserverPort +'geoserver/wfs', {
  method: 'POST',
  body: new XMLSerializer().serializeToString(featureRequest)
}).then(function(response) {
  return response.json();
}).then(function(json) {
  var features = new GeoJSON().readFeatures(json);
  vectorSource.addFeatures(features);
  map.getView().fit(vectorSource.getExtent());
});
  • featureNS:必须为创建工作区时的命名空间URI
  • featurePrefix: 命名空间即工作区的名称
  • featureTypes: 查询图层名称
  • intersects中的参数geometryName不能任意填写,而是必须填写WFS相关数据源中空间属性字段名称,即数据源geometry类型对应的字段

封装SpaceQuery.js

import {
    intersects
} from 'ol/format/filter';
import { WFS, GeoJSON } from 'ol/format';
import axios from 'axios'
export default {
    typeName: 'cite:point',//工作区:图层名
    srsname: 'EPSG:4326',//坐标系
    featureNS: 'http://www.opengeospatial.net/cite',//命名空间URI
    featurePrefix: 'cite',//工作区
    featureTypes: 'point',//图层名
    geometryName: 'the_geom',
    queryByDraw(fea) {
        /**主要参数设置**/
        var pTypeName = this.typeName;
        var pSrsName = this.srsname;
        return new Promise((resolve) => {
            var queryUrl = '/geoserver/wfs?' +
                'version=1.1.0&request=GetFeature&typename=' + pTypeName +
                '&srsname=' + pSrsName + '&' +
                'bbox=' + fea.getGeometry().getExtent().join(',') + ',' + pSrsName + '&outputFormat=application/json';
            //服务查询
            axios({
                url: queryUrl
            }).then((res) => {
                resolve(res.data.features);
            });
        });
    },
    queryByWFSFeature(geometry) {
        //创建空间过滤器 可以查询特定区域下的数据 即拉框查询
        var areaFilter = intersects(
            this.geometryName,
            geometry
        );
        // generate a GetFeature request
        var featureRequest = new WFS().writeGetFeature({
            srsName: this.srsname,
            featureNS: this.featureNS,
            featurePrefix: this.featurePrefix,
            featureTypes: [this.featureTypes],
            outputFormat: 'application/json',
            filter: areaFilter
        });

        // then post the request and add the received features to a layer
        return new Promise(resolve => {
            fetch('/geoserver/wfs', {
                method: 'POST',
                body: new XMLSerializer().serializeToString(featureRequest)
            }).then(function (response) {
                return response.json();
            }).then(function (json) {
                var features = new GeoJSON().readFeatures(json);
                resolve(features);
            });
        })

    }
}

使用

import Query from "@/views/js/SpaceQuery";
Draw.addInteraction("Box", feature => {
    Query.queryByDraw(feature).then(res => {
          Draw.removeFeature();
          //查询到的结果res
          console.log(res);
     });
     //Query.queryByWFSFeature(feature.getGeometry());
 });
Draw.stop();

SpaceQuery.jsqueryByDrawqueryByWFSFeature都可以实现拉框查询,两种方法都可以用

   devServer: {
        open: false,
        host: '0.0.0.0',
        port: 8080,
        https: false,
        hotOnly: false,
        proxy: {
            '/geoserver': {
                target: 'http://192.168.0.106:8080/geoserver', //设置你调用的接口域名和端口号 别忘了加http
                changeOrigin: true,
                pathRewrite: {
                    '^/geoserver': '/'
                }
            }
        },
        before: app => { }
    }
上一篇 下一篇

猜你喜欢

热点阅读