一、WFS的概念
Web Feature Service(網絡要素服務),簡稱WFS。支持對OpenGIS簡單要素的數據編輯操作(插入,更新,刪除,檢索),實現服務器端和客戶端之間的要素交互。
主要有GetCapabilities,DescribeFeatureType、GetFeature服務操作:
- GetCapabilities:獲取用於查詢WFS服務的相關信息,包括支持的操作、支持的格式、空間座標、包含的資源等。它主要的目的是使客戶端在使用GetFeature請求前可以對WFS服務有一個基本的瞭解,從而可以設置正確的參數。
- DescribeFeatureType:生成一個 Schema 描述,該 Schema 描述了 WFS 服務提供的要素類型(Feature Type),以及要素類型的結構信息。該 Schema 還定義了 WFS 服務所期望的要素實例在輸入時如何編碼以及輸出時如何生成要素實例。
- 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等其他系列
斷斷續續地寫了很久,後續還是要堅持寫下去。