- 因为上个项目涉及到用户根据经纬度划分用户的区域需要用到此函数,但是此函数始终返回默认地址,以下是解决方法~
代码
/** * 根据经纬度获取当前地区信息 * * @param string $lng 经度 * @param string $lat 纬度 * @return Area 城市信息 */ public static function getAreaFromLngLat($lng, $lat, $level = 3) { // 添加缓存标记,避免重复执行 if (Cache::tag('geo')->get('geo:area_level_' . $level) !== true) { self::area2RedisGeo($level); } $namearr = [1 => 'geo:province', 2 => 'geo:city', 3 => 'geo:district']; $rangearr = [1 => 15000, 2 => 1000, 3 => 200]; $geoname = isset($namearr[$level]) ? $namearr[$level] : $namearr[3]; $georange = isset($rangearr[$level]) ? $rangearr[$level] : $rangearr[3]; // 读取范围内的ID $redis = Cache::store('redis')->handler(); $georadiuslist = []; if (method_exists($redis, 'georadius')) { $georadiuslist = $redis->georadius($geoname, $lng, $lat, $georange, 'km', ['WITHDIST', 'COUNT' => 5, 'ASC']); } if ($georadiuslist) { list($id, $distance) = $georadiuslist[0]; } $id = isset($id) && $id ? $id : 3; return self::get($id); } /** * Name: 区域经纬度到redis * User: 神威无敌大将军 * Date: 2021/10/20 14:21 * @param $level * @throws thinkdbexceptionDataNotFoundException * @throws thinkdbexceptionModelNotFoundException * @throws thinkexceptionDbException */ public static function area2RedisGeo($level) { $areas = self::where(['level' => $level])->select(); $namearr = [1 => 'geo:province', 2 => 'geo:city', 3 => 'geo:district']; $redis = Cache::store('redis')->handler(); foreach ($areas as $area) { if (method_exists($redis, 'geoadd')) { $redis->geoadd($namearr[$area['level']], $area['lng'], $area['lat'], $area['id']); } } Cache::tag('geo')->set('geo:area_level_' . $level, true); }
- 开启redis(3.2以上)
- 测试截图
- 后续还会更新遇到的其他的问题!如你有棘手问题,也可私信作者。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。