ios objective-c coordinates core-location

ios - Cálculo del rumbo entre dos CLLocationCoordinate2Ds



objective-c coordinates (4)

Aquí el código se modificó con los cambios sugeridos por Oren Trutner y de mí mismo:

#define degreesToRadians(x) (M_PI * x / 180.0) #define radiansToDegrees(x) (x * 180.0 / M_PI) - (float)getHeadingForDirectionFromCoordinate:(CLLocationCoordinate2D)fromLoc toCoordinate:(CLLocationCoordinate2D)toLoc { float fLat = degreesToRadians(fromLoc.latitude); float fLng = degreesToRadians(fromLoc.longitude); float tLat = degreesToRadians(toLoc.latitude); float tLng = degreesToRadians(toLoc.longitude); float degree = radiansToDegrees(atan2(sin(tLng-fLng)*cos(tLat), cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(tLng-fLng))); if (degree >= 0) { return degree; } else { return 360+degree; } }

Problema muy "simple": dados dos CLLocationCoordinate2Ds, ¿cómo puedo obtener el rumbo (como radianes) del primero al segundo? He investigado y estudiado mucho sobre esto, tanto el problema general como el Objective-C / Cocoa Touch / iOS específicamente.

Aquí está mi implementación:

- (float) getHeadingForDirectionFromCoordinate:(CLLocationCoordinate2D)fromLoc toCoordinate:(CLLocationCoordinate2D)toLoc { float fLat = fromLoc.latitude; float fLng = fromLoc.longitude; float tLat = toLoc.latitude; float tLng = toLoc.longitude; return atan2(sin(fLng-tLng)*cos(tLat), cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(fLng-tLng)); }

Sin embargo, este método no me devuelve resultados consistentes. Si el rumbo está cerca del norte o hacia el sur, parece estar bien, sin embargo, cualquier otra dirección parece devolver datos inconsistentes, por ejemplo:

Desde 50.405018, 8.437500

Para 51.339802, 12.403340

Mi método devuelve: 5.918441 radianes

Debe ser 1.18660576 radianes

(vea http://www.movable-type.co.uk/scripts/latlong.html y http://www.movable-type.co.uk/scripts/latlong-map.html?lat1=50.405018&long1=8.437500&lat2=51.339802&long2=12.403340 )

He verificado dos y tres veces que la fórmula es correcta. También he comprobado un montón de valores como el ejemplo anterior, algunos correctos y otros erróneos. He jugado con varios modulos o limites del valor de retorno, también sin suerte.

¿Algunas ideas? ¿Hay algún problema con mi código? Tal vez he entendido mal sobre cómo funcionan las funciones matemáticas.


Swift 3:

extension CLLocationCoordinate2D { func bearing(to point: CLLocationCoordinate2D) -> Double { func degreesToRadians(_ degrees: Double) -> Double { return degrees * Double.pi / 180.0 } func radiansToDegrees(_ radians: Double) -> Double { return radians * 180.0 / Double.pi } let lat1 = degreesToRadians(latitude) let lon1 = degreesToRadians(longitude) let lat2 = degreesToRadians(point.latitude); let lon2 = degreesToRadians(point.longitude); let dLon = lon2 - lon1; let y = sin(dLon) * cos(lat2); let x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon); let radiansBearing = atan2(y, x); return radiansToDegrees(radiansBearing) } }


Tus cálculos son correctos, con las siguientes excepciones:

  1. Asegúrese de convertir fLat , fLon , tLat y tLon en radianes antes de aplicar cualquier sin () o cos () a ellos. Divide por 180.0 y multiplica por PI.

  2. Ingrese el delta entre tLng y fLng como tLng-fLng , y no al revés. Tenga en cuenta que esta diferencia aparece dos veces en la expresión.

Con esos cambios, obtengo 1.18660677830947 radianes con matemática de precisión doble y los valores en la pregunta.


puedes usar mi código ... es trabajo en mi proyecto con un microcontrolador que usa GPS para datos.

#define d2r ((22/7.0)/180.0) #define r2d (180.0/(22/7.0)) double get_heading1(double lat1, double long1, double lat2, double long2) { double diff_lat, diff_long; double degree; diff_long =(double) (((long2*1000000)-(long1*1000000))/1000000) * d2r; diff_lat = (double) (((lat2*1000000)-(lat1*1000000))/1000000) * d2r; degree = r2d (atan2(sin(diff_long)*cos(d2r*lat2),cos(d2r*lat1)*sin(d2r*lat2)-sin(d2r*lat1)*cos(d2r*lat2) *cos(diff_long))); if (degree >= 0) { return degree; } else { return 360+degree; } }