丢弃不相关的纬度经度对的算法

时间:2014-12-28 22:22:00

标签: java algorithm gis

我正在尝试为多个位置计算最佳纬度经度对。 我有一个包含位置的数据库,对于每个位置,我可能有多个坐标。这些坐标中的大多数似乎与位置相关,因为它们彼此相距5米。 所以我可以通过对它们求平均得出一个新的(最终的)纬度经度对。

然而,有时候我有一个点(有时多于一个)位于几百米之外。

考虑到一组(最多10个)纬度经度点,我想找到并保留那些有意义的点并丢弃那些离他人太远的点。

我应该使用哪种方法/算法?

注意我使用Java。

4 个答案:

答案 0 :(得分:1)

最简单的方法可能是:

  1. 找到给定点集的质心(平均长/纬度)点
  2. 计算从集合中每个点到质心的距离。丢弃距离超过某个常数值的所有点(称这些点为噪声)
  3. 从剩余的非噪点重新计算质心,称之为位置。
  4. 这在java中实现起来应该非常简单,当然可以O(N)N是你集合中的点数。

    您的问题是K-means clustering的特定情况,因为您知道哪些真实数据与哪些样本相对应,而在一般情况下您没有这些知识。如果你想要更多的研究,那么请研究这个问题和各种方法。

答案 1 :(得分:1)

简单方法:

  1. 计算所有点到某个任意点的距离。
  2. 找出所有点的中位距离。
  3. 丢弃其abs(dist - median)>的所有点。值。
  4. 比质心方法好一点,它可能会被聚集在一起的几个远处的点所搞砸。

答案 2 :(得分:0)

您需要问自己几个问题:

  1. 哪一点应该被视为"没有意义"如果你只有两个点在100米之外。
  2. 哪一点应该被视为"没有意义"如果你有两个独立的积分群?
  3. 如果你有一连串的点仍然适合在最接近的邻居计算的误差范围内,但是总跨度超过极限,你该怎么办?
  4. 如果没有明确的标准,您提出的问题很难回答,但我会尝试查看群集算法。

    如果我们会跳过我提到过的问题,我会说它计算量很大,但你可以去

    1. 计算给定集合中所有点之间的距离
    2. 按距离总和对它们进行排序
    3. 过滤掉总和最高的那个
    4. 迭代直到没有距离总和大于errorMargin * N-1的点,其中N是当前的点数。
    5. 你还需要考虑边界情况,例如1)中提到的问题会给你留下一个随机点 - 我怀疑你对此没问题,所以你需要仔细分析你的域名

答案 3 :(得分:0)

如果您使用的是Java8,则以下代码提供了一个优雅的解决方案。

Collector<Location, ?, Location> centreCollector = new CentreCollector();
Location centre = locations.stream().collect(centreCollector);
centre = locations.stream().filter(centre::furtherThan(NOISE_DISTANCE)).collect(centreCollector);

你要创造两件事。 CentreCollector类,它实现了收集器,并在将位置对象传输到它们时对其进行平均;以及furtherThan方法,该方法返回一个Predicate,用于将this与给定位置之间的距离与给定距离进行比较。

稍微优雅的方法是计算到中心的距离的标准偏差,然后丢弃距平均距离超过一定数量标准偏差的任何位置。这样做的好处是可以考虑所有或大部分样本都超过中心的NOISE_DISTANCE的位置集。在这种情况下,CentreCollector必须返回一个更复杂的对象,该对象保存位置和统计信息,并且furtherThan作为该类的成员而不是位置。如果您希望我发布使用标准差的等效代码,请在评论中告诉我。