生成像SpatialKey一样的密度/热力图

8

SpatialKey生成了一些非常漂亮的热力图,我们正在研究如何在一个内部项目中可视化大量点的情况下实现这个功能。我正在寻求关于从哪里开始的一些想法的反馈(这是一个非常有趣的问题)。

SpatialKey热力图 http://img697.imageshack.us/img697/7964/resolutiondays508x17550.jpg

我们知道他们在使用Flash,并且从我们所知道的来看,这些热力图是交互式的而不是从瓦片服务器渲染出来的。我们对其实现方式的第一个猜测是,服务器向其Flash客户端提供一个网格 - 每个单元格都有一个由服务器计算的计数。然后Flash客户端根据网格中的单元格值进行一些插值,以产生您在上面看到的漂亮输出。

目前,我只对他们如何可能有效地在服务器端生成网格感兴趣(如果我们对其实现的假设是正确的话)。似乎需要涉及以下内容:

  1. 查询当前地图范围内的内容
  2. 对这些范围内的每个单元格执行聚合子查询(像上面的例子中一样做计数、求和或平均值)。

在一个合理的网格分辨率下,对多个缩放级别进行操作,看起来需要一个自定义的空间索引才能使其高效。

有人能解释一下其他可行的方法吗?如果有影响的话,我们习惯于将数据存储在PostgreSQL中,并使用PostGIS进行空间索引,但我愿意尝试任何东西。

2个回答

5
作为一个猜测,我认为他们在客户端使用Flash实现了GIS库,并将纬度和经度坐标投影到像素空间中。然后,他们按像素聚合以确定每个像素的“高度”,并像渲染圆形一样进行渲染,但使用透明度的渐变填充,填充的起始和结束颜色由像素的高度确定。多个重叠的圆形将创建更亮的像素。
另一种选择可能是使用灰度图,然后将亮度值映射到颜色比例尺上。这可能是最有效的方法。
我们销售传统的树状图热力图,用于视觉分析应用程序的集成使用(例如:热力图SDK),现在有地理热力图来着色区域。我们读取标准的ESRI Shapefile地图,并在客户端(使用Java而不是Flash,但是相同的概念)上执行所有的投影和渲染。我认为SpatialKey也是这样做的,因为他们支持面积填充渲染,如果您使用类似Google Maps的瓷砖服务器,则无法实现。
我们还没有像这样的密度热力图,但运行了几个使用静态图像作为背景的测试。如果您想要更多信息,请告诉我,我可以问我的开发人员我们是如何做到的。我知道我们目前正在开发更多基于点的功能,但我不知道密度热力图在时间表上的位置。
SpatialKey实际上刚刚写了一篇关于区域填充热力图(即主题地图)和密度热力图之间的差异的好文章。您可以在http://blog.spatialkey.com/2010/02/comparing-thematic-maps-with-density-heatmaps/上查看它。
如果您确实找到了制作密度热力图的好方法,我会有兴趣了解您是如何做到的,因为这将是我们视觉分析SDK的有价值的补充。祝您好运。

我刚意识到我可能误解了问题。这个问题似乎是关于如何获取包含纬度、经度和“高度”的数据集,而不是如何呈现它。再次强调,不知道SpatialKey是如何做到的,我认为你至少部分正确。你可以采取以下方法,而不是为每个单元格执行子查询,这可能会迅速压倒数据库(一个10x10网格将需要100个子查询):
  • 让客户端在经度和纬度范围内传递渲染表面的宽度和高度
- Trevor Lohrbeer
通过对经度和纬度与宽度和高度进行范围映射,计算分辨率。这将告诉您每个单元格的有效 bin 宽度和高度从纬度和经度的角度来看。 在经度和纬度范围内查询所有点。 遍历每个点并将其四舍五入到最近的经度和纬度 bin。 使用 binned 经度和纬度作为键,计数作为值将结果存储在哈希表查找中。 - Trevor Lohrbeer
将结果输出为一个包含三列的数据集:经度、纬度和计数(例如:高度)。客户端可以使用GIS库轻松地渲染这个数据集。或者您可以预先投影点并使用X、Y像素坐标将其发送到前端。[注意:我刚意识到这里使用“高度”一词可能会令人困惑。这是因为密度图本质上是一张带有颜色的拓扑图,颜色代表每个点的高度。] - Trevor Lohrbeer
1
最后注意:如果您计算出您的箱宽和高为10的幂次方,那么您应该能够让Postgres将纬度和经度四舍五入到正确的箱边界,然后按纬度和经度分组,以便从单个查询中获取正确的数据集结果。这将是最有效的方法。 - Trevor Lohrbeer
你最后的评论让我恍然大悟——按四舍五入的经纬度分组非常优雅。这将使Postgres的聚合变得十分简单。谢谢! - Brent Dillingham

0

使用MapReduce来实现您的实际聚合映射总数,以及使用地理空间索引来为数据库提供数据,以便为这些MapReduce作业提供数据。我正在研究将这种完全相同的方法应用于接口而不是映射 :) 目前,MongoDB似乎是一个很好的选择。


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