如何找到多个点的中心? Android的

时间:2011-04-21 17:20:08

标签: java android android-mapview

我在MapView上放置了多个点,并希望将地图置于这些点的中心,即不是任何特定的点,只是它们的平均中心。

我知道Javascript G. Maps API中有一种方法。我想知道在Android中是否有一种先行方法可以做到这一点?

5 个答案:

答案 0 :(得分:15)

您要计算的内容称为Centroid。 有几种Java实现用于计算有限点集(多边形)的质心。

例如:JavaGeom有一个implementation用于查找多个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;
}

答案 1 :(得分:2)

答案 2 :(得分:1)

你可以分别取x和y点的平均值,然后根据这些值设置跨度,并引入比这个值多25%的填充,以确保有足够的空间来聚焦它。

了解更多信息请查看: http://code.google.com/android/add-ons/google-apis/reference/index.html

答案 3 :(得分:1)

如果你需要在布局中显示一个图形(一个shapre,一个区域),我不会使用质心(或重心或密度均匀的质心)。我真正需要将一个图形置于布局中心,是显示每个点的所有坐标的最大值和最小值。

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

答案 4 :(得分:-1)

不要取点x和y的平均值。 谷歌“质心伪代码”应该是你想要的。