地理空间查询
基于地理数据的查询
Redis Stack 的地理空间功能允许你查询与地理位置相关的数据。你可以查询在特定半径内的地点,或基于几何形状进行查询,如多边形。例如,一个多边形形状可以表示一个湖泊或建筑物的布局。
本文中的示例使用以下模式:
字段名 | 字段类型 |
---|---|
store_location |
GEO |
pickup_zone |
GEOSHAPE |
注意:
需要使用 Redis Stack 版本 7.2.0 或更高版本才能使用 GEOSHAPE
字段类型。
半径
你可以通过传递中心坐标(经度,纬度)、半径和距离单位来构造一个半径查询,并将其传递给 FT.SEARCH 命令。
FT.SEARCH index "@geo_field:[lon lat radius unit]"
允许的单位有 m
、km
、mi
和 ft
。
以下查询查找位于伦敦周围 20 英里范围内的所有自行车商店:
FT.SEARCH idx:bicycle "@store_location:[-0.1778 51.5524 20 mi]"
几何形状
支持的几何形状只有点和多边形。你可以查询包含在给定几何形状内的多边形或点,或者与其相交的多边形或点。
FT.SEARCH index "@geo_shape_field:[{WITHIN|CONTAINS|INTERSECTS|DISJOINT} $shape] PARAMS 2 shape "shape_as_wkt" DIALECT 3
以下是该查询的详细说明:
- 字段名:你需要将
geo_shape_field
替换为你想查询的GEOSHAPE
字段的名称。 - 空间操作符:空间操作符定义了数据库中形状与你查询的形状之间的关系。你可以使用
WITHIN
、CONTAINS
、INTERSECTS
或DISJOINT
。WITHIN
查找数据库中任何位于给定形状内部的形状。CONTAINS
查询任何包含给定形状的形状。INTERSECTS
查找任何与提供的形状有共同坐标的形状。DISJOINT
查找与提供的形状没有任何共同部分的形状。INTERSECTS
和DISJOINT
从 v2.10 版本开始引入。 - 参数:查询引用了一个名为
shape
的参数。你可以在此使用任何参数名称。你需要使用PARAMS
子句来设置参数值。该值遵循几何体的知名文本表示法。支持的类型有POINT(x y)
和POLYGON((x1 y1, x2 y2, ...))
。 - 方言:基于形状的查询自查询方言的第三个版本以来就已经可用。
以下示例查询验证一个自行车是否在接送区内:
FT.SEARCH idx:bicycle "@pickup_zone:[CONTAINS $bike]" PARAMS 2 bike "POINT(-0.1278 51.5074)" DIALECT 3
如果你想查找所有大致位于欧洲的接送区,可以使用以下查询:
FT.SEARCH idx:bicycle "@pickup_zone:[WITHIN $europe]" PARAMS 2 europe "POLYGON((-25 35, 40 35, 40 70, -25 70, -25 35))" DIALECT 3