Appearance
WFS
平台在每个服务的 MapServer 之下提供只读的 WFS 1.1.0 / 2.0.0,2.0.0 达到 Basic WFS 等级(即席查询、GetPropertyValue、KVP 与 XML 两种请求编码、结果分页)。启用方式、API Key 与异常的通用规则见 OGC 服务概览。
地址与启用
- 地址:
https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/<服务路径>/MapServer/WFSServer - 能力文档:
…/WFSServer?service=WFS&request=GetCapabilities - 发布时勾选 WFS(不默认勾选),只对矢量图层提供。未启用时返回 404「服务未启用 WFS」。
- 请求方式:GET(KVP)、POST 表单,以及 POST XML 请求体(见 XML 请求体)。
开启前请确认
公开与「API Key」级别的服务开启 WFS 后,任何持有地址(或 Key)的客户端都可以分页导出整层要素。只给确实要对外提供原始数据的服务开启。
客户端示例
QGIS:图层 → 添加图层 → 添加 WFS / OGC API - Features 图层,新建连接,URL 填能力文档地址,版本选「自动检测」或 2.0。API Key 级别的服务在 URL 末尾加 &token=gb_xxx…。
ArcGIS Pro:插入 → 连接 → 新建 WFS 服务器,URL 填 …/WFSServer;API Key 级别的服务在「自定义参数」中加 token。
GDAL
bash
B='https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services'
# 列出要素类型、查看字段与要素数、按范围筛选
ogrinfo "WFS:$B/city-roads/MapServer/WFSServer"
ogrinfo -so -al "WFS:$B/city-roads/MapServer/WFSServer" gb:<类型名>
ogrinfo -al -q -spat 116.3 39.8 116.5 40.0 "WFS:$B/city-roads/MapServer/WFSServer" gb:<类型名>
# 导出为 GeoPackage
ogr2ogr -f GPKG roads.gpkg "WFS:$B/city-roads/MapServer/WFSServer" gb:<类型名>
# API Key 级别
ogrinfo "WFS:$B/city-roads/MapServer/WFSServer?token=gb_xxx…"curl
bash
curl 'https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/city-roads/MapServer/WFSServer?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=gb:<类型名>&COUNT=10&OUTPUTFORMAT=application/json'版本与操作
| 操作 | 2.0.0 | 1.1.0 |
|---|---|---|
| GetCapabilities | 支持 | 支持 |
| DescribeFeatureType | 支持(GML 3.2) | 支持(GML 3.1.1) |
| GetFeature | 支持 | 支持 |
| GetPropertyValue | 支持 | 不支持(501) |
| ListStoredQueries、DescribeStoredQueries | 支持,只有 GetFeatureById | 不支持 |
| Transaction、LockFeature、GetFeatureWithLock、CreateStoredQuery、DropStoredQuery | 501 OperationNotSupported | 同左 |
- GetCapabilities 先看
ACCEPTVERSIONS(取第一个支持的版本),再看VERSION,都没有时为 2.0.0。 - 其他操作的
VERSION只接受2.0.0、2.0.2、1.1.0,缺省为 2.0.0。
要素类型与字段
- 类型名为
gb:<名称>(见名称规则),只列矢量图层。 - 能力文档的默认坐标系为服务坐标系,另列 4326、3857、4490。
- 字段:只列图层「输出字段」中的字段(未设置时列出全部)。未列出的字段在过滤、排序与
PROPERTYNAME中一律按「属性不存在」处理。 - 几何属性统一名为
geometry。单线、单面在 GML 中升为MultiCurve、MultiSurface;GeometryCollection不能编码为 GML,该要素的几何省略(GeoJSON 照常输出)。
GetFeature 参数
| 参数 | 规则 |
|---|---|
TYPENAMES(1.1.0 为 TYPENAME,两个版本都认) | 一次只能一个类型;前缀可以不写,本地名区分大小写 |
COUNT(或 MAXFEATURES) | 缺省与上限都是图层的最大要素数(未设置时 1000) |
STARTINDEX | 从 0 开始,最大 1,000,000 |
BBOX | minx,miny,maxx,maxy[,坐标系],轴序规则同 WMS:2.0.0 的 EPSG: 与 URN 写法按官方轴序,1.1.0 的 EPSG: 写法经度在前;不带坐标系时按服务坐标系 |
FILTER | 2.0.0 为 FES 2.0,1.1.0 为 Filter 1.1;最长 64 KiB |
CQL_FILTER | 扩展,ECQL 语法;最长 64 KiB |
RESOURCEID(1.1.0 为 FEATUREID) | 逗号分隔的 <类型名>.<要素 ID> |
PROPERTYNAME | 逗号分隔的字段名;几何总会输出 |
SORTBY | 字段[ ASC|DESC],逗号分隔 |
SRSNAME | 输出坐标系,缺省为服务坐标系 |
RESULTTYPE | results(缺省)或 hits(只计数) |
OUTPUTFORMAT | 见输出格式 |
BBOX、FILTER、RESOURCEID、CQL_FILTER只能出现一个,例外是CQL_FILTER可以与BBOX同时使用。- 请求条件与服务发布时设置的基础查询条件取交集,基础查询之外的要素与不存在的要素表现相同。
- 2.0.0 的
FILTER中不写srsName的几何,按服务坐标系及其官方轴序解读(地理坐标系纬度在前);1.1.0 按经度在前。
过滤条件
- 属性名只能是类型中列出的字段或
geometry;字段名经过改名的,用改名后的名称。 - 不支持函数:出现任何函数都返回 400「过滤条件不支持函数」。
- 逻辑运算嵌套不超过 32 层;条件合计不超过 500 个(CQL 的
IN (…)每个值算一个条件)。 - 含
<!DOCTYPE的FILTER直接拒绝,xsi:schemaLocation被忽略。 - CQL 中带
SRID=n;的几何与BBOX(…,'EPSG:n')一律按经度在前解读。中文字段名在 CQL 中可以不加引号;关键字紧贴中文(如名称AND)时请加空格。 - 时间运算(只在 2.0.0 的 FES 2.0):
After、Before、During、TEquals,作用于日期时间字段,字面量为gml:TimeInstant或gml:TimePeriod;时刻不带时区时按服务器本地时间。
xml
<fes:Filter xmlns:fes="http://www.opengis.net/fes/2.0" xmlns:gml="http://www.opengis.net/gml/3.2">
<fes:During><fes:ValueReference>建成日期</fes:ValueReference>
<gml:TimePeriod gml:id="p"><gml:beginPosition>2024-01-01T00:00:00</gml:beginPosition>
<gml:endPosition>2024-12-31T00:00:00</gml:endPosition></gml:TimePeriod>
</fes:During>
</fes:Filter>分页
- 每页上限为图层的最大要素数(未设置时 1000)。
- 2.0.0 有下一页时,GML 的
wfs:FeatureCollection带next属性,GeoJSON 带rel="next"的链接;链接保留请求的其他参数与token。1.1.0 没有next,请按STARTINDEX自行翻页。 STARTINDEX超过总数时返回空集合。STARTINDEX最大 1,000,000,再往后不再给出next;更深的数据请用BBOX、CQL_FILTER分段读取。RESULTTYPE=hits时numberMatched为实际总数;返回要素时为unknown。- 有主键的数据库表按主键排序,翻页稳定;文件类数据源按文件顺序;没有主键的数据库表或 SQL 视图翻页可能重复或遗漏,请加
SORTBY。
输出格式
| 版本 | 默认 | 也支持 |
|---|---|---|
| 2.0.0 | GML 3.2(application/gml+xml; version=3.2) | GeoJSON |
| 1.1.0 | GML 3.1.1(text/xml; subtype=gml/3.1.1) | GeoJSON |
- GeoJSON 可写
application/json、json、geojson、application/geo+json;坐标一律经度在前,输出坐标系不是 4326 时带crs成员。 - GML 的
gml:id与 GeoJSON 的id为<类型名>.<要素 ID>,要素 ID 与 FeatureServer 的要素 ID 相同。GML 坐标按srsName的轴序书写(2.0.0 输出 4326 时纬度在前)。
GetFeatureById
…/WFSServer?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature
&STOREDQUERY_ID=urn:ogc:def:query:OGC-WFS::GetFeatureById&ID=<类型名>.<要素 ID>返回单个要素(不包在集合里);不存在时返回 404 NotFound。
GetPropertyValue
只取某个属性(或几何)的值,2.0.0 支持:
…/WFSServer?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetPropertyValue&TYPENAMES=gb:<类型名>
&VALUEREFERENCE=名称&CQL_FILTER=等级>2&SORTBY=等级 DESC&COUNT=10- 查询参数与 GetFeature 相同:类型、
FILTER、RESOURCEID、BBOX、CQL_FILTER、SORTBY、COUNT、STARTINDEX(有下一页时给next)、SRSNAME、RESULTTYPE。 VALUEREFERENCE(必填):类型中的字段名或geometry。不支持 XPath 表达式。- 输出
wfs:ValueCollection(GML 3.2):每个要素一个wfs:member,属性为文本值(值为空的要素不出成员),几何为 GML 几何。 - 不支持
RESOLVE(只接受none)、存储查询与 GML 以外的输出格式。
XML 请求体
POST …/WFSServer,Content-Type: text/xml 或 application/xml,请求体为 WFS 2.0 或 1.1.0 的请求文档。QGIS、ArcGIS Pro 等用 POST 发送复杂过滤条件时就是这种方式。
- 支持
GetCapabilities、DescribeFeatureType、GetFeature(一个wfs:Query或一个wfs:StoredQuery)、GetPropertyValue、ListStoredQueries、DescribeStoredQueries;属性count(1.1.0 为maxFeatures)、startIndex、resultType、outputFormat同 KVP。 - 过滤条件的限制(64 KiB、嵌套、条件数、不支持函数)与输出同 KVP。API Key 放在地址的查询参数或请求头中。
- 请求体最大 1 MiB;含
<!DOCTYPE的请求体直接拒绝(400OperationParsingFailed),不加载任何外部实体与 schema。 - 多个
wfs:Query为OperationParsingFailed(一次只能查询一个类型);Transaction、LockFeature等为 501OperationNotSupported。
bash
curl -H 'Content-Type: text/xml' --data-binary @- \
'https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/city-roads/MapServer/WFSServer' <<'XML'
<wfs:GetFeature service="WFS" version="2.0.0" count="10" outputFormat="application/json"
xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:fes="http://www.opengis.net/fes/2.0">
<wfs:Query typeNames="gb:<类型名>">
<fes:Filter><fes:PropertyIsEqualTo>
<fes:ValueReference>等级</fes:ValueReference><fes:Literal>1</fes:Literal>
</fes:PropertyIsEqualTo></fes:Filter>
</wfs:Query>
</wfs:GetFeature>
XML异常
2.0.0 为 OWS 1.1 的 ExceptionReport,1.1.0 为 OWS 1.0,内容类型 text/xml。
| 代码 | 典型情形 | 状态 |
|---|---|---|
MissingParameterValue | 缺少必填参数 | 400 |
InvalidParameterValue | 参数值不合法、版本不支持、类型或属性不存在、输出格式不支持 | 400 |
OperationParsingFailed | 多个类型、过滤条件互斥、过滤条件无法解析、嵌套过深或条件过多;XML 请求体无法解析、含 DOCTYPE、超过 1 MiB | 400 |
VersionNegotiationFailed | ACCEPTVERSIONS 中没有支持的版本 | 400 |
NotFound | GetFeatureById 的要素不存在 | 404 |
OperationNotSupported | 不支持的操作(事务、锁等) | 501 |
NoApplicableCode | 服务繁忙、超时、数据源不可用 | 503(带 Retry-After: 5) |
NoApplicableCode | 其他内部错误 | 500 |
已知限制
- 不支持 WFS-T(事务)、锁、存储查询的创建与删除。
- 一次查询只能一个要素类型。
- 时间过滤只有 After、Before、During、TEquals;GetPropertyValue 不支持
resolve与 XPath。 - 1.1.0 宽松接受不写命名空间的老式
FILTER,2.0.0 不接受。 - 文件类数据源(如 Shapefile)中带空格的字段名,按该字段过滤可能选不中要素。
RESULTTYPE=hits对大表执行计数,只受请求超时限制(超时为 503);GDAL 打开图层时会发这种请求。- 文件类数据源深页翻页需要从头读到起点,带
SORTBY时每页都要排序整层,大文件逐页读取较慢。