ホームページ  >  記事  >  バックエンド開発  >  PHPで近くの人を検索する機能を実現

PHPで近くの人を検索する機能を実現

小云云
小云云オリジナル
2018-02-22 09:50:442630ブラウズ

まず、次のように考える必要があります。ユーザーの現在位置の経度と緯度と、検索する範囲がわかったので、範囲を計算できますか?つまり、中心点と半径をもとに、条件を満たす経度と緯度の最大値と最小値を計算します。

詳細な実装:

したがって、ここで、独立して考えて完了したい友人は、読むのをやめることもできます。
この機能の実装原理については上で述べました。次に、具体的な実装手順について説明します。
まず、経度と緯度の範囲を計算する関数を宣言します。


/**
 * 根据经纬度和半径计算出范围
 * @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 = &#39;SELECT `字段` FROM `表名` WHERE `Latitude` < &#39;.$scope[&#39;maxLat&#39;].&#39; and `Latitude` > &#39;.$scope[&#39;minLat&#39;].&#39; and `Longitude` < &#39;.$scope[&#39;maxLng&#39;].&#39; and `Longitude` > &#39;.$scope[&#39;minLng&#39;];

  $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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。