Как мне найти центр нескольких точек? Android - PullRequest
3 голосов
/ 21 апреля 2011

У меня есть несколько точек, размещенных на моем MapView, и я хотел бы центрировать карту на этих точках, то есть не на какой-либо конкретной точке, а только на усредненном центре множества из них.

Я знаю, что для этого есть метод в Javascript G. Maps API. Мне было интересно, есть ли существующий способ сделать это в Android?

Ответы [ 5 ]

15 голосов
/ 21 апреля 2011

То, что вы пытаетесь вычислить, называется Центроид . Существует несколько реализаций Java для вычисления центроидов для конечного набора точек (многоугольник).

Например: JavaGeom имеет реализацию для нахождения центроида нескольких 2D точек.
Я не уверен, что для этого есть стандартная реализация для Android, но реализовать ее довольно просто.

Простая реализация:

public static float[] centroid(float[] points) {
    float[] centroid = { 0, 0 };

    for (int i = 0; i < points.length; i+=2) {
        centroid[0] += points[i];
        centroid[1] += points[i+1];
    }

    int totalPoints = points.length/2;
    centroid[0] = centroid[0] / totalPoints;
    centroid[1] = centroid[1] / totalPoints;

    return centroid;
}
2 голосов
/ 21 апреля 2011

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

Android MapView - устанавливает масштабирование автоматически, пока все ItemizedOverlay не будут видны

1 голос
/ 23 июля 2015

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

ArrayList<GeoPoint> track;

public GeoPoint CenterMap() {
    double longitude = 0;
    double latitude = 0;
    double maxlat = 0, minlat = 0, maxlon = 0, minlon = 0;
    int i = 0;
    for (GeoPoint p : track) {
        latitude = p.getLatitude();
        longitude = p.getLongitude();
        if (i == 0) {
            maxlat = latitude;
            minlat = latitude;
            maxlon = longitude;
            minlon = longitude;
        } else {
            if (maxlat < latitude)
                maxlat = latitude;
            if (minlat > latitude)
                minlat = latitude;
            if (maxlon < longitude)
                maxlon = longitude;
            if (minlon > longitude)
                minlon = longitude;
        }
        i++;
    }
    latitude = (maxlat + minlat) / 2;
    longitude = (maxlon + minlon) / 2;
    return new GeoPoint(latitude, longitude);
}
1 голос
/ 21 апреля 2011

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

для получения дополнительной информации проверьте это: http://code.google.com/android/add-ons/google-apis/reference/index.html

0 голосов
/ 21 апреля 2011

Не берите среднее количество очков х и у .. Google "centroid psuedocode", и это должно быть то, что вы хотите.

...