Soluzione di Google:
Creare la tabella
Quando si crea la tabella MySQL, si desidera prestare particolare attenzione agli attributi lat e lng. Con le attuali funzionalità di zoom di Google Maps, dovresti avere solo 6 cifre di precisione dopo il decimale. Per mantenere almeno lo spazio di archiviazione richiesto per la tabella, è possibile specificare che gli attributi lat e lng siano float di dimensioni (10,6). Ciò consentirà ai campi di memorizzare 6 cifre dopo il decimale, più fino a 4 cifre prima del decimale, ad esempio -123,456789 gradi. La tua tabella dovrebbe anche avere un attributo id da servire come chiave primaria.
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 ;
Popolazione della tabella
Dopo aver creato la tabella, è tempo di popolarla con i dati. I dati di esempio forniti di seguito si riferiscono a circa 180 pizzerie sparse negli Stati Uniti. In phpMyAdmin, è possibile utilizzare la scheda IMPORT per importare vari formati di file, incluso CSV (valori separati da virgola). Microsoft Excel e Google Spreadsheets esportano entrambi in formato CSV, quindi puoi facilmente trasferire dati da fogli di calcolo a tabelle MySQL attraverso l'esportazione / importazione di file 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');
Trovare posizioni con MySQL
Per trovare posizioni nella tabella dei marker che si trovano entro una certa distanza di raggio da una determinata latitudine / longitudine, è possibile utilizzare un'istruzione SELECT basata sulla formula di Haversine. La formula di Haversine viene generalmente utilizzata per calcolare le distanze del grande cerchio tra due coppie di coordinate su una sfera. Wikipedia fornisce una spiegazione matematica approfondita e una buona discussione della formula relativa alla programmazione si trova sul sito di Movable Type.
Ecco l'istruzione SQL che troverà le 20 posizioni più vicine entro un raggio di 25 miglia dalla coordinata 37, -122. Calcola la distanza in base alla latitudine / longitudine di quella riga e alla latitudine / longitudine target, quindi chiede solo le righe in cui il valore della distanza è inferiore a 25, ordina l'intera query in base alla distanza e lo limita a 20 risultati. Per cercare per chilometri invece di miglia, sostituire 3959 con 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;
Questo è quello di trovare latitudini e longitudini a una distanza inferiore a 28 miglia.
Un altro è quello di trovarli a una distanza tra 28 e 29 miglia:
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