一、WFS 核心概念
WFS 是 OGC 制定的矢量数据服务标准,提供地理要素的增删改查能力。区别于 WMS(地图服务),WFS 直接操作地理要素(点、线、面)而非渲染图片。
关键特性:
- 要素级操作:支持精确查询和编辑单个地理要素
- 多格式支持:GML、GeoJSON、CSV、KML 等输出格式
-
事务支持:通过
Transaction
操作实现数据编辑 - 复杂查询:支持空间关系、属性过滤、函数计算
关键能力
1. 支持的 WFS 版本
-
2.0.0
、1.1.0
、1.0.0
- 获取服务元数据
http://localhost:8086/geoserver/lzugis/wfs?service=WFS&acceptversions=2.0.0&request=GetCapabilities
2. 核心操作与参数
-
GetFeature
(数据查询)-
输出格式:支持
application/json
、text/csv
、GML
、KML
、SHAPE-ZIP
等。 -
分页约束:默认返回上限
1000000
条记录(CountDefault=1000000
)。 -
示例请求(GeoJSON 格式):
http://localhost:8086/geoserver/lzugis/wfs?service=WFS&version=2.0.0&request=GetFeature&typeNames=lzugis:base_province&outputFormat=application/json
-
输出格式:支持
-
Transaction
(数据编辑)- 支持
Insert
/Update
/Delete
操作。 - 输入格式:
application/gml+xml; version=3.2
。 -
示例 XML 请求(插入新要素):
<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:lzugis="https://lzugis.cn"> <wfs:Insert> <lzugis:buildings> <lzugis:name>New Building</lzugis:name> <lzugis:geom> <gml:Polygon srsName="EPSG:4326"> <gml:exterior> <gml:LinearRing> <gml:posList>10.0 20.0 11.0 20.0 11.0 21.0 10.0 21.0 10.0 20.0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:Polygon> </lzugis:geom> </lzugis:buildings> </wfs:Insert> </wfs:Transaction>
- 支持
3. 空间查询能力
-
空间运算符:
Intersects
、Within
、Disjoint
、BBOX
(边界框查询)等。 -
几何类型:
支持Point
、LineString
、Polygon
、MultiPolygon
等。 -
示例(查询与某区域相交的要素):
http://localhost:8086/geoserver/lzugis/wfs?request=GetFeature&typeNames=lzugis:base_province&CQL_FILTER=INTERSECTS(the_geom, POLYGON((10 20, 15 20, 15 25, 10 25, 10 20)))&outputFormat=application/json
4. 属性查询能力
-
比较运算符:
PropertyIsEqualTo
、PropertyIsLike
(模糊匹配)、PropertyIsNull
等。 -
示例(名称包含 "Park" 的要素):
http://localhost:8086/geoserver/lzugis/wfs?request=GetFeature&typeNames=lzugis:base_province&CQL_FILTER=NAME LIKE '%广%'&outputFormat=application/json
5. 函数支持
文档中列出 200+ 函数,涵盖几何、数学、字符串、栅格处理等:
-
几何函数:
buffer()
、centroid()
、area()
。 -
栅格函数:
Contour()
(生成等值线)、CropCoverage()
(裁剪栅格)。 - 示例(计算要素面积):
# 返回名称和面积
http://localhost:8086/geoserver/lzugis/wfs?request=GetFeature&typeNames=lzugis:base_province& PROPERTYNAME=NAME,area(the_geom)&outputFormat=application/json
二、WFS 核心接口详解
1. 元数据接口
接口名称 | 描述 | 示例请求 |
---|---|---|
GetCapabilities | 获取服务能力文档 | http://localhost:8086/geoserver/lzugis/wfs?service=WFS&acceptversions=2.0.0&request=GetCapabilities |
DescribeFeatureType | 获取要素结构定义 | http://localhost:8086/geoserver/lzugis/wfs?request=DescribeFeatureType&typeNames=lzugis:base_province |
2. 数据查询接口
接口名称 | 描述 | 关键参数 |
---|---|---|
GetFeature | 获取要素数据 |
typeNames (图层名), outputFormat , CQL_FILTER , PROPERTYNAME
|
GetPropertyValue | 获取特定属性值 |
valueReference (属性名), resolve (引用解析) |
3. 数据编辑接口
接口名称 | 描述 | 操作类型 |
---|---|---|
Transaction | 要素增删改 |
<wfs:Insert> , <wfs:Update> , <wfs:Delete>
|
LockFeature | 锁定要素防并发冲突 |
releaseAction (ALL/SOME) |
4. 存储查询接口
接口名称 | 描述 |
---|---|
CreateStoredQuery | 创建预定义查询 |
ListStoredQueries | 列出所有存储查询 |
DescribeStoredQueries | 获取存储查询详情 |
三、WFS 使用场景与示例
场景 1:基础数据查询
获取 GeoJSON 格式的道路数据
http://localhost:8086/geoserver/lzugis/wfs?service=WFS&version=2.0.0&request=GetFeature&typeNames=lzugis:base_province&outputFormat=application/json
场景 2:空间关系查询
查询与特定区域相交的数据
http://localhost:8086/geoserver/lzugis/wfs?request=GetFeature&typeNames=lzugis:base_province&CQL_FILTER=INTERSECTS(the_geom, POLYGON((10 20, 15 20, 15 25, 10 25, 10 20)))&outputFormat=application/json
场景 3:属性过滤查询
查询人口大于 100 万的城市
http://localhost:8086/geoserver/lzugis/wfs?request=GetFeature&typeNames=lzugis:base_province&CQL_FILTER=count > 5&outputFormat=application/json
场景 4:数据编辑事务
插入新道路要素 (XML 请求)
<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs/2.0"
xmlns:lzugis="https://lzugis.cn">
<wfs:Insert>
<lzugis:roads>
<lzugis:name>New Highway</lzugis:name>
<lzugis:geom>
<gml:LineString srsName="EPSG:4326">
<gml:posList>102.0 2.0 103.0 3.0</gml:posList>
</gml:LineString>
</lzugis:geom>
</lzugis:roads>
</wfs:Insert>
</wfs:Transaction>
通过合理利用 WFS 的强大功能,可构建从简单数据展示到复杂地理分析的全栈空间应用。GeoServer 的完整函数支持(如
Heatmap
、BarnesSurface
等)使其成为专业地理分析的理想平台。