展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > ThinkPHP如何做地理位置搜索_RedisGeoHash附近的人【详解】

ThinkPHP如何做地理位置搜索_RedisGeoHash附近的人【详解】

使用ThinkPHP进行Redis地理位置搜索时,需确保Redis服务端版本≥3.2且PHP扩展支持GEO指令。通过rawCommand发送GEOADD和GEORADIUS命令,注意经纬度顺序为经度在前。返回结果按数值索引解析,需手动排除自身。GeoHash字符串不宜作为排序或查询依据。

先说一个容易被忽视的技术细节:GEORADIUSGEORADIUSBYMEMBER 虽然是 Redis GEO 的核心可用命令,但在 ThinkPHP 里直接调用之前,有两件事必须确认。Redis 服务端版本不能低于 3.2,PHP Redis 扩展也得支持 GEO 指令——部分旧版扩展需要手动启用甚至升级,否则命令发过去只会得到一个“不认识”的回应。

ThinkPHP如何做地理位置搜索_Redis GeoHash附近的人【详解】

ThinkPHP 调用 Redis Geo 命令,关键是要绕过封装层

很多开发者可能已经习惯了 Cache::store('redis')->handler()Redis::connection() 返回原生 Redis 实例的用法。但问题在于,这个 PHP redis 扩展对象的方法列表里,并没有 geoAddgeoradius 这类现成方法——它们是 Redis 协议级别的命令,不是 PHP 扩展的原生方法名。

解决思路很直接:用 rawCommand 显式发送指令。

$redis = Cache::store('redis')->handler();
$redis->rawCommand('GEOADD', 'users:geo', $lng, $lat, $uid);
$redis->rawCommand('GEORADIUS', 'users:geo', $lng, $lat, 5, 'km', 'WITHDIST', 'WITHCOORD', 'COUNT', 20);

需要注意几个关键点:rawCommand 的第一个参数必须是全大写的命令名,后面的参数按 Redis CLI 的传入顺序来写,单位如 km 是字符串,不是数字。如果运行时报错 ERR unknown command 'GEOADD',罪魁祸首通常不是 ThinkPHP,而是 Redis 服务端版本太低,或者编译时没开启 GEO 支持。如果用 Docker,记得选 redis:7-alpine 及以上的镜像。

经纬度顺序:经度在前,纬度在后,千万别搞反

几乎所有地图 SDK(高德、百度、Leaflet)和数据库(如 MySQL 的 POINT(lng lat))都统一使用“经度, 纬度”的顺序。但问题常常出在这里:文档里一句“lat,lng”的口语说法,容易让初学者在 GEOADD 里写成 $lat, $lng,结果北京的数据直接漂移到了南美洲。

  • 正确写法:GEOADD users:geo 116.404 39.915 "u1001"(116.404 是经度,39.915 是纬度)
  • 错误写法:GEOADD users:geo 39.915 116.404 "u1001" —— 实际存的是南纬 39°、东经 116°,目测在阿根廷附近

建议在 ThinkPHP 中封装一层坐标校验逻辑,从源头避免这种问题:

if ($lng < -180 || $lng > 180 || $lat < -85.05112878 || $lat > 85.05112878) {
    throw new InvalidArgumentException('Invalid coordinate range');
}

查出来的结果需要自己“翻译”,不是现成的数组

GEORADIUS 返回的是一个嵌套混合结构。当你启用了 WITHDISTWITHCOORD 时,每一项会变成 [member, distance, [lng, lat]] 这样的形式。PHP redis 扩展拿到的原生数组,不会自动帮你转化成键值对。

常见错误是直接 foreach ($result as $item) 后就用 $item['distance'] 取数,结果报错——因为它是数值索引数组。正确的解析方式如下:

$raw = $redis->rawCommand('GEORADIUS', 'users:geo', $lng, $lat, $radius, 'km', 'WITHDIST', 'WITHCOORD');
$result = [];
foreach ($raw as $i => $item) {
    if ($i % 3 === 0) {
        $member = $item;
        $dist = $raw[$i + 1] ?? null;
        $coord = $raw[$i + 2] ?? null;
        $result[] = [
            'uid' => $member,
            'distance' => (float)$dist,
            'lng' => (float)($coord[0] ?? 0),
            'lat' => (float)($coord[1] ?? 0),
        ];
    }
}

有一点特别容易踩坑:如果命令里没加 WITHDISTWITHCOORD,返回的结构会完全不同。解析时一定要跟你传的选项严格对齐,否则拿到的数据就是混乱的。

GeoHash 字符串别当成业务主键或排序依据

Redis 内部确实用 GeoHash 编码把经纬度转成 52 位整数存进 zset,但这个编码值对业务逻辑来说没有意义。GEOHASH 命令返回的是 base32 字符串(比如 wx4g0b),而它有一个关键特性:字典序不等于地理距离近。

常见误用场景:在数据库里建一个 geohash 字段,然后写个 WHERE geohash LIKE 'wx4g%' 当作精确查询条件——结果边界附近的用户直接被漏掉了。更离谱的是用 ORDER BY geohash 排序,用户看到的“由近到远”完全是错的。因为 GeoHash 是 Z 阶曲线,相邻的两个字符串,在地理上可能隔着几十公里。

正确的做法很简单:只依赖 Redis 的 GEORADIUS 原生命令来做查询。它内部已经完成了 GeoHash 编码、范围扫描和球面距离精筛,返回的结果默认按距离升序排列(除非你显式加了 DESC)。

容易被忽略但必须处理的问题:查询结果包含自己

Redis 的 Geo 功能有一个“盲点”:它不支持在命令层面排除自身。当你用 GEORADIUSBYMEMBER users:geo u1001 5 km 来查询“附近的人”时,结果默认会把 u1001 自己也包含进去。生产环境下,要么手动 array_filter 把当前用户 ID 剔除,要么改用 GEORADIUS 配合显式坐标——后者的可控性更好。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。