먼저 이렇게 생각해야 합니다. 이제 사용자의 현재 위치의 경도와 위도, 그리고 검색할 범위를 알았으니 범위를 계산할 수 있을까요? 즉, 중심점과 반경을 기준으로 조건에 맞는 경도와 위도의 최대값과 최소값을 계산합니다.
상세 구현:
따라서 여기서 독립적으로 생각하고 완성하고 싶은 친구들은 읽기를 중단할 수 있습니다.
위에서 이 기능의 구현 원리를 언급했습니다. 다음으로 구체적인 구현 단계를 설명하겠습니다.
먼저 위도와 경도의 범위를 계산하는 함수를 선언합니다.
/** * 根据经纬度和半径计算出范围 * @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 중국어 웹사이트의 기타 관련 기사를 참조하세요!