본문 바로가기
MySql

MySQL Great Circle Distance (Haversine 공식)

by 베이스 공부 2020. 10. 12.
반응형

경도 및 위도 값을 가져온 다음 MySQL 쿼리에 입력하는 작동하는 PHP 스크립트가 있습니다. 저는 MySQL로만 만들고 싶습니다. 내 현재 PHP 코드는 다음과 같습니다.

if ($distance != "Any" && $customer_zip != "") { //get the great circle distance

    //get the origin zip code info
    $zip_sql = "SELECT * FROM zip_code WHERE zip_code = '$customer_zip'";
    $result = mysql_query($zip_sql);
    $row = mysql_fetch_array($result);
    $origin_lat = $row['lat'];
    $origin_lon = $row['lon'];

    //get the range
    $lat_range = $distance/69.172;
    $lon_range = abs($distance/(cos($details[0]) * 69.172));
    $min_lat = number_format($origin_lat - $lat_range, "4", ".", "");
    $max_lat = number_format($origin_lat + $lat_range, "4", ".", "");
    $min_lon = number_format($origin_lon - $lon_range, "4", ".", "");
    $max_lon = number_format($origin_lon + $lon_range, "4", ".", "");
    $sql .= "lat BETWEEN '$min_lat' AND '$max_lat' AND lon BETWEEN '$min_lon' AND '$max_lon' AND ";
    }

누구든지 이것을 완전히 MySQL로 만드는 방법을 알고 있습니까? 나는 인터넷을 조금 탐색했지만 그것에 관한 대부분의 문헌은 꽤 혼란 스럽습니다.

 

해결 방법

 


다음은 37, -122 좌표에 대해 반경 25 마일 내에있는 가장 가까운 20 개 위치를 찾는 SQL 문입니다. 해당 행의 위도 / 경도와 대상 위도 / 경도를 기반으로 거리를 계산 한 다음 거리 값이 25 미만인 행만 요청하고 전체 쿼리를 거리별로 정렬하고 결과를 20 개로 제한합니다. 마일 대신 킬로미터로 검색하려면 3959를 6371로 바꿉니다.

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) 
* cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin(radians(lat)) ) ) AS distance 
FROM markers 
HAVING distance < 25 
ORDER BY distance 
LIMIT 0 , 20;

 

참조 페이지 https://stackoverflow.com/questions/574691

 

 

반응형

댓글