Решение Google:
Создание таблицы
Когда вы создаете таблицу MySQL, вы хотите обратить особое внимание на атрибуты lat и lng. С текущими возможностями масштабирования Google Maps, вам нужно только 6 цифр точности после десятичной дроби. Чтобы сохранить минимальное пространство для хранения вашей таблицы, вы можете указать, что атрибуты lat и lng являются числами с плавающей запятой (10,6). Это позволит полям хранить 6 цифр после десятичной запятой, плюс до 4 цифр перед десятичной запятой, например, -123,456789 градусов. Ваша таблица также должна иметь атрибут id, который будет служить первичным ключом.
CREATE TABLE `markers` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 60 ) NOT NULL ,
`address` VARCHAR( 80 ) NOT NULL ,
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL
) ENGINE = MYISAM ;
Заполнение таблицы
После создания таблицы самое время заполнить ее данными. Приведенные ниже примеры данных приведены для примерно 180 пиццерий, разбросанных по Соединенным Штатам. В phpMyAdmin вы можете использовать вкладку ИМПОРТ для импорта файлов различных форматов, включая CSV (значения, разделенные запятыми). Microsoft Excel и Google Spreadsheets оба экспортируют в формат CSV, так что вы можете легко переносить данные из электронных таблиц в таблицы MySQL через экспорт / импорт файлов CSV.
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Frankie Johnnie & Luigo Too','939 W El Camino Real, Mountain View, CA','37.386339','-122.085823');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Amici\'s East Coast Pizzeria','790 Castro St, Mountain View, CA','37.38714','-122.083235');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Kapp\'s Pizza Bar & Grill','191 Castro St, Mountain View, CA','37.393885','-122.078916');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Round Table Pizza: Mountain View','570 N Shoreline Blvd, Mountain View, CA','37.402653','-122.079354');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Tony & Alba\'s Pizza & Pasta','619 Escuela Ave, Mountain View, CA','37.394011','-122.095528');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Oregano\'s Wood-Fired Pizza','4546 El Camino Real, Los Altos, CA','37.401724','-122.114646');
Поиск локаций с MySQL
Чтобы найти местоположения в таблице маркеров, которые находятся в пределах определенного радиуса от заданной широты / долготы, вы можете использовать инструкцию SELECT на основе формулы Хаверсайна. Формула Хаверсайна обычно используется для вычисления расстояний большого круга между двумя парами координат на сфере. Википедия дает подробное математическое объяснение, а хорошее обсуждение формулы в части, касающейся программирования, находится на сайте Movable Type.
Вот оператор SQL, который найдет ближайшие 20 мест, которые находятся в радиусе 25 миль от координаты 37, -122. Он вычисляет расстояние на основе широты / долготы этой строки и целевой широты / долготы, а затем запрашивает только те строки, в которых значение расстояния меньше 25, упорядочивает весь запрос по расстоянию и ограничивает его 20 результатами. Для поиска по километрам вместо миль замените 3959 на 6371.
SELECT
id,
(
3959 *
acos(cos(radians(37)) *
cos(radians(lat)) *
cos(radians(lng) -
radians(-122)) +
sin(radians(37)) *
sin(radians(lat )))
) AS distance
FROM markers
HAVING distance < 28
ORDER BY distance LIMIT 0, 20;
Это найти широты и долготы на расстоянии менее 28 миль.
Другой - найти их на расстоянии от 28 до 29 миль:
SELECT
id,
(
3959 *
acos(cos(radians(37)) *
cos(radians(lat)) *
cos(radians(lng) -
radians(-122)) +
sin(radians(37)) *
sin(radians(lat )))
) AS distance
FROM markers
HAVING distance < 29 and distance > 28
ORDER BY distance LIMIT 0, 20;
https://developers.google.com/maps/articles/phpsqlsearch_v3#creating-the-map