Com que precisão devo armazenar a latitude e a longitude?

103

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?

  1. Item da lista
  2. x00 = 6000 milhas
  3. xx0 = 600 milhas
  4. xxx = 60 milhas
  5. xxx.x = 6 milhas
  6. xxx.xx = 0,6 milhas
  7. etc?
Cidadão
fonte
7
A precisão das coordenadas depende de ONDE essas coordenadas estão, porque a superfície do planeta não é uma esfera perfeita e a distância dos pólos é um fator MAJOR PRINCIPAL também. 3 casas decimais, em média, é cerca de 120 metros / 400 pés. 4 decimais seriam 12 metros / 40 pés, etc ...
Marc B
1
Veja esta pergunta no GIS stackexchange
Flimm

Respostas:

191

Precisão versus casas decimais no equador

decimal  degrees    distance
places
-------------------------------  
0        1.0        111 km
1        0.1        11.1 km
2        0.01       1.11 km
3        0.001      111 m
4        0.0001     11.1 m
5        0.00001    1.11 m
6        0.000001   0.111 m
7        0.0000001  1.11 cm
8        0.00000001 1.11 mm

ref: https://en.wikipedia.org/wiki/Decimal_degrees#Precision

Noushad
fonte
4
Se eles estiverem no equador, isso significa que são erros de pior caso?
Liath de
6
Na verdade, o equador é o melhor caso. Um grau de latitude e um grau de longitude têm o mesmo tamanho no equador (69 milhas), mas um grau de longitude diminui para zero à medida que se aproxima de qualquer um dos pólos. Aqui está uma explicação muito boa: nationalatlas.gov/articles/mapping/a_latlong.html#four
codingoutloud
11
@codingoutloud O que causaria esses erros do pior caso. Ou, para ser pedante, esses são os erros do pior caso para usar lat / lon ao nível do mar. A uma altitude de 6.378 m, o erro aumenta em 0,1%.
Scott B
@codingoutload: Esse link aparentemente não está mais presente :(
Tom Stambaugh
1
@Tom Stambaugh: Existe web.archive.org para isso: web.archive.org/web/20070810120810/http://nationalatlas.gov/…
Stefan Steiger
19
+----------------+-------------+
|    Decimals    |  Precision  |
+----------------+-------------+
|    5           |  1m         |
|    4           |  11m        |
|    3           |  111m       |
+----------------+-------------+

Se você deseja uma precisão de 50 pés (15m), use 4 dígitos. assimdecimal(9,6)

Gustav
fonte
9
Se você estiver usando o SQL Server ... É importante notar que uma precisão de 1-9 usa 5 bytes. Portanto, você pode usar um decimal (9,6) em vez do decimal (7,4) e aproveitar a maior precisão, já que ambos ocupam a mesma quantidade de espaço.
Theo
Para latitude, use (8,6)(ou (6,4)para salvar e salvar um byte (no MySQL).
Rick James
15

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].

Greg
fonte
4
Embora eu concorde que 17 dígitos é demais, sugiro que 6 é muito pouco se os dados forem pós-processados. Ao fazer coisas como uma consulta de raio ("Recursos de resposta em um raio de 0,5 milha deste ponto"), os erros - incluindo truncamento - são ampliados. Se você precisar de 6 dígitos decimais na saída de tal consulta, a entrada deve começar com significativamente mais. Nossa loja costuma usar DECIMAL (18,15). Nosso objetivo é garantir que o db não seja o fator limitante na precisão dos cálculos espaciais.
Tom Stambaugh
Ir além de 6 casas decimais é ir além da precisão disponível dos satélites GPS de hoje. O pós-processamento não introduzirá uma quantidade significativa de erros. DECIMAL(18,15)leva 9 bytes.
Rick James
11

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:

  • 0,01524 / 110,574 = 1/7255 de um grau de latitude
  • 0,01524 / 111,320 = 1/7304 de um grau de longitude

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.

Bill Karwin
fonte
5

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:

   Datatype           Bytes       resolution
   ------------------ -----  --------------------------------
   Deg*100 (SMALLINT)     4  1570 m    1.0 mi  Cities
   DECIMAL(4,2)/(5,2)     5  1570 m    1.0 mi  Cities
   SMALLINT scaled        4   682 m    0.4 mi  Cities
   Deg*10000 (MEDIUMINT)  6    16 m     52 ft  Houses/Businesses
   DECIMAL(6,4)/(7,4)     7    16 m     52 ft  Houses/Businesses
   MEDIUMINT scaled       6   2.7 m    8.8 ft
   FLOAT                  8   1.7 m    5.6 ft
   DECIMAL(8,6)/(9,6)     9    16cm    1/2 ft  Friends in a mall
   Deg*10000000 (INT)     8    16mm    5/8 in  Marbles
   DOUBLE                16   3.5nm     ...    Fleas on a dog

- http://mysql.rjweb.org/doc.php/latlng#representation_choices

Rick James
fonte
3

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.

caótico3quilíbrio
fonte
FLOATe DOUBLE, neste contexto , não sofre de alguns dos problemas que você descreve.
Rick James
@RickJames Você não especificou suficientemente "este contexto". Se você quer dizer, estritamente no armazenamento de um valor em duas colunas do banco de dados, então talvez. No entanto, determinados valores não ficam apenas em colunas DB não utilizadas, a suposição implícita de que haverá consultas (de proximidade) escritas contra esses valores. E sustentar essa suposição razoavelmente pragmática significa que todas as questões de ser uma aproximação não confiável continuam a valer.
chaotic3quilibrium
1
Se um FLOATvalor 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 dois FLOATs(ou DOUBLEsou aproximado DECIMALs) com '='.
Rick James
Você parece estar perdendo o ponto. Qualquer tentativa de consulta usará implicitamente igual, se não explicitamente. E isso pressupõe que você não está passando por outras camadas e linguagens com os valores, permanecendo estritamente dentro do SQL Server. Aqui está uma resposta oficial da Microsoft para o SQL Server: blogs.msdn.microsoft.com/qingsongyao/2009/11/14/…
chaotic3quilibrium
Sinto muito, pensei que a pergunta fosse marcada [mysql], não o SQL Server.
Rick James
2

Se você clicar em locais no Google Maps, obterá latitude e longitude com 7 casas decimais

Selvagem
fonte