Estou trabalhando com dados do mapa e o número Latitude/Longitude
se estende para 8 casas decimais. Por exemplo:
Latitude 40.71727401
Longitude -74.00898606
Vi no documento do Google que usa:
lat FLOAT( 10, 6 ) NOT NULL,
lng FLOAT( 10, 6 ) NOT NULL
no entanto, suas casas decimais só vão para 6.
Devo usar FLOAT(10, 8)
ou existe outro método a considerar para armazenar esses dados para que sejam precisos. Será usado com os cálculos do mapa. Obrigado!
mysql
types
floating-point
Edward
fonte
fonte
float
tipo - que possui apenas 7 dígitos de precisão. Você precisa de pelo menos 9. Você não precisa de 10 - os documentos, por algum motivo estranho, contam o sinal de menos como um dígito. Faça:double(9,6)
oudecimal(9,6)
.FLOAT
distingue dois itens separados por 1,7 m (5,6 pés). Tudo isso é absurdamente excessivo para aplicativos de "mapa"!Respostas:
DECIMAL é o tipo de dados MySQL para aritmética exata. Ao contrário de FLOAT, sua precisão é fixa para qualquer tamanho de número; portanto, ao usá-lo em vez de FLOAT, você pode evitar erros de precisão ao fazer alguns cálculos. Se você estivesse apenas armazenando e recuperando os números sem cálculo, na prática o FLOAT seria seguro, embora não exista nenhum dano ao usar DECIMAL. Com os cálculos, o FLOAT ainda está ok, mas para ter certeza absoluta de 8d.p. precisão, você deve usar DECIMAL.
As latitudes variam de -90 a +90 (graus), então DECIMAL (10, 8) é bom para isso, mas as longitudes variam de -180 a +180 (graus), então você precisa de DECIMAL (11, 8). O primeiro número é o número total de dígitos armazenados e o segundo é o número após o ponto decimal.
Em resumo:
lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL
Isso explica como o MySQL trabalha com tipos de dados de ponto flutuante.
ATUALIZAÇÃO: O MySQL suporta tipos de dados espaciais e
Point
é um tipo de valor único que pode ser usado. Exemplo:fonte
Além disso, você verá que os
float
valores são arredondados.fonte
double
tipo de dados, que possui a precisão necessária.no laravel usado tipo de coluna decimal para migração
para obter mais informações, consulte o tipo de coluna disponível
fonte
Você pode definir seu tipo de dados como número inteiro assinado. Ao armazenar coordenadas no SQL, você pode definir como lat * 10000000 e long * 10000000. E ao selecionar com distância / raio, você dividirá as coordenadas de armazenamento em 10000000. Fiz o teste com 300K linhas, o tempo de resposta da consulta é bom. (CPU de 2 x 2,67 GHz, 2 GB de RAM, MySQL 5.5.49)
fonte
Não use float ... Ele arredondará suas coordenadas, resultando em algumas ocorrências estranhas.
Use decimal
fonte
O MySQL agora tem suporte para tipos de dados espaciais desde que essa pergunta foi feita. Portanto, a resposta atual aceita não está errada, mas se você estiver procurando por funcionalidades adicionais, como encontrar todos os pontos em um determinado polígono, use o tipo de dados POINT.
Confira os documentos do MySQL sobre tipos de dados geoespaciais e as funções de análise espacial
fonte
Eu acredito que a melhor maneira de armazenar Lat / Lng no MySQL é ter uma coluna POINT (tipo de dados 2D) com um índice SPATIAL.
fonte
Usando migrar ruby nos trilhos
fonte
(20,18)
também chega a +/- 99.Código para usar / provar a precisão da resposta de Oğuzhan KURNUÇ .
RESUMO:
Ótima precisão (~ 1cm) em tamanho pequeno (4B).
A precisão é (muito próxima a) 7 dígitos decimais para valores acima do intervalo [-180, 180].
São 7 dígitos à direita do decimal (~ 1 cm) , para um total de 9 dígitos (ou 10 dígitos, se contar o "1" inicial de "180") próximo a -180.
Compare isso com uma flutuação de 4 bytes , que possui apenas ~ 7 dígitos no total, portanto, ~ 5 dígitos à direita do decimal próximo a + = 180 (~ 1m) .
Métodos para usar esta abordagem:
Testes de precisão:
Métodos auxiliares utilizados pelos testes:
fonte