我希望构建一个静态KML(Google地球标记)文件,该文件以[lat,lon,density]元组的形式显示一些给定数据集的热图样式呈现。
我所拥有的非常简单的数据集是人口密度。
我的要求是:
这个项目的要求与语言无关,因为我将离线生成这些文件,以构建其他地方使用的KML。
我查看了一些项目,最值得注意的是heatmap.py,这是Python中使用KML导出的gheat端口。我已经碰到了一堵砖墙,因为我迄今发现的项目都依赖于根据输入算法的[lat,lon]点的密度构建热图。
如果我错过了一种明显的方法来调整我的数据集以仅仅输入[lat,lon]元组,而是调整我使用密度值来提供它们的方式,我很想知道!
答案 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。不确定它是否会完全符合您的要求!
干杯, 亚历