从给定的[lat,lon,density]数据集生成KML热图

时间:2010-03-05 20:05:29

标签: kml heatmap

我希望构建一个静态KML(Google地球标记)文件,该文件以[lat,lon,density]元组的形式显示一些给定数据集的热图样式呈现。

我所拥有的非常简单的数据集是人口密度。

我的要求是:

  • 必须能够为给定的lat,lon
  • 输入数据
  • 必须能够指定该纬度,lon
  • 的数据密度
  • 必须导出为KML

这个项目的要求与语言无关,因为我将离线生成这些文件,以构建其他地方使用的KML。

我查看了一些项目,最值得注意的是heatmap.py,这是Python中使用KML导出的gheat端口。我已经碰到了一堵砖墙,因为我迄今发现的项目都依赖于根据输入算法的[lat,lon]点的密度构建热图。

如果我错过了一种明显的方法来调整我的数据集以仅仅输入[lat,lon]元组,而是调整我使用密度值来提供它们的方式,我很想知道!

3 个答案:

答案 0 :(得分:4)

嘿Will,heatmap.py是我。您的请求是一个很常见的请求,并列在我要解决的事项列表中。我不太确定如何以一般方式这样做;在heatmap.py的说法中,使用每点dotsize而不是像现在这样的全局点阵将是直截了当的,但我不确定这是否能满足真正的需要。我的目标是2010年夏天发布,但你可能自己制作这个版本。

您可以尝试搜索Kernel Density Estimator工具;这就是统计学家所说的热图。 R有一些很好的内置工具可以帮助您更快地满足您的需求。

祝你好运!

答案 1 :(得分:1)

我认为一种方法是创建一个(更大的)元组列表,每个点根据该点的密度重复。具有高密度的点由彼此顶部的许多点表示,而具有低密度的点具有很少的点。因此,您将使用[(120.7, 82.5, 2), (130.6, 81.5, 1)](一个相当枯燥的数据集)而不是:[(120.7, 82.5), (120.7, 82.5), (130.6, 81.5)]

一个可能的问题是你的密度很可能是浮点数,而不是整数,所以你应该对数据进行标准化和舍入。转换的一种方法是这样的:

def dens2points (dens_tups):
    min_dens = dens_tups[0][2]
    for tup in dens_tups:
        if (min_dens > tup[2]):
           min_dens = tup[2]
    print min_dens

    result = []
    for tup in dens_tups:
        for i in range(int(tup[2]/min_dens)):
            result.append((tup[0],tup[1]))
    return result

if __name__ == "__main__":
    input = [(10, 10, 20.0),(5, 5, 10.0),(10,10,0.9)]
    output = dens2points(input)
    print input
    print output

(这不是非常pythonic,但似乎适用于简单的测试用例)。此子例程应将您的数据转换为heatmap.py接受的格式。经过一番努力,我认为子程序可以减少到两行。

答案 2 :(得分:1)

我更新了heatmap.py脚本,以便您可以为每个点指定密度。我uploaded my changes to my blog。不确定它是否会完全符合您的要求!

干杯, 亚历