13 votos

Cálculo de la longitud correcta cuando se supera | 180 |?

Estoy tratando de desarrollar una "fórmula" para corregir el lat-lng valores.

Estoy usando vue-prospecto, pero cuando te desplazas fuera del "primer" mundo de llegar a grandes números. Por encima de +180 o bajo -180.

Por ejemplo: cuando yo pan a los estados unidos a la derecha (dirección este), me sale como gnl 215. En mi mente, acabo de corregirlo con 215-360=-145

La misma es para cuando la sartén para que el oriente de rusia a la izquierda (en dirección oeste) y me sale por ejemplo -222. Ahora tengo que calcular -222+360=138

Sin embargo, desde que el mundo es de carácter indefinido, el usuario puede sartén para que el 8 de mundo y tuve que ajustar los valores.

Es posible calcular el derecho de longitud? (y otro requisito es cuando el usuario está en el primer mundo, 24 de gnl todavía debe ser de 24 de gnl.

19voto

Adam Ernst Puntos 6939

Debe agregar (o restar) 360 repetidamente a su valor hasta que se encuentre en el rango de -180 - 180. Por lo general, un par de bucles como:

 lon = -187;
while(lon < -180){
  lon +=360;
}
while (lon > 180){
  lon -= 360;
}
 

18voto

Tamlyn Puntos 2728

Una respuesta que evita las condicionales y las llamadas a la función:

longitude = (longitude % 360 + 540) % 360 - 180

Escribí un rápido microbenchmark en https://jsperf.com/longitude-normalisation y el código condicional parece ser más rápido (en Chrome en mi máquina) para 'razonable' los rangos de valores de entrada. En general, usted probablemente no debería ser preocupante en avanzar sobre el desempeño en la pequeña cálculos como este, dando más peso a la legibilidad y coherencia con el resto de su código base.

Probablemente más importante en este caso es la cuestión de si el código podría venir alguna vez a través extrema de los valores de entrada (1e10, Infinity, etc.). Si es así, el bucle de ejecución podría terminar de correr muy lentamente o de forma silenciosa colgando de su programa. Esto puede ocurrir con los cálculos realizados cerca de los polos, por ejemplo, tratando de pan al este o al oeste por algunas distancia (en lugar de ángulo) de un polo podría fácilmente resultar en un infinito de longitud.

5voto

Sean Madsen Puntos 163

Un trazador de líneas:

 normalized = remainder(longitude, 360);
 

Explicación: Desea saber qué queda después de ignorar las rotaciones completas (360 °).

Este proceso se llama normalización.

Ejemplo (cpp.sh)

0voto

Brendon Puntos 166

Otra opción: longitud = atan2 (cos (long), sin (long))

0voto

Ciredigital Puntos 59

Si el lenguaje de programación que usa es compatible con el % (mod) operador de números de punto flotante (como Python y Ruby), me gustaría recomendar el uso que. De lo contrario, algunos otros lenguajes (como C y C++) permitir el uso de fmod().

(Lo que el operador mod que use, asegúrese antes de tiempo que va a hacer el mod de las operaciones sobre los números de punto flotante, y que siempre te dan la no-respuestas negativas. De lo contrario obtendrá una desagradable sorpresa más tarde, cuando muchos de sus lat/lon puntos no son correctos).

El uso de esta forma:

# Put the longitude in the range of [0,360):
longitude %= 360

# Put the longitude in the range of [-180,180):
if longitude >= 180:
    longitude -= 360

Si usted prefiere hacer todo en una sola línea:

# Put the longitude in the range of [-180,180):
longitude = (longitude + 180) % 360 - 180

Estos enfoques no tienen bucles, por lo que van a normalizar la longitud de valores, sin necesidad de añadir repetidamente o restar, no importa cuántas veces la observación se ha centrado alrededor de la tierra.

Editar:

Hmmm... me di cuenta de que Javascript no parece manejar % con valores negativos como pensé que lo haría.

En ese caso, pruebe este one-liner:

longitude = (longitude + 36180) % 360 - 180

El 36180 estamos añadiendo es de 36.000 + 180. Los 36.000 es para mover un valor negativo hacia el positivo de dominio, y el 180 es cambiar de manera que cuando se modded por 360, que va a estar en el rango de [0,360). El - 180 parte turnos de nuevo a la gama de [-180,180).

He aquí otro one-liner, que no dependen de 36,000 ser lo suficientemente grande:

longitude = (longitude % 360 + 360 + 180) % 360 - 180

El longitude % 360 + 360 parte se asegurará de que el valor se queda en el positivo de dominio cuando más tarde modded por 360. El + 180 parte turnos de manera que cuando más tarde obtiene 180 resta (con - 180), que va a estar en el rango deseado de [-180,180).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X