Tenho latitude e longitude e quero extrair o registro do banco de dados, que tem a latitude e a longitude mais próximas pela distância, se essa distância for maior que a especificada, não o recupere.
Estrutura da tabela:
id
latitude
longitude
place name
city
country
state
zip
sealevel
mysql
sql
coordinates
geospatial
Basit
fonte
fonte
Respostas:
onde [starlat] e [startlng] é a posição em que para iniciar a medição da distância.
fonte
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.
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.
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.
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:
https://developers.google.com/maps/articles/phpsqlsearch_v3#creating-the-map
fonte
HAVING distance < 25
como consultamos locais em um raio de 40 km?Aqui está minha solução completa implementada em PHP.
Esta solução usa a fórmula Haversine, conforme apresentado em http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL .
Note-se que a fórmula de Haversine experimenta fraquezas ao redor dos pólos. Esta resposta mostra como implementar a fórmula de grande distância do círculo grande para contornar isso, no entanto, optei por usar o Haversine porque é bom o suficiente para meus propósitos.
Estou armazenando latitude como DECIMAL (10,8) e longitude como DECIMAL (11,8). Espero que isso ajude!
showClosest.php
./assets/db/db.php
./assets/db/dbSettings.php
Pode ser possível aumentar o desempenho usando um procedimento armazenado do MySQL, conforme sugerido pelo artigo "Pesquisa por distância geográfica com o MySQL" postado acima.
Eu tenho um banco de dados de ~ 17.000 lugares e o tempo de execução da consulta é de 0,054 segundos.
fonte
abs
devem ser removidos. Não é necessário levar o valor abs ao converter de graus em radianos e, mesmo se você o fez, está fazendo isso em apenas uma das latitudes. Por favor, edite-o para corrigir o erro.69
com111,044736
(esqueceu que no comentário acima)Caso você seja preguiçoso como eu, aqui está uma solução combinada com esta e outras respostas no SO.
fonte
bounding_distance
representa? esse valor limita os resultados a uma milha? Então, nesse caso, ele retornará resultados dentro de uma milha?Facil ;)
Apenas substitua as coordenadas pelas necessárias. Os valores devem ser armazenados como o dobro. Este é um exemplo funcional do MySQL 5.x.
Felicidades
fonte
dx+dy
Tente isso, ele mostra os pontos mais próximos das coordenadas fornecidas (dentro de 50 km). Funciona perfeitamente:
Apenas mude
<table_name>
.<userLat>
e<userLon>
Você pode ler mais sobre esta solução aqui: http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
fonte
Você está procurando por coisas como a fórmula de Haversine . Veja aqui também.
Existem outros, mas este é o mais citado.
Se você está procurando algo ainda mais robusto, convém examinar os recursos GIS dos seus bancos de dados. Eles são capazes de algumas coisas legais, como dizer se um ponto (Cidade) aparece dentro de um determinado polígono (Região, País, Continente).
fonte
As respostas originais para a pergunta são boas, mas as versões mais recentes do mysql (MySQL 5.7.6 on) suportam consultas geográficas, então agora você pode usar a funcionalidade incorporada em vez de fazer consultas complexas.
Agora você pode fazer algo como:
Os resultados são retornados,
meters
portanto, se você desejar, emKM
vez de milhas, use em.0001
vez de.000621371192
Os documentos do MySQL estão aqui
fonte
ST_Distance_Sphere
não existe na instalação do meu host (mysql Ver 15.1 Distrib 10.2.23-MariaDB
). Eu li em algum lugar para substituir,ST_Distance
mas as distâncias estão muito longe.ST_Distance_Sphere
Verifique este código com base no artigo Pesquisa por distância geográfica com MySQL :
Exemplo: encontre os 10 hotéis mais próximos da minha localização atual em um raio de 16 quilômetros:
fonte
fonte
Parece que você deseja fazer uma pesquisa de vizinho mais próximo com alguma distância. O SQL não suporta nada parecido, pelo que sei, e você precisaria usar uma estrutura de dados alternativa, como uma árvore R ou kd .
fonte
Encontre usuários mais próximos do meu:
Distância em metros
Baseado na fórmula de Vincenty
Eu tenho tabela de usuário:
sql:
raio da terra: 6371000 (em metros)
fonte
MS SQL Edition aqui:
fonte
Parece que você deve usar PostGIS, SpatialLite, SQLServer2008 ou Oracle Spatial. Todos eles podem responder a essa pergunta para você com SQL espacial.
fonte
Em casos extremos, essa abordagem falha, mas, para o desempenho, pulei a trigonometria e simplesmente calculei a diagonal ao quadrado.
fonte
Esse problema não é muito difícil, mas fica mais complicado se você precisar otimizá-lo.
O que quero dizer é que você tem 100 locais no seu banco de dados ou 100 milhões? Isso faz uma grande diferença.
Se o número de locais for pequeno, tire-os do SQL e entre no código apenas executando ->
Depois de inseri-los no código, calcule a distância entre cada lat / lon e o original com a fórmula Haversine e classifique-a.
fonte