暂无图片
暂无图片
1
暂无图片
暂无图片
1
暂无图片

[译] 使用CQL在pg_featureserv中的空间过滤器

原创 上善若水 2022-05-11
1279

原文地址:https://www.crunchydata.com/blog/spatial-filters-in-pg_featureserv-with-cql
原文作者:Martin Davis

pg_featureserv通过一个轻量级的网络服务提供对PostGIS和PostgreSQL的强大空间数据库功能的访问。为此,它实现了OGC API for Features(OAPIF)的RESTful协议。OAPIF是开放地理空间联盟(OGC)OGC API标准套件的一部分。

在前一篇文章中,我们宣布了pg_featureserv的一个令人兴奋的新功能:支持CQL过滤器。CQL(通用查询语言)是另一个OGC标准,为网络查询提供了与SQL WHERE子句相当的功能。

正如你所期望的那样,鉴于OGC的重点是促进空间信息的便捷获取,CQL支持空间过滤。这使我们能够利用PostGIS的能力来非常有效地查询空间数据。在这篇文章中,我们将展示一些使用CQL与pg_featureserv进行空间过滤的例子。

与之配套的矢量图服务pg_tileserv也支持CQL,而且空间过滤也可以在那里进行。

CQL空间过滤器

CQL中的空间过滤涉及使用空间谓词来测试特征的几何属性的条件。空间谓词包括用于空间关系的标准OGC简单特征谓词。

隔离区——测试两个几何图形是否相交
分歧—— 测试两个几何体是否没有共同点
包含——测试一个几何体是否包含另一个
属于——测试一个几何体是否在另一个里面
相等——测试两个几何体是否在拓扑学上相等
交叉——测试几何图形是否交叉
叠加——测试几何图形是否重叠
触及——测试几何图形是否触及

sqlpg_featureserv也实现了距离谓词sqlDWITHIN

空间谓词通常用于比较特征的几何属性和几何值。几何值是以sqlWell-Known Text (WKT)表示的。

POINT (1 2) LINESTRING (0 0, 1 1) POLYGON ((0 0, 0 9, 9 0, 0 0)) POLYGON ((0 0, 0 9, 9 0, 0 0),(1 1, 1 8, 8 1, 1 1)) MULTIPOINT ((0 0), (0 9)) MULTILINESTRING ((0 0, 1 1),(1 1, 2 2)) MULTIPOLYGON (((1 4, 4 1, 1 1, 1 4)), ((1 9, 4 9, 1 6, 1 9))) GEOMETRYCOLLECTION(POLYGON ((1 4, 4 1, 1 1, 1 4)), LINESTRING (3 3, 5 5), POINT (1 5)) ENVELOPE (1, 2, 3, 4)
复制

默认情况下,几何值的坐标参考系统(CRS)是大地测量(经度和纬度)。如果需要,可以通过使用过滤器-crs参数指定不同的CRS。(PostGIS支持大量的标准坐标参考系统)。

下面是一些空间过滤条件的例子。

INTERSECTS(geom, ENVELOPE(-100, 49, -90, 50) ) CONTAINS(geom, POINT(-100 49) ) DWITHIN(geom, POINT(-100 49), 0.1)
复制

当然,这些都可以与属性条件相结合,以表达现实世界的查询。

对于这些例子,我们将使用美国地理名称信息系统(GNIS)数据集。它包含了超过200万个命名地理特征的点。我们将这些数据加载到一个名为us.geonames的PostGIS空间表中。点的位置值被存储在一个名为geom的地理类型的列中。(PostGIS允许将空间数据存储为geometrygeography。我们将在后面解释为什么在这种情况下最好使用sqlgeography)。

我们在这一列上创建一个空间索引以提供快速的空间查询。

CREATE TABLE us.geonames ( id integer PRIMARY KEY, name text, lat double precision, lon double precision, type text, state text, geom geography(Point), ts tsvector ); CREATE INDEX us_geonames_gix ON us.geonames USING GIST ( geom );
复制

我们现在可以用pg_featureserv发布数据集,并在Web UI上查看查询结果。

服务集合页面显示了发布的表和视图(这里我们使用了配置Database.TableIncludes的设置,只发布了us模式)。

http://localhost:9000/collections.html

image.png

Collections\us.geonames页面显示了收藏的元数据。

http://localhost:9000/collections/us.geonames.html

image.png

INTERSECTS进行查询

用INTERSECTS查询在这个例子中,我们将查询美国华盛顿州San Juan 群岛的水特征。由于没有提供区域信息的GNIS属性,我们必须使用空间过滤器来指定我们要查询的区域。我们使用QGIS创建一个包围岛屿的多边形。

image.png

我们可以将多边形转换为WKT,并在INTERSECTS空间谓词中使用(因为我们查询的是点,所以也可以使用WITHIN–产生同样的结果)。为了只检索水特征(湖泊和水库),我们添加条件类型IN('LK', 'RSV'),查询的URL是

http://localhost:9000/collections/public.geonames/items.html?filter=type IN ('LK','RSV') AND INTERSECTS(geom,POLYGON ((-122.722 48.7054, -122.715 48.6347, -122.7641 48.6046, -122.7027 48.3885, -123.213 48.4536, -123.2638 48.6949, -123.0061 48.7666, -122.722 48.7054)))
复制

查询的结果是一个包含33个GNIS点的数据集。
image.png

使用DWITHIN进行查询

现在我们将展示一个使用基于距离的空间过滤器的例子,使用DWITHIN谓词。这就是我们将GNIS数据加载为地理信息的原因。

DWITHIN测试一个特征的几何图形是否在一个几何图形值的给定距离内。通过使用地理类型,我们可以以米为单位指定距离,这是大地测量EPSG:4326坐标系的测量单位。如果我们使用几何类型加载数据集,单位将是度,使用起来很不方便。另外,地理学在地球表面正确计算距离(使用大圆距离)。

让我们来查询西雅图100公里范围内的山脉(类型=‘MT’)(纬度/长度约为47.6,-122.34–注意WKT要求这是一个长纬度),查询的URL是

http://localhost:9000/collections/us.geonames_geo/items.html?filter=type = 'MT' AND DWITHIN(geom,Point(-122.34 47.6),100000)&limit=1000
复制

结果显示,西雅图附近有695座山。可以看出这是个多山的地方!
image.png

欢迎来使用

CQL过滤将包括在即将推出的pg_featureserv 1.3版本中。但你现在可以通过下载最新的版本来尝试。让我们知道你发现的CQL空间过滤的使用情况!

关于更多

pg_featureserv与CQL属性和空间过滤功能为通过网络访问数据提供了一个高效的平台。我们将继续加强它的新功能,以释放PostGIS和PostgreSQL的更多力量。请继续关注关于高级查询功能的帖子,包括时间过滤、几何变换和聚合。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

墨天轮福利君
暂无图片
2年前
评论
暂无图片 0
您好,您已成功参与“墨力翻译计划”(https://www.modb.pro/db/336535),有机会入选“月度最佳译文”🏆 💪加油,辛勤译者、月度翻译官等你角逐!
2年前
暂无图片 点赞
评论