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: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>&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請求的常規參數了。
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容