2013-02-12 4 views
0

Я пытаюсь получить общую базу данных геоточек, работающих с поиском радиуса. Я нашел несколько хороших учебных пособий по этой теме, но я терпел неудачу в самом конце.haversine formula php/mysql

Главное руководство здесь: http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates.

Основная формула, в виде запроса SQL, является

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; 

Я реализовал это в простой тест PHP страницы, как это:

$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

Спасибо за помощь! Это был факт того, что лат/лон должен был находиться в радианах во вторичном поиске. – user101289

Смежные вопросы