Я пытаюсь получить общую базу данных гео-точек, работающих с поиском радиуса. Я нашел несколько хороших руководств по этой теме, но я не сработал в самом конце.
Основной урок: 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;
Я что-то упустил? Я думаю, что я точно следую методологии, но я не могу получить запрос «тонкой настройки», чтобы возвращать любые результаты.