Найдите среднее значение (центр) латов/долг.

Я динамически наношу несколько точек на карту Google. Я пытаюсь найти лучший способ найти центр заданных точек. Я пробовал использовать следующее:

var mapArray = new Array;
mapArray[0] = new Array(42, 35.391228, -119.008401);
mapArray[1] = new Array(34, 33.874277, -118.131555);
mapArray[2] = new Array(214, 32.6922592, -115.4962203);
mapArray[3] = new Array(216, 33.3818875, -117.2449785);
mapArray[4] = new Array(40, 36.805231, -119.770192);
mapArray[5] = new Array(47, 37.638266, -122.117398);
mapArray[6] = new Array(218, 37.638266, -122.117398);
mapArray[7] = new Array(39, 33.70677, -116.241719);
mapArray[8] = new Array(219, 33.666489, -117.30137);
mapArray[9] = new Array(37, 34.0625743, -118.354077);
mapArray[10] = new Array(217, 34.0625743, -118.354077);
mapArray[11] = new Array(43, 34.195561, -119.179495);
mapArray[12] = new Array(220, 37.671111, -121.873443);
mapArray[13] = new Array(215, 33.736294, -116.405587);
mapArray[14] = new Array(35, 33.978778, -117.383186);
mapArray[15] = new Array(36, 32.8321559, -117.1264585);
mapArray[16] = new Array(46, 37.312298, -121.930904);
mapArray[17] = new Array(221, 1, 1);
mapArray[18] = new Array(41, 33.7453974, -117.8502537);
mapArray[19] = new Array(44, 34.426024, -119.697417);
mapArray[20] = new Array(45, 34.952801, -120.440045);
mapArray[21] = new Array(38, 34.199697, -118.571618);

var avgLat = 0;
var avgLng = 0;
var j = 0;

for (var i in mapArray) {

    avgLat = (avgLat + mapArray[i][1]);
    avgLng = (avgLng + mapArray[i][2]);

    j++;
}

avgLat = avgLat / j;
avgLng = avgLng / j;

map.setCenter(new GLatLng(avgLat, avgLng), 6);

Но это не дает мне точного центра. Как лучше всего динамически отображать центр карты?


person Steve Robbins    schedule 29.08.2011    source источник


Ответы (3)


Найдите максимум и минимум как для широты, так и для долготы, а затем центрируйте на (max-min)/2 для каждого.

Это должно быть (max + min) / 2, среднее значение.

person Kevin    schedule 29.08.2011
comment
Как насчет min + ((max-min)/2) Если max = 100 и min = 20... 20 + ((100-20)/2) = 60. - person DogLimbo; 30.08.2011
comment
@DogLimbo: было бы быстрее просто вычислить (max+min)/2 - person Blazemonger; 30.08.2011
comment
@mblase75 Ваш вариант работает лучше всего. Сделайте это ответом, если хотите очков. - person Steve Robbins; 30.08.2011

Обратите внимание, что вы вычислили центроид, который в географии называется географический центр.

На самом деле это не работает, если у вас нет четко определенной формы, потому что это среднее значение, поэтому вы можете иметь набор точек в одной области, которые смещают центр к ним.

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

Вы также можете сделать что-то более сложное и попытаться получить представление о том, как выглядит область, очерченная этими точками. У меня нет хорошего алгоритма для вас, но идея состоит в том, чтобы удалить точки, которые «слишком близки», где «близость» определяется расстоянием между вашими точками. Как только вы уберете некоторые из кластеров, вы можете использовать метод центроидов с лучшими результатами.

person Kris Harper    schedule 29.08.2011

Stever Я видел ваше изображение и столкнулся с той же проблемой. Чтобы решить эту проблему, я присвоил значение первой точки минимальным и максимальным значениям.

Вот код, чтобы вы могли просмотреть его. Примечание. «Точка» — это структура, которую я создал для хранения значений широты и долготы.

        x = 0;
        y = 0;

        Point point;

        if (points.Count.Equals(0))
            return;

        Double minLat = points[0].lat, maxLat = points[0].lat;
        Double minLng = points[0].lng, maxLng = points[0].lng;

        for (int index = 1, count = points.Count; index < count; index++)
        {
            point = points[index];

            if (minLat > point.lat)
                minLat = point.lat;

            if (maxLat < point.lat)
                maxLat = point.lat;

            if (minLng > point.lng)
                minLng = point.lng;

            if (maxLng < point.lng)
                maxLng = point.lng;
        }

        x = (minLat + maxLat) / 2;
        y = (minLng + maxLng) / 2;
person raggitt    schedule 03.08.2012