【问题标题】:How to visualize heatmap for thousands of records如何可视化数千条记录的热图
【发布时间】:2015-02-16 14:52:32
【问题描述】:

我的 Java 应用引擎上有数千条记录(纬度、经度),我想使用 Android Heatmap Utility 为其生成热图。然而,原始数据集太大而无法通过移动网络传输。您如何将这些记录预处理成足够小的东西以便将其传输到设备?

【问题讨论】:

  • 您是否尝试过压缩您的(json/csv 文件)?
  • 压缩在这种情况下没有帮助。当然它会更小,但数据集仍然太大。必须有一种方法可以在服务器上准备数据,这样我就不必获取设备上的每条记录。

标签: java android google-app-engine heatmap


【解决方案1】:

您可以为您的应用使用样本数据集,而不是使用所有数据集,这将提供可靠的结果

使用采样算法:

在您的服务器中运行采样算法,这会将大数据大小减少到非常小。 Spatial sampling 涉及确定地理空间中有限数量的位置,以忠实地测量受依赖性和异质性影响的现象。


洗牌:

洗牌是随机重新排列元素数组的过程。例如,您可能会在进行扑克游戏之前洗牌。一个好的洗牌算法是无偏的,其中每个排序的可能性都相同。

Fisher-Yates shuffle 是一种最优的洗牌算法。不仅 它是无偏的,但它在线性时间中运行,使用恒定空间,并且 很容易实现。

function shuffle(array) {
  var n = array.length, t, i;
  while (n) {
    i = Math.random() * n-- | 0; // 0 ≤ i < n
    t = array[n];
    array[n] = array[i];
    array[i] = t;
  }
  return array;
}

详细信息:Visualizing Algorithms

【讨论】:

    【解决方案2】:

    使用您提到的文档中所述的格式将 LatLngs 解析为一个(或多个)JSON 文件。

    [
    {"lat" : -37.1886, "lng" : 145.708 } ,
    {"lat" : -37.8361, "lng" : 144.845 } ,
    {"lat" : -38.4034, "lng" : 144.192 } ,
    {"lat" : -38.7597, "lng" : 143.67 } ,
    {"lat" : -36.9672, "lng" : 141.083 }
    ]
    

    然后使用 AsyncTask 在您的应用中检索它们,并在您的 HeatmapTileProvider 上调用 .setData(data); 方法更新您的 HeatMap

    编辑:

    一个可能的解决方案:

    在您认为合适的任何大小的理论地图上创建一个“网格”,然后平均适合网格上每个单元格内的所有标记的位置,并为该新标记分配最初在网格。 然后您可以在热图上使用WeightedLatLng.weightedData,而不是常规的LatLng.data

    较小的“网格”应该会产生更准确的结果,但同样,这取决于数据的大小。

    【讨论】:

    • 重点是,数据集太大,无法将每条记录发送到设备。我正在考虑一些平均,但我不确定平均一组坐标的最佳方法是什么。
    • 此外,您可以使用缩放级别来改变您从服务器中提取的 WeightedLatLng 集。这与 setRadius() 结合将允许您处理地图的放大/缩小。
    猜你喜欢
    • 1970-01-01
    • 2016-05-23
    • 2019-08-10
    • 1970-01-01
    • 2012-01-15
    • 2014-05-25
    • 2021-07-20
    • 1970-01-01
    相关资源
    最近更新 更多