Рішення Google:
Створення таблиці
Створюючи таблицю MySQL, ви хочете звернути особливу увагу на атрибути lat та lng. При поточних можливостях масштабування на Картах Google вам потрібно лише 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 ви можете використовувати вкладку IMPORT для імпорту різних форматів файлів, включаючи CSV (значення, розділені комами). Електронні таблиці Microsoft Excel та Google експортують у формат 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