¿Con qué precisión debo almacenar la latitud y la longitud?

103

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 necesito esto?

Por ejemplo, la API de Google devuelve un resultado como:

"lat": 37.4219720,
"lng": -122.0841430

De -122.0841430, ¿cuántos dígitos necesito? He leído varias guías, pero no puedo encontrarles 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 necesito almacenar?

Quizás una pregunta mejor sería en realidad una pregunta que no sea de programación, pero sería: ¿cuánto más preciso le da cada punto decimal?

¿Es así de simple?

  1. Elemento de lista
  2. x00 = 6000 millas
  3. xx0 = 600 millas
  4. xxx = 60 millas
  5. xxx.x = 6 millas
  6. xxx.xx = .6 millas
  7. etc?
Ciudadano
fuente
7
La precisión de las coordenadas depende de DONDE están esas coordenadas, porque la superficie del planeta no es una esfera perfecta y la distancia desde los polos también es un factor IMPORTANTE. Sin embargo, 3 posiciones decimales, en promedio, son aproximadamente 120 metros / 400 pies. 4 decimales serían 12 metros / 40 pies, etc ...
Marc B
1
Vea esta pregunta en GIS stackexchange: gis.stackexchange.com/questions/8650/…
Flimm

Respuestas:

191

Precisión frente a 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

Noushad
fuente
4
Si están en el ecuador, ¿significa eso que se trata de los peores errores de caso?
Liath
6
En realidad, el ecuador es el mejor de los casos. Un grado de latitud y un grado de longitud son del mismo tamaño en el ecuador (69 millas), pero un grado de longitud se reduce a cero cuando se acerca a cualquiera de los polos. Aquí hay una explicación muy agradable: nationalatlas.gov/articles/mapping/a_latlong.html#four
codingoutloud
11
@codingoutloud Lo que haría estos errores en el peor de los casos. O para ser pedante, estos son los peores errores de caso al usar lat / lon al nivel del mar. A una altura de 6.378 m, el error aumenta en un 0,1%.
Scott B
@codingoutload: Ese enlace aparentemente ya no está presente :(
Tom Stambaugh
1
@Tom Stambaugh: Hay web.archive.org para eso: web.archive.org/web/20070810120810/http://nationalatlas.gov/…
Stefan Steiger
19
+----------------+-------------+
|    Decimals    |  Precision  |
+----------------+-------------+
|    5           |  1m         |
|    4           |  11m        |
|    3           |  111m       |
+----------------+-------------+

Si desea una precisión de 50 pies (15 m), elija 4 dígitos. Entoncesdecimal(9,6)

Gustav
fuente
9
Si está utilizando SQL Server ... Vale la pena señalar que una precisión de 1-9 usa 5 bytes. Por lo tanto, puede usar un decimal (9,6) en lugar de un decimal (7,4) y aprovechar la mayor precisión, ya que ambos ocupan la misma cantidad de espacio.
Theo
Para latitud, use (8,6)(o (6,4)para guardar guardar un byte (en MySQL).
Rick James
15

Diseño bases de datos y he estado estudiando esta cuestión durante un tiempo. Usamos una aplicación lista para usar con un backend de Oracle donde los campos de datos se definieron para permitir 17 lugares decimales. ¡Ridículo! Eso está en milésimas de pulgada. Ningún instrumento GPS en el mundo es tan preciso. Así que dejemos a un lado 17 lugares decimales y tratemos con la práctica. El Gobierno garantiza que su sistema es bueno para "un" peor caso "con una precisión de pseudodistancia de 7.8 metros a un nivel de confianza del 95%", pero luego continúa diciendo que la FAA real (usando sus instrumentos de alta calidad) ha demostrado que las lecturas de GPS generalmente son buenas para dentro de un metro.

Así que tienes que hacerte dos preguntas: 1) ¿Cuál es la fuente de tus valores? 2) ¿Para qué se utilizarán los datos?

Los teléfonos móviles no son particularmente precisos y las lecturas de Google / MapQuest probablemente solo sean buenas hasta 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 una pérdida de espacio para escribir y almacenar. Además, si se realiza alguna búsqueda en los valores, es bueno que un usuario sepa que 6 sería lo máximo que debería buscar (obviamente, cualquier valor de búsqueda ingresado debe redondearse primero con la misma precisión que el valor de los datos que se buscan ).

Además, si todo lo que vas a hacer es ver una ubicación en Google Maps o ponerla en un GPS para llegar allí, cuatro o cinco son suficientes.

Tengo que reírme de que la gente de aquí ingrese todos esos dígitos. ¿Y dónde exactamente están tomando esa medida? ¿Pomo de la puerta de entrada? ¿Buzón en el frente? ¿Centro del edificio? ¿Parte superior 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 de tal vez unos pocos más de cinco dígitos decimales, luego redondearía y capturaría solo cinco para lograr coherencia [tal vez seis si sus instrumentos son buenos y su uso final lo justifica].

Greg
fuente
4
Si bien estoy de acuerdo en que 17 dígitos es demasiado, sugiero que 6 es demasiado poco si los datos se van a posprocesar. Al hacer cosas como una consulta de radio ("Funciones de respuesta dentro de un radio de 0,5 millas de este punto"), los errores, incluido el truncamiento, se amplían. Si necesita 6 dígitos decimales en la salida de dicha consulta, entonces la entrada debería comenzar con significativamente más. Nuestra tienda suele utilizar DECIMAL (18,15). Nuestro objetivo es asegurar que la base de datos no sea el factor limitante en la precisión de los cálculos espaciales.
Tom Stambaugh
Ir más allá de los 6 lugares decimales va más allá de la precisión disponible de los satélites GPS actuales. El procesamiento posterior no introducirá una cantidad significativa de errores. DECIMAL(18,15)toma 9 bytes.
Rick James
11

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 hace más pequeña a medida que te acercas a los polos. Entonces, hablemos del ecuador, donde la distancia entre cada grado es 110,574 km para la latitud y 111,320 km para la longitud.

50 pies son 0.01524 km, 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) debería ser suficiente para sus necesidades.

Bill Karwin
fuente
5

Teniendo en cuenta las distintas 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

Rick James
fuente
3

No almacene valores de coma flotante. Si bien puede suponer que son precisos, no lo son. Son una aproximación. Y resulta que diferentes lenguajes tienen diferentes métodos de "analizar" la información de punto flotante. Y diferentes bases de datos tienen diferentes métodos para implementar las aproximaciones de valores.

En su lugar, use un Geohash . Este video presenta y explica visualmente el Geohash en menos de 5 minutos. El Geohash es, CON MUCHO, la forma superior de codificar / decodificar información de longitud / latitud de una manera consistente. Al nunca "serializar" los valores de punto flotante aproximados de una longitud / latitud en columnas de la base de datos y, en su lugar, utilizando un Geohash, obtendrá las mismas garantías deseables de consistencia de ida y vuelta que obtiene con los valores de cadena. Este sitio web es ideal para ayudarte a jugar con un Geohash.

equilibrio caótico
fuente
FLOATy DOUBLE, en este contexto , no sufre algunos de los problemas que describe.
Rick James
@RickJames No especificaste suficientemente "este contexto". Si se refiere estrictamente al almacenamiento de un valor en dos columnas DB, entonces quizás. Sin embargo, los valores dados no solo se ubican en columnas de base de datos sin usar, la suposición implícita de que habrá consultas (de proximidad) escritas contra estos valores. Y sostener esta suposición bastante pragmática significa que todos los problemas de que sea una aproximación poco confiable continúan siendo válidos.
chaotic3quilibrium
1
Si un FLOATvalor y el valor 'siguiente' están tan cerca uno del otro en valor que no puede distinguir una ciudad (o vehículo o persona o pulga) de otra, entonces los errores de redondeo y representación no importan. Mientras tanto, casi siempre es una locura comparar dos FLOATs( DOUBLEso aproximadamente DECIMALs) con '='.
Rick James
Pareces estar perdiendo el punto. Cualquier intento de consulta se utilizará implícitamente como iguales, si no explícitamente. Y esto supone que no está pasando por otras capas y lenguajes con los valores, permaneciendo estrictamente dentro de SQL Server. Aquí hay una respuesta oficial de Microsoft a esto para SQL Server: blogs.msdn.microsoft.com/qingsongyao/2009/11/14/…
chaotic3quilibrium
Lo siento, pensé que la pregunta estaba etiquetada [mysql], no SQL Server.
Rick James
2

Si hace clic en ubicaciones en Google Maps, obtiene la latitud y la longitud con 7 lugares decimales

Salvaje
fuente