2010-11-12 27 views
6

J'ai utilisé le site Moveable-Type pour m'aider dans quelques calculs géocoordonnés et cela a été très utile, cependant, j'ai un bug dans le calcul du point médian entre deux coordonnées. Mon résultat est proche de l'attendu, mais pas assez proche:Milieu géographique entre deux coordonnées

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

résultat attendu (provenant du calculateur de type mobile) = 47 ° 38'40 "N, 122 ° 08'26" W = {47.644444, -122.140556} mon résultat : {49.6054801645915, -122.14052959995759}

Voici mon code:

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; 
} 

J'ai deux ou trois méthodes privées pour effectuer la conversion entre les degrés et radians et le dos. E.g.

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

Je n'arrive pas à comprendre pourquoi mes résultats sont décalés de quelques degrés sur la valeur Lat. Des idées?

Merci

+0

de mon entier degrés ** ** (vous attendez '' 34.8954' mais obtenir 29.8954') ou ** approximative ** (vous attendez '' 34.8954' mais obtenez 29.7836')? – Brad

+0

Je ne suis pas sûr si vous considérez la surface de la terre comme une simple sphère ou une sphère ellipsoïdale. la dernière fois que j'ai travaillé avec la loi de Lambert [en utilisant une implémentation Java] et cela a semblé fonctionner correctement. – anirvan

+0

Merci. Il est sorti par 2 degrés sur le lat, et le lon est à peu près sur place. J'utilise la formule pour le calcul à mi-parcours sur ce site, traduit en C# http://www.movable-type.co.uk/scripts/latlong.html – Stevieboy84

Répondre

7

Vous avez mal placé certaines parenthèses. J'ai marqué l'endroit dans le code.

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

:(J'étais sur le point de poster ce.Bon attraper – Jere

+0

Merci, je pensais que ce serait quelque chose de simple, je ne sais pas comment je l'ai manqué! Vous êtes une star! – Stevieboy84

+0

Je suis content que je pourrait aider :) – PetPaulsen

Questions connexes