Solução do Google:
Criando a tabela
Ao criar a tabela MySQL, você deseja prestar atenção especial aos atributos lat e lng. Com os recursos atuais de zoom do Google Maps, você só precisa de 6 dígitos de precisão após o decimal. Para manter no mínimo o espaço de armazenamento necessário para sua tabela, você pode especificar que os atributos lat e lng sejam de tamanho flutuante (10,6). Isso permitirá que os campos armazenem 6 dígitos após o decimal, mais até 4 dígitos antes do decimal, por exemplo, -123.456789 graus. Sua tabela também deve ter um atributo id para servir como chave primária.
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 ;
Preenchendo a tabela
Depois de criar a tabela, é hora de preenchê-la com dados. Os dados de amostra fornecidos abaixo são para cerca de 180 pizzarias espalhadas pelos Estados Unidos. No phpMyAdmin, você pode usar a guia IMPORT para importar vários formatos de arquivo, incluindo CSV (valores separados por vírgula). O Microsoft Excel e o Google Spreadsheets exportam para o formato CSV, para que você possa transferir facilmente dados de planilhas para tabelas MySQL através da exportação / importação de arquivos 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');
Localizando locais com MySQL
Para encontrar locais em sua tabela de marcadores que estejam a uma certa distância de raio de uma determinada latitude / longitude, você pode usar uma instrução SELECT com base na fórmula Haversine. A fórmula de Haversine é usada geralmente para calcular distâncias de grandes círculos entre dois pares de coordenadas em uma esfera. Uma explicação matemática detalhada é dada pela Wikipedia e uma boa discussão sobre a fórmula relacionada à programação está no site da Movable Type.
Aqui está a instrução SQL que encontrará os 20 locais mais próximos que estão dentro de um raio de 40 km até a coordenada 37, -122. Ele calcula a distância com base na latitude / longitude dessa linha e na latitude / longitude alvo e, em seguida, solicita apenas linhas onde o valor da distância é menor que 25, ordena toda a consulta por distância e limita a 20 resultados. Para pesquisar por quilômetros em vez de milhas, substitua 3959 por 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;
Este é encontrar latitudes e longitudes a uma distância inferior a 45 quilômetros.
Outra é encontrá-los a uma distância entre 28 e 29 milhas:
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