# GeoServer中使用WFS进行条件查询

# 介绍

OGCWebFeatureService(WFS)接口标准定义了一组接口,用于在Internet上访问要素和要素属性级别的地理信息。特征是对现实世界现象的抽象,也就是说,它代表了世界上可以找到的任何事物。地理要素的属性或特征称为要素特性。WFS提供了检索或查询地理要素的方法,这种方法独立于它们发布的底层数据存储。如果WFS被授权这样做,该服务还可以更新或删除地理特征。WFS的实例还能够存储查询,以便使客户机应用程序能够在稍后的时间点检索或执行查询。

# 使用

WFS标准通过高度可配置的界面提供地理要素数据。默认情况下,WFS返回的数据使用地理标记语言(GML),GML是作为可扩展标记语言(XML)编写的。不过,该标准的新版本也将支持JavaScript对象表示法(JSON)。政府机构、私人组织和学术机构使用本标准发布矢量地理空间数据集,以便于接收机构编制新地图或对所提供数据进行分析。

WFS提供了一个标准接口,用于请求由地理要素及其特性组成的矢量地理空间数据。这样做的好处是,WFS客户端可以从多个WFS服务器请求源数据,然后呈现数据以便在客户端上显示,或者作为工作流的一部分进一步处理数据。该标准保证可以与其他数据一致地访问数据。还可以一致地访问使用常见数据类型(如文本字符串、日期和时间)编码的特征属性。

借鉴官方文档 (opens new window)

# 支持的数据格式

支持CSV、GML2、GML3.1、GML3.2、GeoJSON、KML、Shapefile、text/csv等格式的数据

image-20220617003346989

# 查询

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

image-20220316224033332

如图所示可以看到GeoServer对于矢量数据WFS的支持很好,格式如下:

GSV、GML2、GML3.1、GML3.2、GeoJSON、KML、Shapefile、text/csv

image-20220316224154144

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

image-20220316224654383

# 直接查询

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
1

放到postman中可以看到查询条件如下:

image-20220316225547961

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

返回数据格式如下:

image-20220316230043893

# 条件查询(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
1
  • cql_filter(查询条件)

这里是查询TBLX为11的数据,可以看到返回的数据格式下:

image-20220316231032103

# 模糊查询

有时候我们需要对熟悉模糊查询,这里我举个例子:我在地图上要加载南京市下所有的区县边界数据,但我的图层是全江苏省的区县,我需要只取出南京所属的数据即可,这里就可以使用模糊查询。我们以南京的行政区划代码进行模糊查询(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
1

添加条件:&cql_filter=%22pac%22+like+%27%253201%25%27

我们就拿到了南京下所属的区县边界数据了

image-20220617002408842

# 多条件查询

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
1

image-20221026183244210

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

image-20221026183610840

# 指定坐标系查询

我们在发布矢量数据的时候,坐标系可能各种各样,但我们地图中需要的是指定坐标系比如WGS84经纬度坐标(4326),这个时候就需要指定坐标系来返回数据。

我们看一下默认坐标系数据请求结构

image-20220617001213404

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
1

返回数据结构如下图:

image-20220617001338155

我们最终需要的是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
1

添加:&srsname=EPSG:4326,指定坐标系

image-20220617001633557

# 指定范围查询

我们也可以指定范围返回数据

原始数据请求,有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
1

image-20220617002829317

添加范围条件后,查询出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
1

添加条件:&BBOX=40590235.65602544%2C3505954.1021578796%2C40592068.091087505%2C3507395.235982733

image-20220617003232876

其他参考 (opens new window)

上次更新时间: 2022年10月27日星期四早上8点32分