2010-11-12 17 views
6

Ho utilizzato il sito web Moveable-Type per aiutarmi in alcuni calcoli geocoordinati ed è stato molto utile, tuttavia, ho un bug nel mio calcolo del punto centrale tra due coordinate. Il mio risultato è vicino al previsto, ma non abbastanza vicino:Punto medio geografico tra due coordinate

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

risultato atteso (preso dalla calcolatrice caratteri mobili) = 47 ° 38'40 "N, 122 ° 08'26" W = {47.644444, -122.140556} mio risultato : {49.6054801645915, -122.14052959995759}

Ecco il mio codice:

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

ho un paio di metodi privati ​​per fare la conversione tra gradi e radianti e schiena. E.g.

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

Non riesco a capire perché i miei risultati sono spenti di un paio di gradi sul valore Lat. Qualche idea?

Grazie

+0

Off My ** ** gradi interi (si aspetta '34.8954' ma ottiene' 29.8954') o ** ** approssimativa (che ci si aspetta '34.8954' ma ottiene' 29.7836')? – Brad

+0

Non sono abbastanza sicuro se stai considerando la superficie terrestre come una sfera semplice o una sfera ellissoidale. l'ultima volta che ho lavorato con la legge di Lambert [utilizzando un'implementazione Java] e sembrava funzionare in modo accurato. – anirvan

+0

Grazie. È fuori di 2 gradi sul lat, e il lon è praticamente perfetto. Sto usando la formula per il calcolo del punto medio su questo sito web, tradotto in C# http://www.movable-type.co.uk/scripts/latlong.html – Stevieboy84

risposta

7

Hai posizionato alcune parentesi errate. Ho segnato il posto nel codice.

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

:(stavo proprio per postare questo, buona cattura – Jere

+0

Grazie !!! Ho pensato che sarebbe stato qualcosa di semplice, non so come mi sono perso! Sei una stella! – Stevieboy84

+0

Sono contento di potrebbe aiutare :) – PetPaulsen

Problemi correlati