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 ,
截取文檔中部分信息
在這裏插入圖片描述在這裏插入圖片描述
2、DescribeFeatureType 查看地圖服務的空間信息和屬性信息字段
http://localhost:8088/geoserver/sf/wfs?service=WfS&request=DescribeFeatureType
下載了一個文件geoserver-DescribeFeatureType.application,
在這裏插入圖片描述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
在這裏插入圖片描述

網上有很多講解這些方式的參數設置,我在這就不一一列舉出來,附上一個鏈接
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>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>

三、基於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等其他系列

斷斷續續地寫了很久,後續還是要堅持寫下去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章