如何聚合地理编码数据集以减少热力图中的数量?

6

我有一组纬度和经度数据用于生成热力图。这些数据量很大,而且每天都在不断增加。我需要减少数据量,同时尽量不影响热力图的性能。我知道我们可以添加一个“权重”字段,并将两个附近的点合并成一个新点,其中“权重”是前两个点的总和。但是我对如何放置新点感到困惑。我认为这不是解决我的问题的标准方法。我正在使用golang进行实现,但欢迎所有想法。谢谢。


2
使用权重计算加权平均值,并将点稍微移动。例如,如果点A的权重为0.9,点B的权重为0.1,则新点应该在连接A和B的线的0.1附近,靠近A。 - Not_a_Golfer
2
两个重要问题:1. 热力图应该代表什么,即完美的、无损结果的定义是什么?一旦你定义了这个,第二个问题就是:你能接受哪些与第一个问题不同的偏差? - Rafał Dowgird
@Not_a_Golfer,你能否提供一个例子? - user6681013
2
我通过将地图分成若干区域(大正方形)来完成这项任务,当添加新路径时,计算它经过哪些区块并在每个区块上加1。如果粗心实施,查找正方形的算法可能会非常耗费时间。 - Mike B
你使用哪个数据库?Postgres和Mongo都有地理索引 https://docs.mongodb.com/manual/applications/geospatial-indexes/ 和 http://revenant.ca/www/postgis/workshop/indexing.html。此外,你可能需要对数据进行聚类。 - vporoshok
显示剩余3条评论
1个回答

0

正如评论者所提到的,考虑使用加权平均点。

选择一个接近度阈值,在此范围内聚合任何点。对于这些点中的每一个,生成一个合成点,其坐标是其他点的平均值(中位数),其权重是相关点的计数。在生成热图时仅包括合成加权点,以便通过调整接近度阈值来减少数据量。

例如:

type Point struct{ X, Y float32 }

type WeightedPoint struct{ Weight, X, Y float32 }

func GetWeightedPoint(ps []Point) WeightedPoint {
    n := float32(len(ps))
    wp := WeightedPoint{Weight: n}
    if n > 0 {
        for _, p := range ps {
            wp.X += p.X
            wp.Y += p.Y
        }
        wp.X /= n
        wp.Y /= n
    }
    return wp
}

func main() {
    ps := []Point{{0.0, 0.0}, {1.0, 0.0}, {0.5, 1.0}}
    fmt.Printf("OK: %#v\n", GetWeightedPoint(ps))
    // OK: main.WeightedPoint{Weight:3, X:0.5, Y:0.33333334}
}

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