GEOADD

将一个或多个成员添加到地理空间索引。如果键不存在,则创建该键。

语法

GEOADD key [NX | XX] [CH] longitude latitude member [longitude latitude member ...]

引入版本:3.2.0

复杂度摘要:O(log(N)

将指定的地理空间项(经度、纬度、名称)添加到指定的键。数据作为有序集合存储到键中,这样就可以使用 GEOSEARCH 命令查询项目。

该命令接受标准格式 x,y 的参数,因此必须在纬度之前指定经度。可索引的坐标存在限制:非常靠近极点的区域不可索引。

EPSG:900913 / EPSG:3785 / OSGEO:41001 指定的确切限制如下:

  • 有效经度范围为 -180 至 180 度。
  • 有效纬度范围为 -85.05112878 至 85.05112878 度。

当用户尝试索引指定范围之外的坐标时,该命令将报告错误。

注意: 没有 GEODEL 命令,因为可以使用 ZREM 来删除元素。 Geo索引结构只是一个有序集合。

必需参数

key

保存地理空间索引(有序集合)的键的名称。

longitude latitude member [longitude latitude member ...]

将一个或多个经度-纬度-成员三元组添加到索引中。

可选参数

NX 和 XX 是互斥的。

NX

不要更新已经存在的元素。始终添加新元素。

XX

只更新已经存在的元素。切勿添加元素。

CH

将返回值从添加的新元素数修改为更改的元素总数(CH 是 改变 的缩写)。更改的元素是 添加新元素 以及 坐标更新 中已存在的元素。因此,在命令行中指定的与过去具有相同分数的元素不被计算在内。注意:通常情况下,GEOADD的返回值只统计新增元素的数量。

详细说明

工作原理

有序集合的填充方式是使用一种称为 地理哈希 的技术。纬度和经度位交错形成唯一的 52 位整数。我们知道,有序集 double Score 可以在不损失精度的情况下表示 52 位整数。

此格式允许通过检查覆盖整个形状所需的 1+8 区域并丢弃其外部的元素来进行边界框和半径查询。通过计算所覆盖的框的范围、从有序集合得分的次要部分中删除足够的位以及计算要在有序集合中查询每个区域的得分范围来检查区域。

它使用什么地球模型?

该模型假设地球是一个球体,因为它使用半正弦公式来计算距离。这个公式只是应用于地球时的近似值,地球并不是一个完美的球体。例如,在社交网络和需要此类查询的类似应用程序中使用时,引入的错误不是问题。然而,在最坏的情况下,错误可能高达 0.5%,因此您可能需要考虑其他系统用于错误关键型应用程序。

示例

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEODIST Sicily Palermo Catania
"166274.1516"
redis> GEORADIUS Sicily 15 37 100 km
1) "Catania"
redis> GEORADIUS Sicily 15 37 200 km
1) "Palermo"
2) "Catania"

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
✅ 标准
✅ 主动-主动
✅ 标准
✅ 主动-主动

返回值

RESP2

整数回复:当不带可选参数使用时,添加到有序集合中的元素数量(不包括分数更新)。如果指定了 CH 选项,则为已更改(添加或更新)的元素数。

RESP3

整数回复:当不带可选参数使用时,添加到有序集合中的元素数量(不包括分数更新)。如果指定了 CH 选项,则为已更改(添加或更新)的元素数。

资料来源:Redis 官方 GEOADD 文档;中文内容参考 Redis 文档许可。