В PHP у меня есть следующий код для расчета расстояния между двумя местоположениями:
<?php function distance($lat1, $long1, $lat2, $long2) { // DEGREE TO RADIAN $latitude1 = $lat1/180*pi(); $longitude1 = $long1/180*pi(); $latitude2 = $lat2/180*pi(); $longitude2 = $long2/180*pi(); // FORMULA: e = ARCCOS ( SIN(Latitude1) * SIN(Latitude2) + COS(Latitude1) * COS(Latitude2) * COS(Longitude2-Longitude1) ) * EARTH_RADIUS $distance = acos(sin($latitude1)*sin($latitude2)+cos($latitude1)*cos($latitude2)*cos($longitude2-$longitude1))*6371; return $distance; } echo distance(9.9921962, 53.5534074, 9.1807688, 48.7771056); // Hamburg, DE - Stuttgart, DE ?>
Но теперь я хочу выбрать местоположения, близкие к данному местоположению, через PHP из моей базы данных MySQL:
Я надеюсь, что вы можете мне помочь. Заранее спасибо!
MySQL Great Circle Distance (формула Хаверсина) делает именно то, что вам нужно.
Однако, имея всего 200 записей, вы можете просто загрузить их все и проверить их с помощью кода. Набор данных действительно слишком мал, чтобы слишком сильно беспокоиться о коде базы данных или кодах или любой другой такой оптимизации.
Вычисление расстояния между почтовыми индексами в PHP имеет пару реализаций PHP этого алгоритма.
Geo Proximity Search – это в значительной степени то же самое, что у вас есть.
Возможно, что-то вроде
SELECT field1, field2, ..., ACOS(SIN(latitude / 180 * PI()) * SIN(:1) + COS(latitude / 180 * PI()) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance ORDER BY distance ASC;
или
SELECT field1, field2, ..., ACOS(SIN(RADIANS(latitude)) * SIN(:1) + COS(RADIANS(latitude)) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance ORDER BY distance ASC;
(напрямую переводится с PHP-кода)
:1
и :2
– $lat2/180*pi()
и $long2/180*pi()
соответственно.
Это формула Хаверсина. Вы можете перевести PHP непосредственно в SQL, чтобы вы могли запросить базу данных в пространстве (альтернатива – вытащить каждую запись из БД и запустить данные через PHP). MySQL предоставляет все функции математики, которые вам нужны.
Я сделал это для коммерческого веб-сайта, который предоставил поиск на основе post / zipcode, поэтому его возможно без особых функций ГИС.
Существуют функции MySQL для выполнения именно этого.
http://dev.mysql.com/doc/refman/5.0/en/gis-introduction.html
MySQL имеет возможность индексировать строки геопространственной информацией. Возможно, вам не понадобится делать эту математику самостоятельно (вы можете просто попросить MySQL вычислить расстояние между двумя геообъектами и отсортировать по этому вопросу).
Почему бы вам не использовать геопространственные функции MySQL …? Нет, просто шучу.
Если 200 записей являются фактическими местами, например городами и т. Д., То в качестве альтернативы вы можете использовать API-интерфейс GeoNames?
Следующий веб-сервис предоставит 10 ближайших мест для лат и lng:
http://ws.geonames.org/findNearby?lat=47.3&lng=9
Источник: http://www.geonames.org/export/web-services.html#findNearbyPlaceName
Полный список: http://www.geonames.org/export/ws-overview.html