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:
- Necesitas convertir
lat1
ylon1
a radianes antes de llamar a su función. - Puedes estar escalando
radialDistance
incorrectamente. - 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 quex == y
para probar dos números de coma flotantex
yy
por la igualdad - Creo que quieres convertir
lat
ylon
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.