Eu estava lendo esta pergunta aqui:
Que tipo de dados usar ao armazenar dados de latitude e longitude em bancos de dados SQL?
E parece que o consenso geral é que usar Decimal (9,6) é o caminho a percorrer. A questão para mim é: quão preciso eu realmente preciso disso?
Por exemplo, a API do Google retorna um resultado como:
"lat": 37.4219720,
"lng": -122.0841430
De -122,0841430, quantos dígitos eu preciso? Eu li vários guias, mas não consigo entendê-los o suficiente para descobrir isso.
Para ser mais preciso na minha pergunta: se eu quiser ter uma precisão de até 50 pés do local exato, quantas casas decimais preciso armazenar?
Talvez uma pergunta melhor fosse na verdade uma pergunta que não é de programação, mas seria: quanto mais precisão cada ponto decimal oferece?
É simples assim?
- Item da lista
- x00 = 6000 milhas
- xx0 = 600 milhas
- xxx = 60 milhas
- xxx.x = 6 milhas
- xxx.xx = 0,6 milhas
- etc?
mysql
geolocation
Cidadão
fonte
fonte
Respostas:
Precisão versus casas decimais no equador
ref: https://en.wikipedia.org/wiki/Decimal_degrees#Precision
fonte
Se você deseja uma precisão de 50 pés (15m), use 4 dígitos. assim
decimal(9,6)
fonte
(8,6)
(ou(6,4)
para salvar e salvar um byte (no MySQL).Eu projeto bancos de dados e venho estudando essa questão há algum tempo. Usamos um aplicativo de prateleira com um back-end Oracle, onde os campos de dados foram definidos para permitir 17 casas decimais. Ridículo! Isso está na casa dos milésimos de polegada. Nenhum instrumento GPS no mundo é tão preciso. Portanto, vamos deixar de lado 17 casas decimais e lidar com questões práticas. O governo garante que seu sistema é bom para "um" pior caso ", precisão de pseudo-faixa de 7,8 metros a um nível de confiança de 95%", mas depois diz que a FAA real (usando seus instrumentos de alta qualidade) mostrou que as leituras de GPS geralmente são boas para dentro de um metro.
Portanto, você deve se perguntar duas coisas: 1) Qual é a fonte de seus valores? 2) Para que os dados serão usados?
Os telefones celulares não são particularmente precisos e as leituras do Google / MapQuest provavelmente só chegam a 4 ou 5 casas decimais. Um instrumento GPS de alta qualidade pode render 6 (nos Estados Unidos). Mas capturar mais do que isso é um desperdício de digitação e espaço de armazenamento. Além disso, se alguma pesquisa for feita nos valores, é bom para o usuário saber que 6 é o máximo que ele deve procurar (obviamente, qualquer valor de pesquisa inserido deve primeiro ser arredondado para a mesma precisão do valor de dados que está sendo pesquisado )
Além disso, se tudo o que você vai fazer é visualizar um local no Google Maps ou colocá-lo em um GPS para chegar lá, quatro ou cinco são suficientes.
Tenho que rir das pessoas por aqui digitando todos esses dígitos. E onde exatamente eles estão fazendo essa medição? Maçaneta da porta da frente? Caixa de correio na frente? Centro de construção? Topo da torre de celular? E ... está todo mundo tomando consistentemente no mesmo lugar?
Como um bom projeto de banco de dados, eu aceitaria valores de um usuário para talvez alguns mais de cinco dígitos decimais, então arredondaria e capturaria apenas cinco para consistência [talvez seis se seus instrumentos forem bons e seu uso final justificar].
fonte
DECIMAL(18,15)
leva 9 bytes.A distância entre cada grau de latitude varia devido ao formato da Terra e a distância entre cada grau de longitude fica menor à medida que você se aproxima dos pólos. Então, vamos falar sobre o equador, onde a distância entre cada grau é 110,574km para latitude e 111,320km para longitude.
50 pés é 0,01524 km, então:
Você precisa de quatro dígitos de escala, o suficiente para descer até dez milésimos de grau, com um total de sete dígitos de precisão.
DECIMAL(7,4)
deve ser suficiente para suas necessidades.fonte
Levando em consideração as várias partes de uma esfera e uma distância diagonal, aqui está uma tabela das precisões disponíveis:
- http://mysql.rjweb.org/doc.php/latlng#representation_choices
fonte
Não armazene valores de ponto flutuante. Embora você possa presumir que eles sejam precisos, eles não são. Eles são uma aproximação. E acontece que linguagens diferentes têm métodos diferentes de "análise" das informações de ponto flutuante. E bancos de dados diferentes têm métodos diferentes de implementação de aproximações de valor.
Em vez disso, use um Geohash . Este vídeo apresenta e explica visualmente o Geohash em menos de 5 minutos. O Geohash é de longe a forma superior de codificar / decodificar informações de longitude / latitude de forma consistente. Nunca "serializando" os valores aproximados de ponto flutuante de uma longitude / latitude em colunas de banco de dados e, em vez disso, usando um Geohash, você obterá as mesmas garantias desejáveis de consistência de ida e volta que obtém com valores de String. Este site é ótimo para ajudá-lo a brincar com um Geohash.
fonte
FLOAT
eDOUBLE
, neste contexto , não sofre de alguns dos problemas que você descreve.FLOAT
valor e o valor 'próximo' são tão próximos um do outro em valor que você não consegue diferenciar uma cidade (ou veículo, pessoa ou pulga) de outro, então os erros de arredondamento e representação não importam. Enquanto isso, é quase sempre tolice comparar doisFLOATs
(ouDOUBLEs
ou aproximadoDECIMALs
) com '='.[mysql]
, não o SQL Server.Se você clicar em locais no Google Maps, obterá latitude e longitude com 7 casas decimais
fonte