如何找到一些GPS点的中点/坐标?

时间:2012-12-20 13:42:12

标签: java google-maps map gps gis

在我的应用程序中,我需要找到一些(3个或更多)GPS点的中点。

我发现两点之间的距离如下所示

public class DistanceOfGeoPoints {
     public static long distanceinKMeters(double dblLat, double dblNewLat, double dblLong, double dblNewLong)
     {
         try
         {
             //double dblDistance = 180 / (dblPI * Math.Acos(Math.Sin(dblLat) * Math.Sin(dblNewLat) + Math.Cos(dblLat) * Math.Cos(dblNewLat) * Math.Cos(dblLong - dblNewLong)));

             double dblDegree2Radius = Math.PI / 180;
             double dbllongdiff = (dblNewLong - dblLong) * dblDegree2Radius;
             double dbllatdiff = (dblNewLat - dblLat) * dblDegree2Radius;
             double a = Math.pow(Math.sin(dbllatdiff / 2.0), 2) + Math.cos(dblNewLat * dblDegree2Radius) * Math.cos(dblLat * dblDegree2Radius) * Math.pow(Math.sin(dbllongdiff / 2.0), 2);
             double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
             double dblDistance = 6367 * c; //Earth Radius * value (result in KM)

             // return dblDistance;
             long intdistance = (Math.round(dblDistance * 1000));

             return intdistance;
         }
         catch (Exception ex)
         {
             return 0;
         }
     }
}

现在我想要N个GPS点的中点

请帮帮我。

1 个答案:

答案 0 :(得分:5)

欧氏距离中两点的中点就是x和y坐标的平均值。如果我们只是平均点A和B的纬度和经度,这给了我们A和B之间的一个点,但不一定是等距的。

你可能想要的是将球面坐标转换为欧几里德坐标,通过平均x和y找到中点,然后转换回纬度,经度。

如果我们超过2分,我们需要澄清“中点”的含义。

如果我们希望找到欧氏几何中N个点的中点,我们只需对所有x值求平均值并对所有y值求平均值。这给了我们一个合理的“中间”,但这个平均点通常与所有三个点都不等。给定三点,我们可以计算出与这三点等距的唯一点;这一点是由三点定义的三角形的外心。但由于三个点定义了一个圆,因此该过程不会推广到n点。给定4个或更多点,可能没有与所有4点等距的点。无论我们是使用eculidean距离还是球面几何距离,都是如此。

在下图中,我们可以看到外心点距离A,B和C点正好是5个单位。然而,这一点并不像“中间”。另一方面,平均值定义的中点确实看起来像在中间,即使它更接近A而不是B或C.

Midpoint of three points

对于由(纬度,经度)定义的n个点,最好的方法可能是将所有这些点转换为欧几里德点,计算机平均值,然后转换回(纬度,经度)。 可以在此处找到执行此转换的一些代码:Processing Forum 并且有一个很好的wikipedia page解释你需要理解的背景数学。