Skip to content

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.01.1.0
GetCapabilities支持支持
DescribeFeatureType支持(GML 3.2)支持(GML 3.1.1)
GetFeature支持支持
GetPropertyValue支持不支持(501)
ListStoredQueries、DescribeStoredQueries支持,只有 GetFeatureById不支持
Transaction、LockFeature、GetFeatureWithLock、CreateStoredQuery、DropStoredQuery501 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
BBOXminx,miny,maxx,maxy[,坐标系],轴序规则同 WMS:2.0.0 的 EPSG: 与 URN 写法按官方轴序,1.1.0 的 EPSG: 写法经度在前;不带坐标系时按服务坐标系
FILTER2.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输出坐标系,缺省为服务坐标系
RESULTTYPEresults(缺省)或 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.0GML 3.2(application/gml+xml; version=3.2)GeoJSON
1.1.0GML 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 的请求体直接拒绝(400 OperationParsingFailed),不加载任何外部实体与 schema。
  • 多个 wfs:Query 为 OperationParsingFailed(一次只能查询一个类型);Transaction、LockFeature 等为 501 OperationNotSupported。
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 MiB400
VersionNegotiationFailedACCEPTVERSIONS 中没有支持的版本400
NotFoundGetFeatureById 的要素不存在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 时每页都要排序整层,大文件逐页读取较慢。