GeoServer WFS 多图层几何查询

GeoServer和WFS就不需要介绍了,直接进入正题。场景大概是这样的:用一次GetFeature请求,使用同样的几何条件,查询出指定多个图层符合要求的要素。GeoServer支持的几何图形和几何关系操作如下:

<fes:GeometryOperands>
<fes:GeometryOperand name="gml:Point"/>
<fes:GeometryOperand name="gml:MultiPoint"/>
<fes:GeometryOperand name="gml:LineString"/>
<fes:GeometryOperand name="gml:MultiLineString"/>
<fes:GeometryOperand name="gml:Curve"/>
<fes:GeometryOperand name="gml:MultiCurve"/>
<fes:GeometryOperand name="gml:Polygon"/>
<fes:GeometryOperand name="gml:MultiPolygon"/>
<fes:GeometryOperand name="gml:Surface"/>
<fes:GeometryOperand name="gml:MultiSurface"/>
<fes:GeometryOperand name="gml:MultiGeometry"/>
<fes:GeometryOperand name="gml:Box"/>
<fes:GeometryOperand name="gml:Envelope"/>
</fes:GeometryOperands>
<fes:SpatialOperators>
<fes:SpatialOperator name="BBOX"/>
<fes:SpatialOperator name="Equals"/>
<fes:SpatialOperator name="Disjoint"/>
<fes:SpatialOperator name="Intersects"/>
<fes:SpatialOperator name="Touches"/>
<fes:SpatialOperator name="Crosses"/>
<fes:SpatialOperator name="Within"/>
<fes:SpatialOperator name="Contains"/>
<fes:SpatialOperator name="Overlaps"/>
<fes:SpatialOperator name="Beyond"/>
<fes:SpatialOperator name="DWithin"/>
</fes:SpatialOperators>

以使用Envelope进行Intersects操作查询为例,构造的查询条件如下

<fes:Filter xmlns:fes="http://www.opengis.net/fes/2.0" xmlns:gml="http://www.opengis.net/gml/3.2">
<fes:Intersects>
<fes:ValueReference>map:geom</fes:ValueReference>
<gml:Envelope srsName="EPSG:4490">
<gml:lowerCorner>103.6458293767603 36.03833528028299</gml:lowerCorner>
<gml:upperCorner>103.64592937676031 36.038435280283</gml:upperCorner>
</gml:Envelope>
</fes:Intersects>
</fes:Filter>

注意这是WFS 2.0.0的写法,1.0.0和1.1.0是不同的。具体参考Filter functionsFilter Function Reference

根据2.0的参考手册,很容易就构造出了请求URL:
http://localhost:8080/geoserver/map/wfs?FILTER=<fes:Filter xmlns:fes=”http://www.opengis.net/fes/2.0" xmlns:gml=”http://www.opengis.net/gml/3.2">fes:Intersectsfes:ValueReferencemap:geom<gml:Envelope srsName=”EPSG:4490”>gml:lowerCorner103.6458293767603 36.03833528028299gml:upperCorner103.64592937676031 36.038435280283&TYPENAME=map:t_oil,map:t_fiber&REQUEST=GetFeature&OUTPUTFORMAT=application/json&VERSION=2.0.0&SERVICE=WFS(解码后的URL)

其中:

  1. TYPENAME表示我要查询的图层,这里一定要注意,不是TYPENAMES,是TYPENAME;TYPENAMES也是WFS GetFeature时会使用的参数,当使用多个图层的时候,眼看着使用TYPENAMES比使用TYPENAME合理,甚至在GeoServer的WFS reference中解释typeNames时专门还注明了在1.1.0或者更早的版本中使用typeName,然而,使用TYPENAMES查询多图层时会报错,查询单图层却时可用,我甚至怀疑这是GeoServer的一个BUG。
  2. FILTER是构造的查询条件,当然也支持属性查询,此处只讨论几何查询。
  3. 其他的都是WMS和WFS请求的常规参数了。
加载评论框需要翻墙