2010-11-12 19 views
6

He estado usando el sitio web de tipo movible para ayudarme en algunas calcos geocoordinados y ha sido muy útil, sin embargo, tengo un error en mi cálculo del punto medio entre dos coordenadas. Mi resultado es cerca de la esperada, pero no lo suficientemente cerca:Punto medio geográfico entre dos coordenadas

posA = {47.64570362, -122.14073746} 
posB = {47.64316917, -122.14032175} 

resultado esperado (tomado de la calculadora de tipos móviles) = 47 ° 38'40 "N, 122 ° 08'26" W = {47.644444, -122.140556} mi resultado : {49.6054801645915, -122.14052959995759}

Aquí está mi código:

private Geocoordinate MidPoint(Geocoordinate posA, Geocoordinate posB) 
{ 
    Geocoordinate midPoint = new Geocoordinate(); 

    double dLon = DegreesToRadians(posB.Longitude - posA.Longitude); 
    double Bx = Math.Cos(DegreesToRadians(posB.Latitude)) * Math.Cos(dLon); 
    double By = Math.Cos(DegreesToRadians(posB.Latitude)) * Math.Sin(dLon); 

    midPoint.Latitude = RadiansToDegrees(Math.Atan2(Math.Sin(DegreesToRadians(posA.Latitude)) + Math.Sin(DegreesToRadians(posB.Latitude)), 
       Math.Sqrt((Math.Cos(DegreesToRadians(posA.Latitude)) + Bx) * (Math.Cos(DegreesToRadians(posA.Latitude))) + Bx) + By * By)); 

    midPoint.Longitude = posA.Longitude + RadiansToDegrees(Math.Atan2(By, Math.Cos(DegreesToRadians(posA.Latitude)) + Bx)); 

    return midPoint; 
} 

tengo un par de métodos particulares para hacer la conversión entre grados y radianes y la espalda. P. ej.

private double DegreeToRadian(double angle) 
{ 
    return Math.PI * angle/180.0; 
} 

No puedo entender por qué mis resultados están un par de grados en el valor Lat. ¿Algunas ideas?

Gracias

+0

de mi ** ** grados enteros (que espera '' 34.8954' pero consigue 29.8954') o ** ** aproximada (que espera '' 34.8954' pero consigue 29.7836')? – Brad

+0

no estoy seguro de si está considerando la superficie de la tierra como una simple esfera o una esfera elipsoidal. la última vez que trabajé con la ley de Lambert [usando una implementación Java] y parecía funcionar con precisión. – anirvan

+0

Gracias. Está fuera por 2 grados en el lat, y el lon está prácticamente en el blanco. Estoy usando la fórmula para el cálculo del punto medio en este sitio web, traducido a C# http://www.movable-type.co.uk/scripts/latlong.html – Stevieboy84

Respuesta

7

Has puesto algunos paréntesis incorrectos. Marqué el lugar en el código.

private Geocoordinate MidPoint(Geocoordinate posA, Geocoordinate posB) 
{ 
    Geocoordinate midPoint = new Geocoordinate(); 

    double dLon = DegreesToRadians(posB.Longitude - posA.Longitude); 
    double Bx = Math.Cos(DegreesToRadians(posB.Latitude)) * Math.Cos(dLon); 
    double By = Math.Cos(DegreesToRadians(posB.Latitude)) * Math.Sin(dLon); 

    midPoint.Latitude = RadiansToDegrees(Math.Atan2(
       Math.Sin(DegreesToRadians(posA.Latitude)) + Math.Sin(DegreesToRadians(posB.Latitude)), 
       Math.Sqrt(
        (Math.Cos(DegreesToRadians(posA.Latitude)) + Bx) * 
        (Math.Cos(DegreesToRadians(posA.Latitude)) + Bx) + By * By))); 
       // (Math.Cos(DegreesToRadians(posA.Latitude))) + Bx) + By * By)); // Your Code 

    midPoint.Longitude = posA.Longitude + RadiansToDegrees(Math.Atan2(By, Math.Cos(DegreesToRadians(posA.Latitude)) + Bx)); 

    return midPoint; 
} 
+0

:(Estaba a punto de publicar esto. Buena captura. – Jere

+0

¡Gracias! ¡Pensé que sería algo simple, no sé cómo me lo perdí! ¡Eres una estrella! – Stevieboy84

+0

Me alegra podría ayudar :) – PetPaulsen

Cuestiones relacionadas