geolocalizacion - tipo de dato para latitud y longitud mysql
¿Con qué precisión debo guardar la latitud y la longitud? (6)
Estaba leyendo esta pregunta aquí:
¿Qué tipo de datos usar al almacenar datos de latitud y longitud en bases de datos SQL?
Y parece que el consenso general es que usar Decimal (9,6) es el camino a seguir. La pregunta para mí es, ¿qué tan preciso realmente lo necesito?
Por ejemplo, la API de Google arroja un resultado como:
"lat": 37.4219720,
"lng": -122.0841430
Fuera de -122.0841430, ¿cuántos dígitos necesito? He leído varias guías pero no les puedo dar suficiente sentido para resolver esto.
Para ser más preciso en mi pregunta: si quiero ser preciso dentro de los 50 pies de la ubicación exacta, ¿cuántos puntos decimales debo almacenar?
Quizás una pregunta mejor en realidad sería una pregunta que no sea de programación, pero sería: ¿cuánto más exacto te da cada punto decimal?
¿Es esto simple?
- Artículo de lista
- x00 = 6000 millas
- xx0 = 600 millas
- xxx = 60 millas
- xxx.x = 6 millas
- xxx.xx = .6 millas
- etc?
Diseño bases de datos y he estado estudiando esta cuestión por un tiempo. Utilizamos una aplicación estándar con un back-end de Oracle donde los campos de datos se definieron para permitir 17 decimales. ¡Ridículo! Eso está en milésimas de pulgada. Ningún instrumento GPS en el mundo es tan preciso. Así que dejemos de lado 17 decimales y tratemos con lo práctico. El Gobierno garantiza que su sistema es bueno para "el peor de los casos" "precisión de pseudodistancia de 7,8 metros con un nivel de confianza del 95%", pero continúa diciendo que la FAA real (utilizando sus instrumentos de alta calidad) ha demostrado que las lecturas de GPS suelen ser buenas para dentro de un metro.
Entonces debes hacerte dos preguntas: 1) ¿Cuál es la fuente de tus valores? 2) ¿Para qué se usarán los datos?
Los teléfonos celulares no son particularmente precisos, y las lecturas de Google / MapQuest probablemente solo sean buenas para 4 o 5 decimales. Un instrumento GPS de alta calidad puede obtener 6 (dentro de los Estados Unidos). Pero capturar más que eso es un desperdicio de espacio de tipeo y almacenamiento. Además, si se realizan búsquedas en los valores, es bueno que el usuario sepa que 6 sería lo máximo que debería buscar (obviamente, cualquier valor de búsqueda ingresado debe redondearse con la misma precisión que el valor de los datos que se busca )
Además, si lo único que vas a hacer es ver una ubicación en Google Maps o ponerla en un GPS para llegar allí, cuatro o cinco es suficiente.
Tengo que reírme de la gente que está por aquí ingresando todos esos dígitos. ¿Y dónde exactamente están tomando esa medida? ¿Perilla de la puerta delantera? Buzón de salida? Centro de construcción? ¿Arriba de la torre celular? Y ... ¿todos lo toman constantemente en el mismo lugar?
Como un buen diseño de base de datos, aceptaría valores de un usuario para quizás más de cinco dígitos decimales, luego redondé y capté solo cinco para coherencia [tal vez seis si sus instrumentos son buenos y su uso final lo justifica].
La distancia entre cada grado de latitud varía debido a la forma de la tierra y la distancia entre cada grado de longitud se reduce a medida que te acercas a los polos. Así que hablemos del ecuador, donde la distancia entre cada grado es de 110.574 km para la latitud y de 111.320 km para la longitud.
50 pies es 0.01524km, entonces:
- 0.01524 / 110.574 = 1/7255 de un grado de latitud
- 0.01524 / 111.320 = 1/7304 de un grado de longitud
Necesita cuatro dígitos de escala, suficientes para bajar a diez milésimas de grado, con un total de siete dígitos de precisión.
DECIMAL(7,4)
debe ser suficiente para sus necesidades.
No almacene valores de coma flotante. Si bien puede suponer que son precisos, no lo son. Ellos son una aproximación. Y resulta que los diferentes lenguajes tienen diferentes métodos para "analizar" la información del punto flotante. Y diferentes bases de datos tienen diferentes métodos para implementar las aproximaciones de valores.
En cambio, usa un Geohash . Este video presenta y explica visualmente el Geohash en menos de 5 minutos. El Geohash es, con mucho, la mejor forma de codificar / decodificar información de longitud / latitud de manera consistente. Al nunca "serializar" los valores de coma flotante aproximados de una longitud / latitud en las columnas de la base de datos y, en cambio, usar un Geohash, obtendrá las mismas garantías deseables de coherencia de ida y vuelta que obtiene con los valores de Cadena. Este sitio web es ideal para ayudarlo a jugar con un Geohash.
Precisión versus lugares decimales en el ecuador
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
Teniendo en cuenta las diversas partes de una esfera y una distancia diagonal, aquí hay una tabla de las precisiones disponibles:
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
+----------------+-------------+
| Decimals | Precision |
+----------------+-------------+
| 5 | 1m |
| 4 | 11m |
| 3 | 111m |
+----------------+-------------+
Si desea una precisión de 50 pies (15 m), obtenga 4 dígitos. Entonces decimal(9,6)