武汉PHP培训
达内武汉民大中心

15827352908

热门课程

如何实现搜索的PHP代码

  • 时间:2018-04-02 17:41
  • 发布:武汉PHP培训班
  • 来源:互联网

实现思路:

首先,我们应该这样想: 既然我们知道了用户当前位置的经纬度,又知道我们将要搜索的范围,我们可不可以计算出一个范围 ?也就是说,根据一个中心点和半径,计算出符合条件的经纬度的大值和小值。

具体实现:

那么到此,想要独立思考完成的小伙伴可以不要继续往下看了。

上面我们提到该功能的一个实现原理,接下来我们就讲解一下具体的实现步骤。

我们先声明一个函数,用作计算经纬度的范围:

/**

* 根据经纬度和半径计算出范围

* @param string $lat 纬度

* @param String $lng 经度

* @param float $radius 半径

* @return Array 范围数组

*/

private function calcScope($lat, $lng, $radius) {

$degree = (24901*1609)/360.0;

$dpmLat = 1/$degree;

$radiusLat = $dpmLat*$radius;

$minLat = $lat - $radiusLat; // 最小纬度

$maxLat = $lat + $radiusLat; // 最大纬度

$mpdLng = $degree*cos($lat * (PI/180));

$dpmLng = 1 / $mpdLng;

$radiusLng = $dpmLng*$radius;

$minLng = $lng - $radiusLng; // 最小经度

$maxLng = $lng + $radiusLng; // 最大经度

/** 返回范围数组 */

$scope = array(

'minLat' => $minLat,

'maxLat' => $maxLat,

'minLng' => $minLng,

'maxLng' => $maxLng

);

return $scope;

}

返回的数组中包含了在 $radius 范围内,符合条件的最大最小经纬度。

既然我们已经获取到了范围,那么我们就可以开始从数据库中查找所有在这个经纬度范围内符合条件的记录:

/**

* 根据经纬度和半径查询在此范围内的所有的电站

* @param String $lat 纬度

* @param String $lng 经度

* @param float $radius 半径

* @return Array 计算出来的结果

*/

public function searchByLatAndLng($lat, $lng, $radius) {

$scope = $this->calcScope($lat, $lng, $radius); // 调用范围计算函数,获取最大最小经纬度

/** 查询经纬度在 $radius 范围内的电站的详细地址 */

$sql = 'SELECT `字段` FROM `表名` WHERE `Latitude` < '.$scope['maxLat'].' and `Latitude` > '.$scope['minLat'].' and `Longitude` < '.$scope['maxLng'].' and `Longitude` > '.$scope['minLng'];

$stmt = self::$db->query($sql);

$res = $stmt->fetchAll(PDO::FETCH_ASSOC); // 获取查询结果并返回

return $res;

}

扩展:

直到现在,我们已经知道了如何计算出附近的人,但在实际需求中,我们往往需要计算出每一个人与当前中心点的实际距离。

接着,我们再来看一个方法:

/**

* 获取两个经纬度之间的距离

* @param string $lat1 纬一

* @param String $lng1 经一

* @param String $lat2 纬二

* @param String $lng2 经二

* @return float 返回两点之间的距离

*/

public function calcDistance($lat1, $lng1, $lat2, $lng2) {

/** 转换数据类型为 double */

$lat1 = doubleval($lat1);

$lng1 = doubleval($lng1);

$lat2 = doubleval($lat2);

$lng2 = doubleval($lng2);

/** 以下算法是 Google 出来的,与大多数经纬度计算工具结果一致 */

$theta = $lng1 - $lng2;

$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));

$dist = acos($dist);

$dist = rad2deg($dist);

$miles = $dist * 60 * 1.1515;

return ($miles * 1.609344);

}

本篇文章是有武汉PHP培训班为您呈现,希望给您带来更多更好的文章,更多武汉PHP培训班相关资讯,请扫描下方二维码

马上预约七天免费试听课

姓名:

电话:

上一篇:PHP如何实现第三方登录
下一篇:上传文件如何控制文件大小

简单介绍PHP是啥

PHP中的数组介绍

了解一下php中的伪静态是什么

oop是什么?

选择城市和中心
贵州省

广西省

海南省

有位老师想和您聊一聊