加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

教你借助PHP实现查找你想要的附近人

发布时间:2022-07-21 12:56:03 所属栏目:PHP教程 来源:互联网
导读:最近有个业务场景使用到了查找附近的人,于是查阅了相关资料,并对使用PHP实现相关功能的多种方式和具体实现做一篇技术总结,欢迎各位看官提出意见和纠错,下面开始进入正题: LBS(基于位置的服务) 查找附近的人有个更大的专有名词叫做LBS(基于位置的服务),
  最近有个业务场景使用到了查找附近的人,于是查阅了相关资料,并对使用PHP实现相关功能的多种方式和具体实现做一篇技术总结,欢迎各位看官提出意见和纠错,下面开始进入正题:
 
  LBS(基于位置的服务)
 
  查找附近的人有个更大的专有名词叫做LBS(基于位置的服务),LBS是指是指通过电信移动运营商的无线电通讯网络或外部定位方式,获取移动终端用户的位置信息,在GIS平台的支持下,为用户提供相应服务的一种增值业务。因此首先得获取用户的位置,获取用户的位置有基于GPS、基于运营商基站、WIFI等方式,一般由客户端获取用户位置的经纬度坐标上传至应用服务器,应用服务器对用户坐标进行保存,客户端获取附近的人数据的时候,应用服务器基于请求人的地理位置配合一定的条件(距离,性别,活跃时间等)去数据库进行筛选和排序。
 
  根据经纬度如何得出两点之间的距离?
 
  我们都知道平面坐标内的两点坐标可以使用平面坐标距离公式来计算,但经纬度是利用三度空间的球面来定义地球上的空间的球面坐标系统,假定地球是正球体,关于球面距离计算公式如下:
 
  ca23df6f88dbe0b3de7461ae28ac6bd.png
 
  具体推断过程有兴趣的推荐这篇文章:【数学公式及推导】根据经纬度计算地面两点间的距离
 
  PHP函数代码如下:
 
 
 
 
 
  /**
 
       * 根据两点间的经纬度计算距离
 
       * @param $lat1
 
       * @param $lng1
 
       * @param $lat2
 
       * @param $lng2
 
       * @return float
 
       */
 
      public static function getDistance($lat1, $lng1, $lat2, $lng2){
 
          $earthRadius = 6367000; //approximate radius of earth in meters
 
          $lat1 = ($lat1 * pi() ) / 180;
 
          $lng1 = ($lng1 * pi() ) / 180;
 
          $lat2 = ($lat2 * pi() ) / 180;
 
          $lng2 = ($lng2 * pi() ) / 180;
 
          $calcLongitude = $lng2 - $lng1;
 
          $calcLatitude = $lat2 - $lat1;
 
          $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
 
          $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
 
          $calculatedDistance = $earthRadius * $stepTwo;
 
          return round($calculatedDistance);
 
      }
 
  MySQL代码如下:
 
 
  SELECT  
 
    id, (  
 
      3959 * acos (  
 
        cos ( radians(78.3232) )  
 
        * cos( radians( lat ) )  
 
        * cos( radians( lng ) - radians(65.3234) )  
 
        + sin ( radians(78.3232) )  
 
        * sin( radians( lat ) )  
 
      )  
 
    ) AS distance  
 
  FROM markers  
 
  HAVING distance < 30  
 
  ORDER BY distance  
 
  LIMIT 0 , 20;
 
  除了上面通过计算球面距离公式来获取,我们可以使用某些数据库服务得到,比如Redis和MongoDB:
 
  Redis 3.2提供GEO地理位置功能,不仅可以获取两个位置之间的距离,获取指定位置范围内的地理信息位置集合也很简单。Redis命令文档
 
  1.增加地理位置
 
 
  GEOADD key longitude latitude member [longitude latitude member ...]
 
  2.获取地理位置
 
 
  GEOPOS key member [member ...]
 
  3.获取两个地理位置的距离
 
 
  GEODIST key member1 member2 [unit]
 
  4.获取指定经纬度的地理信息位置集合
 
 
  GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
 
  5.获取指定成员的地理信息位置集合
 
 
  GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
 
  MongoDB专门针对这种查询建立了地理空间索引。 2d和2dsphere索引,分别是针对平面和球面。 MongoDB文档
 
  1.添加数据
 
 
  db.location.insert( {uin : 1 , loc : { lon : 50 , lat : 50 } } )
 
  2.建立索引
 
 
  db.location.ensureIndex( { loc : "2d" } )
 
  3.查找附近的点
 
 
  db.location.find( { loc :{ $near : [50, 50] } )
 
  4.最大距离和限制条数
 
 
  db.location.find( { loc : { $near : [50, 50] , $maxDistance : 5 } } ).limit(20)
 
  5.使用geoNear在查询结果中返回每个点距离查询点的距离
 
 
  db.runCommand( { geoNear : "location" , near : [ 50 , 50 ], num : 10, query : { type : "museum" } } )
 
  6.使用geoNear附带查询条件和返回条数,geoNear使用runCommand命令不支持find查询中分页相关limit和skip参数的功能

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读