# GeoServer中使用WFS进行条件查询
# 介绍
OGCWebFeatureService(WFS)接口标准定义了一组接口,用于在Internet上访问要素和要素属性级别的地理信息。特征是对现实世界现象的抽象,也就是说,它代表了世界上可以找到的任何事物。地理要素的属性或特征称为要素特性。WFS提供了检索或查询地理要素的方法,这种方法独立于它们发布的底层数据存储。如果WFS被授权这样做,该服务还可以更新或删除地理特征。WFS的实例还能够存储查询,以便使客户机应用程序能够在稍后的时间点检索或执行查询。
# 使用
WFS标准通过高度可配置的界面提供地理要素数据。默认情况下,WFS返回的数据使用地理标记语言(GML),GML是作为可扩展标记语言(XML)编写的。不过,该标准的新版本也将支持JavaScript对象表示法(JSON)。政府机构、私人组织和学术机构使用本标准发布矢量地理空间数据集,以便于接收机构编制新地图或对所提供数据进行分析。
WFS提供了一个标准接口,用于请求由地理要素及其特性组成的矢量地理空间数据。这样做的好处是,WFS客户端可以从多个WFS服务器请求源数据,然后呈现数据以便在客户端上显示,或者作为工作流的一部分进一步处理数据。该标准保证可以与其他数据一致地访问数据。还可以一致地访问使用常见数据类型(如文本字符串、日期和时间)编码的特征属性。
# 支持的数据格式
支持CSV、GML2、GML3.1、GML3.2、GeoJSON、KML、Shapefile、text/csv等格式的数据

# 查询
这里我使用一个矢量数据来演示效果,接下来的返回数据主要是geojson格式

如图所示可以看到GeoServer对于矢量数据WFS的支持很好,格式如下:
GSV、GML2、GML3.1、GML3.2、GeoJSON、KML、Shapefile、text/csv

点击GeoJSON会返回所有的数据(JSON格式),如图所示:

# 直接查询
WFS是支持条件查询的,在查询条件不是很复杂的时候,可以使用WFS来进行简单的查询。
WFS支持CQL查询语句,类似于关系型数据的SQL语句。
简单的查询示例:
http://localhost:8080/geoserver/tiger/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=tiger%3Apoly_landmarks&maxFeatures=50&outputFormat=application%2Fjson
放到postman中可以看到查询条件如下:

- service=WFS(指定服务的类型)
- version=1.00(指定服务版本)
- typeName=图层名(GeoServer中工作区+名称)
- request=GetFeature(指定为获取数据方式)
- maxFeatures=50(指定最大返回数量)
- outputFormat(返回数据类型)
返回数据格式如下:

# 条件查询(cql_filter)
# 等值查询
根据单个属性来查询数据,查询出符合改字段值的所有对象
http://localhost:8080/geoserver/wuxi/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=wuxi%3A%E6%97%A0%E9%94%A1%E5%B8%82%E9%94%A1%E5%B1%B1%E5%8C%BA%E8%A7%A3%E8%AF%91%E7%9F%A2%E9%87%8F_%E6%89%A7%E6%B3%95%E5%9B%BE%E6%96%91_5%E6%9C%88-6%E6%9C%88&maxFeatures=50&outputFormat=application%2Fjson&cql_filter="TBLX"=11
- cql_filter(查询条件)
这里是查询TBLX为11的数据,可以看到返回的数据格式下:

# 模糊查询
有时候我们需要对熟悉模糊查询,这里我举个例子:我在地图上要加载南京市下所有的区县边界数据,但我的图层是全江苏省的区县,我需要只取出南京所属的数据即可,这里就可以使用模糊查询。我们以南京的行政区划代码进行模糊查询(3201),6位的区县代码前4位都是市级代码。
http://localhost:8080/geoserver/division/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=division%3Acounty_line&maxFeatures=50&outputFormat=application%2Fjson&cql_filter=%22pac%22+like+%27%253201%25%27
添加条件:&cql_filter=%22pac%22+like+%27%253201%25%27
我们就拿到了南京下所属的区县边界数据了

# 多条件查询
cql_filter进行多条件查询就和使用SQL查询很像
http://localhost:8080/geoserver/jinhu/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=jinhu%3Asd_bhtb_2022_overlap&maxFeatures=50&outputFormat=application%2Fjson&cql_filter=%22bz%22+%3D+%27%E6%BB%A9%E6%B6%82%E6%9E%97%E5%9C%B0%27+or+%22bz%22+%3D+%27%E6%BB%A9%E6%B6%82%E8%8D%89%E5%9C%B0%27+or+%22bz%22+%3D+%27%E6%B2%B3%E9%81%93%E8%80%95%E5%9C%B0%27

geoserver发布数据时也是可以使用cql进行条件查询的,如下所示

# 指定坐标系查询
我们在发布矢量数据的时候,坐标系可能各种各样,但我们地图中需要的是指定坐标系比如WGS84经纬度坐标(4326),这个时候就需要指定坐标系来返回数据。
我们看一下默认坐标系数据请求结构

http://localhost:8080/geoserver/changshu/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=changshu%3A2021_2_JC_FLHJCSJ&maxFeatures=50&outputFormat=application%2Fjson
返回数据结构如下图:

我们最终需要的是4326坐标系的数据,我们修改一下wfs请求如下:
http://localhost:8080/geoserver/changshu/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=changshu%3A2021_2_JC_FLHJCSJ&maxFeatures=50&outputFormat=application%2Fjson&srsname=EPSG:4326
添加:&srsname=EPSG:4326,指定坐标系

# 指定范围查询
我们也可以指定范围返回数据
原始数据请求,有4441行数据
http://localhost:8080/geoserver/changshu/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=changshu%3A2021_2_JC_FNHJCSJ&maxFeatures=50&outputFormat=application%2Fjson

添加范围条件后,查询出2683行数据
http://localhost:8080/geoserver/changshu/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=changshu%3A2021_2_JC_FNHJCSJ&maxFeatures=50&outputFormat=application%2Fjson&BBOX=40590235.65602544%2C3505954.1021578796%2C40592068.091087505%2C3507395.235982733
添加条件:&BBOX=40590235.65602544%2C3505954.1021578796%2C40592068.091087505%2C3507395.235982733
