Tipo de dados decimal ou ponto para armazenar dados de localização geográfica no MySQL

8

Quero armazenar a localização geográfica para cada endereço na minha tabela "tblAddress" do MySQL (Innodb) e acho que tenho 2 Opções:

1) 2 columns for Each Address:
Latitude DECIMAL(10, 8), 
Longitude DECIMAL(11, 8)

2) One Column for Each Address:
GeoLocation POINT

Meu programa precisa encontrar todos os endereços que se enquadram em 1 quilômetro de raio do local atual (cliente móvel).

Também o comando abaixo não funciona para mim, não tenho certeza do que preciso ter para isso.

CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation);

Então, qual é a abordagem sugerida para armazenar dados para um cálculo e recuperação mais rápidos aqui. Por favor informar.

Prabhat
fonte

Respostas:

6

Você pode usar as extensões espaciais do MySQL com GIS.

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 o espaço de armazenamento necessário para nossa tabela no mínimo, 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. Não me preocuparia com as diferenças de desempenho entre os tipos numéricos. Índices decentes terão um efeito muito maior.

Você também pode tentar DECIMALcomo @ gandaliter sugere.

DECIMALé o tipo de dados MySQL para aritmética exata. Ao contrário, FLOATsua precisão é fixa para qualquer tamanho de número; portanto, ao usá-lo, FLOATvocê 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 FLOAT seria seguro, embora não haja mal em usá-lo DECIMAL. Com os cálculos FLOATainda é praticamente bom, mas para ter certeza absoluta de 8d.p. precisão que você deve usar DECIMAL.

As latitudes variam de -90 a +90 (graus), então DECIMAL(10,8)tudo bem, mas as longitudes variam de -180 a +180 (graus), então você precisa 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. Resumindo: lat DECIMAL(10,8) NOT NULL, lng DECIMAL(11,8) NOT NULL Isso explica como o MySQL funciona com tipos de dados de ponto flutuante.

Informação relacionada:

oNare
fonte
Obrigado @oNare por suas explicações e referências detalhadas. Eu vi a sugestão de gandaliter na pergunta ( stackoverflow.com/questions/12504208/… ). Também vi a sugestão do ypercube aqui ( stackoverflow.com/questions/9560147/… ).
Prabhat