2013-02-12 2 views
0

반경 검색과 함께 작동하는 지오 포인트의 공통 데이터베이스를 얻으려고합니다. 이 주제에 대한 여러 유용한 자습서를 찾았지만 맨 마지막에 실패했습니다.haversine formula php/mysql

기본 자습서는 http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates입니다.

SQL 쿼리의 형태로 기본 공식은, 내가 같이 간단한 PHP 테스트 페이지에서 이것을 구현했습니다

SELECT * FROM Places 
WHERE (Lat => 1.2393 AND Lat <= 1.5532) AND (Lon >= -1.8184 AND Lon <= 0.4221) 
AND acos(sin(1.3963) * sin(Lat) + cos(1.3963) * cos(Lat) * cos(Lon - (-0.6981))) 
    <= 0.1570; 

입니다 :

$R = 6371; // radius of Earth in KM 

$lat = '46.98025235521883'; // lat of center point 
$lon = '-110.390625'; // longitude of center point 
$distance = 1000; // radius in KM of the circle drawn 
$rad = $distance/$R; // angular radius for query 
$query = ''; 

// rough cut to exclude results that aren't close 
$max_lat = $lat + rad2deg($rad/$R); 
$min_lat = $lat - rad2deg($rad/$R); 
$max_lon = $lon + rad2deg($rad/$R/cos(deg2rad($lat))); 
$min_lon = $lon - rad2deg($rad/$R/cos(deg2rad($lat))); 
// this part works just fine! 
$query .= '(latitude > ' . $min_lat . ' AND latitude < ' . $max_lat . ')'; 
$query .= ' AND (longitude > ' . $min_lon . ' AND longitude < ' . $max_lon . ')'; 
// refining query -- this part returns no results 
$query .= ' AND acos(sin('.$lat.') * sin(latitude) + cos('.$lat.') * cos(latitude) * 
    cos(longitude - ('.$lon.'))) <= '.$rad; 

것은 내가 여기서 뭔가를 놓치고 있습니까 ? 나는 방법론을 정확히 따르고 있다고 생각하지만 결과를 반환하는 "미세 조정"쿼리를 얻을 수는 없습니다.

+0

당신은 어설프게 몇 가지 예상 입/출력을 할 수 있나요? – ehime

답변

1

하지 않도록 있지만 :

$R = 6371; // radius of Earth in KM 

$lat = '46.98025235521883'; // lat of center point 
$lon = '-110.390625'; // longitude of center point 
$distance = 1000; // radius in KM of the circle drawn 
$rad = $distance/$R; // angular radius for query 
$query = ''; 

// rough cut to exclude results that aren't close 
$radR = rad2deg($rad/$R); 
$max_lat = $lat + radR; 
$min_lat = $lat - radR; 
$radR = rad2deg($rad/$R/cos(deg2rad($lat))); 
$max_lon = $lon + radR; 
$min_lon = $lon - radR; 
// this part works just fine! 
$query .= '(latitude > ' . $min_lat . ' AND latitude < ' . $max_lat . ')'; 
$query .= ' AND (longitude > ' . $min_lon . ' AND longitude < ' . $max_lon . ')'; 
// refining query -- this part returns no results 
$query .= ' AND acos(sin('.deg2rad($lat).') * sin(radians(latitude)) + cos('.deg2rad($lat).') * cos(radians(latitude)) * 
    cos(radians(longitude) - ('.deg2rad($lon).'))) <= '.$rad; 
+0

도움에 감사드립니다! 2 차 검색에서도 위도/경도가 라디안이어야한다는 것이 실제로 사실입니다. – user101289