Googles Lösung:
Tabelle erstellen
Wenn Sie die MySQL-Tabelle erstellen, möchten Sie den Attributen lat und lng besondere Aufmerksamkeit widmen. Mit den aktuellen Zoomfunktionen von Google Maps sollten Sie nach der Dezimalstelle nur 6 Stellen Genauigkeit benötigen. Um den für Ihre Tabelle erforderlichen Speicherplatz auf ein Minimum zu beschränken, können Sie angeben, dass die Attribute lat und lng Floats der Größe (10,6) sind. Dadurch können die Felder 6 Stellen nach der Dezimalstelle sowie bis zu 4 Stellen vor der Dezimalstelle speichern, z. B. -123,456789 Grad. Ihre Tabelle sollte auch ein ID-Attribut haben, das als Primärschlüssel dient.
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 ;
Den Tisch füllen
Nach dem Erstellen der Tabelle ist es Zeit, sie mit Daten zu füllen. Die unten angegebenen Beispieldaten beziehen sich auf etwa 180 in den USA verteilte Pizzarias. In phpMyAdmin können Sie auf der Registerkarte IMPORT verschiedene Dateiformate importieren, einschließlich CSV (durch Kommas getrennte Werte). Microsoft Excel und Google Spreadsheets werden beide in das CSV-Format exportiert, sodass Sie durch Exportieren / Importieren von CSV-Dateien problemlos Daten aus Tabellenkalkulationen in MySQL-Tabellen übertragen können.
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');
Suchen von Standorten mit MySQL
Um Positionen in Ihrer Markertabelle zu finden, die sich innerhalb eines bestimmten Radiusabstands zu einem bestimmten Breiten- / Längengrad befinden, können Sie eine SELECT-Anweisung verwenden, die auf der Haversine-Formel basiert. Die Haversine-Formel wird allgemein zur Berechnung von Großkreisabständen zwischen zwei Koordinatenpaaren auf einer Kugel verwendet. Eine ausführliche mathematische Erklärung wird von Wikipedia gegeben, und eine gute Diskussion der Formel in Bezug auf die Programmierung finden Sie auf der Website von Movable Type.
Hier ist die SQL-Anweisung, die die nächsten 20 Positionen findet, die sich in einem Radius von 25 Meilen zur 37, -122-Koordinate befinden. Es berechnet die Entfernung basierend auf dem Breiten- / Längengrad dieser Zeile und dem Zielbreiten- / Längengrad und fragt dann nur nach Zeilen, bei denen der Entfernungswert weniger als 25 beträgt, ordnet die gesamte Abfrage nach Entfernung und begrenzt sie auf 20 Ergebnisse. Um nach Kilometern statt nach Meilen zu suchen, ersetzen Sie 3959 durch 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;
Dieser soll Breiten- und Längengrade in einer Entfernung von weniger als 28 Meilen finden.
Eine andere ist, sie in einer Entfernung zwischen 28 und 29 Meilen zu finden:
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