Tipos de dados para armazenar lng / lat no MySQL

14

Estou armazenando uma grande lista de pontos lnt / lat em um banco de dados MySQL. No momento, esses são pontos projetados para o Reino Unido em M, mas, a longo prazo, gostaria de garantir que eu possa armazenar as coordenadas dos pontos em todo o mundo. Que tipo de dados devo usar?

Comecei a usar decimal(18,12), mas não tinha certeza se essa precisão é necessária ou se eu poderia apenas usar a float. Incluí meu código, caso haja mais alguma coisa que eu deva considerar:

CREATE TABLE UKTest
(
lat FLOAT,
lng FLOAT
)

Eu sou bastante novo no SQL, portanto, não tenho certeza se o tipo de dados é significativo ao executar uma consulta. Eu assumi que a memória geral variaria com base no tipo de variável. Existe um benefício em usar um banco de dados espacial sobre um banco de dados MySQL básico para esse tipo de trabalho?

djq
fonte

Respostas:

16

Esta pergunta também foi feita no StackOverlow .

A resposta principal sugere as extensões espaciais do MySQL . Há muitos links para trabalhar com essas extensões aqui .

Se você não quiser usar tipos espaciais e estiver obtendo valores de uma unidade GPS ou serviço de geocodificação, poderá corresponder sua precisão decimal à fonte de dados. Uma regra geral prática é armazenar dados com uma precisão de dois lugares maior do que você os exibirá em um aplicativo.

Em um exemplo de código do Google que exibe pontos em um mapa, eles declaram:

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 nossa 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

Eu não me preocuparia com diferenças de desempenho entre tipos numéricos. Índices decentes terão um efeito muito maior.

geographika
fonte
+1 para uma boa resposta! Isto é o que eu teria dito e feito.
OptimizePrime
Obrigado pela resposta - li a documentação das Extensões espaciais do MySQL, mas como você as utiliza? Eu só tenho um banco de dados MySQL padrão no GoDaddy; Não sei por onde devo começar.
DJQ
1
@celenius maisonbisson.com/blog/post/12147/…
geographika
1
E resposta atualizada com um link para mais links
geographika
Por que 4 dígitos inteiros?
Alix Axel
6

A menos que você esteja vinculado ao MySQL por algum outro motivo, considere realmente usar um banco de dados espacialmente ativado, como o postgis, que possui um objeto Point (and Line, Polygon etc) para lidar com esses detalhes. Você também recebe suporte para projeção quando faz essa alteração no mundo inteiro.

2019 : Para pessoas como eu, que também não leem comentários - o MySQL suporta tipos de dados espaciais, supostamente mais lentos, sem evidências.

Ian Turton
fonte
Nota: Para quem é novo e está lendo o que foi dito acima, o MySql 5.7+ agora trabalha com índices espaciais.
HopeKing
mas ainda é lento
Ian Turton
Você poderia ajudar com recursos que mostram o quão lento? Estou pensando em usá-lo em um projeto com menos de um milhão de registros. Obrigado.
HopeKing
experiência pessoal sem dados públicos. Demasiados problemas com geometrias inválidas etc quebrar as coisas
Ian Turton
Obrigado. Minha necessidade é apenas a distância entre os pontos com base nos registros do banco de dados (e sem requisitos complexos como o Polygon); portanto, provavelmente será seguro usar o mysql por enquanto.
HopeKing