PHP를 사용하여 주변 사람들에 대한 검색 기능 만들기

php中世界最好的语言
풀어 주다: 2023-03-26 16:44:01
원래의
1665명이 탐색했습니다.

이번에는 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;
}
로그인 후 복사

반환된 배열에는 $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` < &#39;.$scope[&#39;maxLat&#39;].&#39; and `Latitude` > '.$scope['minLat'].' and `Longitude` < &#39;.$scope[&#39;maxLng&#39;].&#39; 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에서 redis 긴 연결을 사용하는 단계는 무엇입니까


PHP 애플리케이션 컨테이너화 및 배포 사용법에 대한 자세한 설명

위 내용은 PHP를 사용하여 주변 사람들에 대한 검색 기능 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!