Saltar al contenido

Cálculo de coordenadas dado un rumbo y una distancia

Esta reseña ha sido analizado por especialistas para asegurar la exactitud de este ensayo.

Solución:

Parece que estos son los problemas en su código:

  1. Necesitas convertir lat1 y lon1 a radianes antes de llamar a su función.
  2. Puedes estar escalando radialDistance incorrectamente.
  3. Probar la igualdad de un número de coma flotante es peligroso. Dos números que son iguales después de la aritmética exacta pueden no ser exactamente iguales después de la aritmética de coma flotante. Por lo tanto abs(x-y) < threshold es más seguro que x == y para probar dos números de coma flotante x y y por la igualdad
  4. Creo que quieres convertir lat y lon de radianes a grados.

Aquí está mi implementación de su código en Python:

#!/usr/bin/env python

from math import asin,cos,pi,sin

rEarth = 6371.01 # Earth's average radius in km
epsilon = 0.000001 # threshold for floating-point equality


def deg2rad(angle):
    return angle*pi/180


def rad2deg(angle):
    return angle*180/pi


def pointRadialDistance(lat1, lon1, bearing, distance):
    """
    Return final coordinates (lat2,lon2) [in degrees] given initial coordinates
    (lat1,lon1) [in degrees] and a bearing [in degrees] and distance [in km]
    """
    rlat1 = deg2rad(lat1)
    rlon1 = deg2rad(lon1)
    rbearing = deg2rad(bearing)
    rdistance = distance / rEarth # normalize linear distance to radian angle

    rlat = asin( sin(rlat1) * cos(rdistance) + cos(rlat1) * sin(rdistance) * cos(rbearing) )

    if cos(rlat) == 0 or abs(cos(rlat)) < epsilon: # Endpoint a pole
        rlon=rlon1
    else:
        rlon = ( (rlon1 - asin( sin(rbearing)* sin(rdistance) / cos(rlat) ) + pi ) % (2*pi) ) - pi

    lat = rad2deg(rlat)
    lon = rad2deg(rlon)
    return (lat, lon)


def main():
    print "lat1 t lon1 tt bear t dist tt lat2 tt lon2"
    testcases = []
    testcases.append((0,0,0,1))
    testcases.append((0,0,90,1))
    testcases.append((0,0,0,100))
    testcases.append((0,0,90,100))
    testcases.append((49.25705,-123.140259,225,1))
    testcases.append((49.25705,-123.140259,225,100))
    testcases.append((49.25705,-123.140259,225,1000))
    for lat1, lon1, bear, dist in testcases:
        (lat,lon) = pointRadialDistance(lat1,lon1,bear,dist)
        print "%6.2f t %6.2f t %4.1f t %6.1f t %6.2f t %6.2f" % (lat1,lon1,bear,dist,lat,lon)


if __name__ == "__main__":
    main()

Aquí está la salida:

lat1     lon1        bear    dist        lat2        lon2
  0.00     0.00       0.0       1.0        0.01        0.00
  0.00     0.00      90.0       1.0        0.00       -0.01
  0.00     0.00       0.0     100.0        0.90        0.00
  0.00     0.00      90.0     100.0        0.00       -0.90
 49.26   -123.14     225.0      1.0       49.25      -123.13
 49.26   -123.14     225.0    100.0       48.62      -122.18
 49.26   -123.14     225.0   1000.0       42.55      -114.51

Creo que hay un problema en el algoritmo proporcionado en el mensaje 5.

Funciona pero solo para la latitud, para la longitud hay un problema por la señal.

Los datos hablan por sí solos:

49,26 -123,14 225,0 1,0 49,25 -123,13

si empiezas desde -123,14° y ve al OESTE, deberías tener algo LEJOS en el OESTE. ¡Aquí volvemos al ESTE (-123.13)!

La fórmula debe incluir en alguna parte:

Orientación en grados = ((Orientación en 360 grados)%360)

antes de la conversión a radianes.

Fundamentalmente, parece que su problema es que está pasando la latitud, la longitud y el rumbo como grados en lugar de radianes. Trate de asegurarse de que siempre está pasando radianes a su función y vea lo que obtiene.

PD: ver problemas similares discutidos aquí y aquí.

Sección de Reseñas y Valoraciones

Si eres capaz, tienes la habilidad dejar una reseña acerca de qué te ha impresionado de esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *