ol遇见OGC系列——WFS

一、WFS的概念

Web Feature Service(网络要素服务),简称WFS。支持对OpenGIS简单要素的数据编辑操作(插入,更新,删除,检索),实现服务器端和客户端之间的要素交互
主要有GetCapabilities,DescribeFeatureType、GetFeature服务操作:

  1. GetCapabilities:获取用于查询WFS服务的相关信息,包括支持的操作、支持的格式、空间坐标、包含的资源等。它主要的目的是使客户端在使用GetFeature请求前可以对WFS服务有一个基本的了解,从而可以设置正确的参数。
  2. DescribeFeatureType:生成一个 Schema 描述,该 Schema 描述了 WFS 服务提供的要素类型(Feature Type),以及要素类型的结构信息。该 Schema 还定义了 WFS 服务所期望的要素实例在输入时如何编码以及输出时如何生成要素实例。
  3. GetFeature:获取要素信息,通过GetFeature操作可以由指定的属性条件、空间条件或者两者叠加的条件进行空间查询。

下面以geoserve自带的地图服务以例
1、GetCapabilities 获取地图服务的相关信息
http://localhost:8088/geoserver/sf/wfs?service=WfS&request=GetCapabilities ,
截取文档中部分信息
ol遇见OGC系列——WFS_第1张图片ol遇见OGC系列——WFS_第2张图片
2、DescribeFeatureType 查看地图服务的空间信息和属性信息字段
http://localhost:8088/geoserver/sf/wfs?service=WfS&request=DescribeFeatureType
下载了一个文件geoserver-DescribeFeatureType.application,
ol遇见OGC系列——WFS_第3张图片3、GetFeature 获取要素信息,以geojson的格式输出
http://localhost:8088/geoserver/sf/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sf:roads&maxFeatures=50&outputFormat=application%2Fjson
ol遇见OGC系列——WFS_第4张图片

网上有很多讲解这些方式的参数设置,我在这就不一一列举出来,附上一个链接
WFS服务接口说明

二、WFS 的getFeature的详细说明

一。参数列表

参数名称 是否必须 默认值 举例 含义
VERSION 1.1.0 version=1.1.0或version=1.0.0 版本号
SERVICE WFS WFS 服务名称
REQUEST=GetFeature 请求操作(固定值)
TYPENAME 图层名称
OUTPUTFORMAT application/json 输出类型
BBOX BBOX=110,25,120,30,EPSG:4326 矩形范围(左下角X坐标,左下角Y坐标,右上角X坐标,右上角Y坐标,EPSG:4326)
FILTER 下一节详细说明 过滤条件,gml格式定义空间范围,可包含属性条件。Filter是一种符合OGC规范的语言,一种XML实现的语言。SLD用它来实现复杂的Rule选择。WFS在所有需要定位操作对象的地方都会使用Filter。Filter的作用是构建一个表达式,返回值就是Feature的集合。
SORTBY 排序字段
MAXFEATURES 最多返回结果个数
PROPERTYNAME 字段名称,逗号隔开
SRSNAME 投影方式名称
EXPIRY 排除

二、FILTER 详解
Filter定义了三种操作符:地理操作符(Spatial operators),比较操作符(Comparison operators)和逻辑操作符(Logical operators)。
Spatial operators定义了地理属性的操作方式,(连接为空间操作,可以看我的另一篇博客)有:Equals,Disjoint,Touches,Within,Overlaps,Crosses,Intersects,Contains,DWithin,Beyond,BBOX。
Comparison operators定义了标量属性的操作方式,他们有:PropertyIsEqualTo,PropertyIsNotEqualTo,PropertyIsLessThan,PropertyIsGreaterThan,PropertyIsLessThanOrEq,PropertyIsGreaterThanO,PropertyIsLike,PropertyIsNull,PropertyIsBetween。
Logical operators逻辑操作符,定义了组合这些操作的方式,他们有:And,Or,Not。
举例:构建一个表达式,人口在一千万以上,并且在指定的空间范围内的城市。


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

三、基于openlayer的实现

import { intersects} from 'ol/format/filter.js';
import { WFS,GeoJSON} from 'ol/format.js';

		// generate a GetFeature request
       let featureRequest = new WFS().writeGetFeature({
	       //featureNS:region.WFS,
	       srsName: "EPSG:4490",
	       featureTypes: ["city"], // city 为图层名
	       outputFormat: 'application/json',
	       filter: intersects(region.matchGeometryName, point)
       });

       response = await fetch(wfsUrl, {
         method: 'POST',
         body: new XMLSerializer().serializeToString(featureRequest)
       })
       
 	  let data = await response.json();
      let features = data.features;
      let olfeatures = new GeoJSON().readFeatures(features);

补充:arcgis server发布的地图服务,点操作的请求


import { EsriJSON } from 'ol/format.js';
		let geometryStr = "{'spatialReference':{'wkid':'4490'},'x':" + center[0] + ",'y':" + center[1] + "}";
        let params = {
        "f": "json",
        "geometry": geometryStr,
        "geometryType": "esriGeometryPoint",
        "spatialRel": "esriSpatialRelIntersects",
        "returnGeometry": "true",
        "outFields": "*"
        };

        let url = wfsUrl + "/" + "0"+ "/query"; // "0"图层的索引
        url = appendParams(url, params);
        response = await fetch(url);
        let data = await response.json();
      	let features = data.features;
      	let olfeatures = new EsriJSON().readFeatures(features);

下一步
1、整理arcgsi 的线、面等空间查询的方式
2、整理ogc的wms、wmts等其他系列

断断续续地写了很久,后续还是要坚持写下去。

你可能感兴趣的:(OpenLayers)