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

5

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

我知道Javascript G. Maps API中有一种方法可以实现这一点。我想知道是否在Android中已经存在类似的方法?

5个回答

18
你所尝试计算的是被称为质心的东西。 有几种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
这个问题看起来非常像我一段时间前遇到的问题...
Android MapView - 自动设置缩放,直到所有ItemizedOverlay都可见

1

1
我不会使用中心点(或重心,或均匀密度的质心),如果您需要在布局中显示一个图形(形状,区域)。我真正需要的是所有坐标的最大值和最小值来将图形居中于布局中。
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
不要对点x和y取平均值.. 谷歌搜索“质心伪代码”,那应该是你想要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接