今回は、PHPを使用して近くの人を検索する機能についてお届けします。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; }
/** * 根据经纬度和半径查询在此范围内的所有的电站 * @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 で Redis の長い接続を使用する手順は何ですか?以上がPHPを使って近くにいる人の検索機能を作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。