Rozwiązanie Google:
Tworzenie tabeli
Tworząc tabelę MySQL, chcesz zwrócić szczególną uwagę na atrybuty lat i lng. Przy obecnych możliwościach powiększania w Mapach Google powinieneś potrzebować tylko 6 cyfr dokładności po przecinku. Aby zachować minimalną ilość miejsca wymaganego dla tabeli, możesz określić, że atrybuty lat i lng są zmiennoprzecinkowymi o rozmiarze (10,6). Pozwoli to na przechowywanie w polach 6 cyfr po przecinku plus maksymalnie 4 cyfry przed przecinkiem, np. -123,456789 stopni. Twoja tabela powinna mieć również atrybut id, który będzie służył jako klucz podstawowy.
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 ;
Wypełnianie tabeli
Po utworzeniu tabeli czas wypełnić ją danymi. Przykładowe dane podane poniżej dotyczą około 180 pizzerii rozsianych po całych Stanach Zjednoczonych. W phpMyAdmin możesz użyć zakładki IMPORT, aby importować różne formaty plików, w tym CSV (wartości rozdzielane przecinkami). Microsoft Excel i Google Spreadsheets eksportują do formatu CSV, dzięki czemu można łatwo przenosić dane z arkuszy kalkulacyjnych do tabel MySQL poprzez eksportowanie / importowanie plików 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');
Znajdowanie lokalizacji za pomocą MySQL
Aby znaleźć lokalizacje w tabeli znaczników, które znajdują się w określonym promieniu w określonej szerokości / długości geograficznej, możesz użyć instrukcji SELECT opartej na formule Haversine. Wzór Haversine'a jest używany ogólnie do obliczania odległości po ortodromie między dwiema parami współrzędnych na kuli. Szczegółowe wyjaśnienie matematyczne jest podane w Wikipedii, a dobre omówienie wzoru w odniesieniu do programowania znajduje się na stronie Movable Type.
Oto instrukcja SQL, która znajdzie najbliższe 20 lokalizacji w promieniu 25 mil od współrzędnej 37, -122. Oblicza odległość na podstawie szerokości / długości geograficznej tego wiersza i docelowej szerokości / długości geograficznej, a następnie pyta tylko o wiersze, w których wartość odległości jest mniejsza niż 25, porządkuje całe zapytanie według odległości i ogranicza je do 20 wyników. Aby wyszukiwać według kilometrów zamiast mil, zamień 3959 na 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;
Ten ma znaleźć szerokości i długości geograficzne w odległości mniejszej niż 28 mil.
Innym jest znalezienie ich w odległości od 28 do 29 mil:
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