Рассчитать центральную точку нескольких пар координат широта / долгота - PullRequest
131 голосов
/ 13 июля 2011

Учитывая набор точек широты и долготы, как я могу вычислить широту и долготу центральной точки этого набора (то есть точки, которая бы центрировала вид по всем точкам)?

РЕДАКТИРОВАТЬ: PythonРешение, которое я использовал:

Convert lat/lon (must be in radians) to Cartesian coordinates for each location.
X = cos(lat) * cos(lon)
Y = cos(lat) * sin(lon)
Z = sin(lat)

Compute average x, y and z coordinates.
x = (x1 + x2 + ... + xn) / n
y = (y1 + y2 + ... + yn) / n
z = (z1 + z2 + ... + zn) / n

Convert average x, y, z coordinate to latitude and longitude.
Lon = atan2(y, x)
Hyp = sqrt(x * x + y * y)
Lat = atan2(z, hyp)

Ответы [ 16 ]

1 голос
/ 15 апреля 2012

Если вы хотите учесть используемый эллипсоид, вы можете найти формулы здесь http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/A_Guide_to_Coordinate_Systems_in_Great_Britain.pdf

см. Приложение B

Документ содержит множество других полезных вещей

B

1 голос
/ 13 июля 2011

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

Найдите среднее значение всех широт для вашей центральной широты и среднее значение всех долгот для центральной долготы.

Caveat Emptor: Это приближение на близком расстоянии, и ошибка станет неуправляемой, когдаотклонения от среднего значения более чем на несколько миль из-за кривизны Земли.Помните, что широта и долгота - это градусы (на самом деле это не сетка).

0 голосов
/ 05 мая 2019

В качестве благодарности за эту ветку, вот мой небольшой вклад в реализацию в Ruby, в надежде, что я сэкономлю кому-то несколько минут от их драгоценного времени:

def self.find_center(locations)

 number_of_locations = locations.length

 return locations.first if number_of_locations == 1

 x = y = z = 0.0
 locations.each do |station|
   latitude = station.latitude * Math::PI / 180
   longitude = station.longitude * Math::PI / 180

   x += Math.cos(latitude) * Math.cos(longitude)
   y += Math.cos(latitude) * Math.sin(longitude)
   z += Math.sin(latitude)
 end

 x = x/number_of_locations
 y = y/number_of_locations
 z = z/number_of_locations

 central_longitude =  Math.atan2(y, x)
 central_square_root = Math.sqrt(x * x + y * y)
 central_latitude = Math.atan2(z, central_square_root)

 [latitude: central_latitude * 180 / Math::PI, 
 longitude: central_longitude * 180 / Math::PI]
end
0 голосов
/ 11 марта 2019

Я выполнил эту задачу в javascript, как показано ниже

function GetCenterFromDegrees(data){
    // var data = [{lat:22.281610498720003,lng:70.77577162868579},{lat:22.28065743343672,lng:70.77624369747241},{lat:22.280860953131217,lng:70.77672113067706},{lat:22.281863655593973,lng:70.7762061465462}];
    var num_coords = data.length;
    var X = 0.0;
    var Y = 0.0;
    var Z = 0.0;

    for(i=0; i<num_coords; i++){
        var lat = data[i].lat * Math.PI / 180;
        var lon = data[i].lng * Math.PI / 180;
        var a = Math.cos(lat) * Math.cos(lon);
        var b = Math.cos(lat) * Math.sin(lon);
        var c = Math.sin(lat);

        X += a;
        Y += b;
        Z += c;
    }

    X /= num_coords;
    Y /= num_coords;
    Z /= num_coords;

    lon = Math.atan2(Y, X);
    var hyp = Math.sqrt(X * X + Y * Y);
    lat = Math.atan2(Z, hyp);

    var finalLat = lat * 180 / Math.PI;
    var finalLng =  lon * 180 / Math.PI; 

    var finalArray = Array();
    finalArray.push(finalLat);
    finalArray.push(finalLng);
    return finalArray;
}
0 голосов
/ 20 июня 2017

Вне объекта в PHP. Данный массив координатных пар возвращает центр.

/**
 * Calculate center of given coordinates
 * @param  array    $coordinates    Each array of coordinate pairs
 * @return array                    Center of coordinates
 */
function getCoordsCenter($coordinates) {    
    $lats = $lons = array();
    foreach ($coordinates as $key => $value) {
        array_push($lats, $value[0]);
        array_push($lons, $value[1]);
    }
    $minlat = min($lats);
    $maxlat = max($lats);
    $minlon = min($lons);
    $maxlon = max($lons);
    $lat = $maxlat - (($maxlat - $minlat) / 2);
    $lng = $maxlon - (($maxlon - $minlon) / 2);
    return array("lat" => $lat, "lon" => $lng);
}

Взято из # 4

0 голосов
/ 13 июля 2011

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

(Из ответа Альнитак)То, как вы вычисляете экстремумы, может быть немного проблематичным, но если они находятся на несколько градусов по обе стороны от долготы, которая оборачивается вокруг, тогда вы укажете выстрел и примете правильный диапазон.)

Если вы не хотите искажать какую-либо карту, на которой находятся эти точки, то отрегулируйте соотношение сторон ограничительной рамки так, чтобы оно соответствовало пикселям, которые вы выделили для вида, но все еще включает в себя экстремумы.

Чтобы сохранитьточки, центрированные на некотором произвольном уровне масштабирования, вычислите центр ограничительной рамки, которая «просто соответствует» точкам, как указано выше, и сохраните эту точку в качестве центральной точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...