- 用法
-
GEOADD key [ NX | XX ] [ CH ] longitude latitude member [ longitude latitude member ... ]
- 复杂度
- 对于添加的每个元素,复杂度为 O(log(N)),其中 N 是有序集合中的元素数量。
- 始于
- 3.2.0
- ACL 类别
- @geo, @write, @slow
- 有效经度范围为 -180 到 180 度。
- 有效纬度范围为 -85.05112878 到 85.05112878 度。
- XX:只更新已存在的元素。永不添加新元素。
- NX:不更新已存在的元素。始终添加新元素。
- CH:将返回值从新添加的元素数量修改为已更改的元素总数(CH 是 changed 的缩写)。更改的元素包括新添加的元素和坐标已更新的现有元素。因此,命令行中指定但分数与之前相同的元素不计入在内。注意:通常,
GEOADD
的返回值只计算新添加的元素数量。
将指定的地理空间项(经度、纬度、名称)添加到指定的键。数据以有序集合的形式存储在键中,这样就可以使用 GEOSEARCH
命令查询这些项。
该命令以标准 x,y 格式接收参数,因此经度必须在纬度之前指定。可索引的坐标存在限制:非常靠近两极的区域无法索引。
由 EPSG:900913 / EPSG:3785 / OSGEO:41001 指定的精确限制如下:
当用户尝试索引超出指定范围的坐标时,该命令将报告错误。
注意:没有 GEODEL 命令,因为您可以使用 ZREM
来移除元素。Geo 索引结构只是一个有序集合。
GEOADD 选项
GEOADD
还提供以下选项
注意:XX 和 NX 选项是互斥的。
工作原理?
有序集合的填充方式是使用一种称为 Geohash 的技术。纬度和经度位交错排列形成一个唯一的 52 位整数。我们知道有序集合的双精度浮点分数可以表示一个 52 位整数而不会损失精度。
这种格式允许通过检查覆盖整个形状所需的 1+8 个区域并丢弃其外部元素来实现边界框和半径查询。这些区域的检查方式是:计算覆盖框的范围,从有序集合分数的低有效位中移除足够的位,并计算每个区域在有序集合中要查询的分数范围。
它使用哪种地球模型?
该模型假定地球是一个球体,因为它使用 Haversine 公式计算距离。该公式应用于地球时仅是一种近似,因为地球并非一个完美的球体。引入的误差在社交网络和类似需要这种类型查询的应用中不是问题。然而,在最坏的情况下,误差可能高达 0.5%,因此对于对误差敏感的应用程序,您可能需要考虑其他系统。
示例
127.0.0.1:6379> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
127.0.0.1:6379> GEODIST Sicily Palermo Catania
"166274.1516"
127.0.0.1:6379> GEORADIUS Sicily 15 37 100 km
1) "Catania"
127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km
1) "Palermo"
2) "Catania"
RESP2/RESP3 回复
整数回复:当不带可选参数使用时,表示添加到有序集合的元素数量(不包括分数更新)。如果指定了 CH 选项,则表示已更改(添加或更新)的元素数量。
历史
版本 | 变更 |
---|---|
6.2.0 | 添加了 |