Географическая середина между двумя координатами - PullRequest
7 голосов
/ 12 ноября 2010

Я использовал сайт Moveable-Type, чтобы помочь мне в некоторых вычислениях Geocoordinate, и это было очень полезно, однако, у меня есть ошибка в моем вычислении средней точки между двумя координатами.Мой результат близок к ожидаемому, но недостаточно близок:

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

ожидаемый результат (взят из калькулятора подвижного типа) = 47 ° 38′40 ″ с.ш., 122 ° 08′26 ″ W = {47.644444, -122.140556} мой результат: {49.6054801645915, -122.14052959995759}

Вот мой код:

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

У меня есть несколько частных методов для преобразования между градусами и радианами и обратно.Например,

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

Я не могу понять, почему мои результаты отклонены на пару градусов от значения Lat.Есть идеи?

Спасибо

Ответы [ 2 ]

9 голосов
/ 12 ноября 2010

Вы поставили несколько скобок неправильно.Я отметил место в коде.

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 голосов
/ 12 ноября 2010

Некоторые методы (например, соглашения WGS84) включают сжатие земли.( по крайней мере, так сказано здесь )

...