PHP / MySQL: выберите местоположения, близкие к заданному местоположению, из базы данных

В 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:

  • Пользователь входит в свой родной город
  • Мой скрипт получает значения широты / долготы через API Google
  • В моей базе данных у меня около 200 местоположений с полем для значения широты и поле для значения долготы
  • Мне нужен код для PHP и MySQL, чтобы выбрать 10 местоположений, которые ближе всего к родному городу пользователя

Я надеюсь, что вы можете мне помочь. Заранее спасибо!

Solutions Collecting From Web of "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 вычислить расстояние между двумя геообъектами и отсортировать по этому вопросу).

См .: http://forums.mysql.com/read.php?23,159205,159205

Почему бы вам не использовать геопространственные функции 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