Рассчитать среднюю широту и долготу в C # - PullRequest
4 голосов
/ 31 августа 2011

У меня есть пары (minLatitude, maxLatitude) и (minLongitude, maxLongitude) в десятичных градусах, и мне нужно вычислить среднюю точку поля, которое определяют эти пары, как я могу получить их среднюю широту / долготу? Я получаю довольно большое смещение, когда вычисляется простое среднее арифметическое.

Спасибо!

Ответы [ 2 ]

8 голосов
/ 04 сентября 2011

Решение, предложенное Пьером-Люком Шампиньи, неверно.

На изображении ниже вы видите две строки:

  1. (lat1, lon1) -> (lat2,lon2)
  2. (lat1, lon2) -> (lat2, lon1)

Половина длины каждой строки зеленым, другая половина синим.

Вы можете видеть, что центр обеих линий не является одной и той же точкой, и оба центра не являются центром многоугольника.

earth

Чтобы найти центр многоугольника:

  • lat = avrg (lat1, lat2)
  • lon = avrg (lon1, lon2)

Чтобы получить эти значения, вы можете воспользоваться ссылкойпо предложению Пьера-Люка Шампиньи, но:

  • Возьмите широту средней точки (lat1, lon1) -> (lat2, lon1)
  • Возьмите lon средней точкииз (lat1, lon1) -> (lat1, lon2)
5 голосов
/ 31 августа 2011

От: http://www.movable -type.co.uk / scripts / latlong.html

Ваши значения должны быть в радианах, поэтому используйте формулу средней точки:

var lat1 = minLatitude;  // In radian
var lat2 = maxLatitude;  // In radian
var lon1 = minLongitude; // In radian
var lon2 = maxLongitude; // In radian

var dLon = (lon2-lon1); 


var Bx = Math.Cos(lat2) * Math.Cos(dLon);
var By = Math.Cos(lat2) * Math.Sin(dLon);
var avgLat = Math.Atan2(
           Math.Sin(lat1) + 
           Math.Sin(lat2), 
           Math.Sqrt((
           Math.Cos(lat1)+Bx) * (Math.Cos(lat1)+Bx) + By*By));

var avgLong = lon1 + Math.Atan2(By, Math.Cos(lat1) + Bx);
...