Tipos de datos para almacenar lng / lat en MySQL

14

Estoy almacenando una gran lista de puntos lnt / lat en una base de datos MySQL. Por el momento, estos son puntos proyectados para el Reino Unido en M, pero a largo plazo me gustaría asegurarme de que puedo almacenar las coordenadas de puntos para todo el mundo. ¿Qué tipo de datos debo usar?

Empecé a usar decimal(18,12), pero no estaba seguro de si se necesita esta precisión o si podría usar a float. Incluí mi código, en caso de que haya algo más que debería considerar:

CREATE TABLE UKTest
(
lat FLOAT,
lng FLOAT
)

Soy bastante nuevo en SQL, así que no estoy seguro de si el tipo de datos es significativo al ejecutar una consulta. Supuse que la memoria general variaría según el tipo de variable. ¿Hay alguna ventaja de usar una base de datos espacial sobre una base de datos MySQL básica para este tipo de trabajo?

djq
fuente

Respuestas:

16

Esta pregunta también se hizo en StackOverlow .

La respuesta principal sugiere las extensiones espaciales de MySQL . Hay un montón de enlaces en el trabajo con estas extensiones aquí .

Si no desea utilizar tipos espaciales y está obteniendo valores de una unidad GPS o un servicio de geocodificación, puede hacer coincidir su precisión decimal con la fuente de datos. Una regla general es almacenar datos con una precisión de dos lugares mayor que la que se mostrará en una aplicación.

En un ejemplo de código de Google que muestra puntos en un mapa, dicen:

Cuando crea la tabla MySQL, desea prestar especial atención a los atributos lat y lng. Con las capacidades de zoom actuales de Google Maps, solo debería necesitar 6 dígitos de precisión después del decimal.

Para mantener al mínimo el espacio de almacenamiento requerido para nuestra tabla, puede especificar que los atributos lat y lng sean flotantes de tamaño (10,6). Eso permitirá que los campos almacenen 6 dígitos después del decimal, más hasta 4 dígitos antes del decimal, por ejemplo -123.456789 grados

No me preocuparía por las diferencias de rendimiento entre los tipos numéricos. Los índices decentes tendrán un efecto mucho mayor.

geographika
fuente
+1 para una buena respuesta! Esto es lo que habría dicho y hecho.
OptimizePrime
Gracias por la respuesta: he leído la documentación de Extensiones espaciales de MySQL, pero ¿cómo empiezas a usarlas? Solo tengo una base de datos MySQL predeterminada en GoDaddy; No sé por dónde debería comenzar.
DJ
1
@celenius maisonbisson.com/blog/post/12147/…
geographika
1
Y la respuesta actualizada con un enlace a más enlaces
geographika
¿Por qué 4 dígitos enteros?
Alix Axel
6

A menos que esté vinculado a MySQL por alguna otra razón, debería considerar usar una base de datos espacialmente habilitada como postgis que tenga un objeto Point (y Line, Polygon, etc.) para manejar estos detalles por usted. También obtienes soporte de proyección para cuando haces ese cambio en todo el mundo.

2019 : para personas como yo que tampoco leen comentarios: MySQL admite tipos de datos espaciales, supuestamente más lentos, sin evidencia.

Ian Turton
fuente
Nota: Para aquellos que son nuevos y leen lo anterior, MySql 5.7+ ahora funciona con índices espaciales.
HopeKing
pero aún es lento
Ian Turton
¿Podrías ayudarme con recursos que muestran cuán lento? Estoy considerando usarlo en un proyecto con menos de un millón de registros. Gracias.
HopeKing
experiencia personal sin datos públicos. Demasiados problemas con geometrías inválidas, etc. rompiendo cosas
Ian Turton
Gracias. Mi necesidad es solo la distancia entre los puntos en función de los registros de la base de datos (y no de requisitos complejos como Polygon); por lo tanto, probablemente sea seguro usar mysql por ahora.
HopeKing