【问题标题】:How to aggregate a data set of geocodes to reduce there numbers for a heat map?如何聚合地理编码数据集以减少热图的数量?
【发布时间】:2016-12-23 16:40:25
【问题描述】:

我有一个纬度和经度数据集,用于填充热图。数据太大,而且会一天比一天增加。我需要减少数据量而不会对热图的性能产生太大影响。我知道我们可以为“权重”添加一个更多字段,并将两个附近的点组合成一个新点,其中“权重”作为前两个的总和。但我对在哪里种植新点感到困惑。我不认为这将是解决我的问题的标准方法。我正在使用 golang 来实现,但欢迎所有想法。谢谢。

【问题讨论】:

  • 使用权重进行加权平均,并稍微移动点。例如如果 A 点为 0.9,B 点为 0.1,则新点应在 A 和 B 连接线的 0.1 附近,靠近 A。
  • 两个重要的问题:1、热图应该代表什么,即完美、无损结果的定义是什么?一旦你定义了这一点,问题 2. 就是:你能接受与 1. 有什么样的偏差?
  • @RafałDowgird 热图代表车辆的运动。
  • @Not_a_Golfer 可以举个例子吗?
  • 我已经通过将地图划分为多个部分(大方块)来做到这一点,当添加新路线时,计算它经过哪些街区并将每个街区加 1。但是,如果做得草率,寻找正方形的算法可能会非常繁重。

标签: algorithm go heatmap


【解决方案1】:

正如评论者所说,例如,考虑使用加权平均分。

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

例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2020-09-20
    • 2011-01-13
    • 2019-05-02
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多