GeoServer和WFS就不需要介紹了,直接進(jìn)入正題。場(chǎng)景大概是這樣的:用一次GetFeature請(qǐng)求掂恕,使用同樣的幾何條件,查詢出指定多個(gè)圖層符合要求的要素弛槐。GeoServer支持的幾何圖形和幾何關(guān)系操作如下:
<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進(jìn)行Intersects操作查詢?yōu)槔猛觯瑯?gòu)造的查詢條件如下
<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 functions和Filter Function Reference
根據(jù)2.0的參考手冊(cè)店枣,很容易就構(gòu)造出了請(qǐng)求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)
其中:
- TYPENAME表示我要查詢的圖層,這里一定要注意鸯两,不是TYPENAMES,是TYPENAME长豁;TYPENAMES也是WFS GetFeature時(shí)會(huì)使用的參數(shù)钧唐,當(dāng)使用多個(gè)圖層的時(shí)候,眼看著使用TYPENAMES比使用TYPENAME合理匠襟,甚至在GeoServer的WFS reference中解釋typeNames時(shí)專門還注明了在1.1.0或者更早的版本中使用typeName钝侠,然而,使用TYPENAMES查詢多圖層時(shí)會(huì)報(bào)錯(cuò)酸舍,查詢單圖層卻時(shí)可用帅韧,我甚至懷疑這是GeoServer的一個(gè)BUG。
- FILTER是構(gòu)造的查詢條件啃勉,當(dāng)然也支持屬性查詢忽舟,此處只討論幾何查詢。
- 其他的都是WMS和WFS請(qǐng)求的常規(guī)參數(shù)了。