从给定的数据集 [纬度、经度、密度] 生成 KML 热图
我希望构建一个静态 KML(Google 地球标记)文件,该文件以 [lat、lon、densis] 元组的形式显示一些给定数据集的热图样式渲染。
我拥有的一个非常简单的数据集是人口密度。
我的要求是:
- 必须能够输入给定纬度、经度的数据
- 必须能够指定该纬度、经度的数据密度
- 必须导出到 KML
这些要求与该项目的语言无关,因为我将生成这些离线文件以构建在其他地方使用的 KML。
我看过一些项目,最值得注意的是 heatmap.py,它是 gheat 使用 Python 进行 KML 导出。我已经碰壁了,因为我迄今为止发现的项目都依赖于根据输入算法的 [lat, lon] 点的密度来构建热图。
如果我缺少一种明显的方法来调整我的数据集以仅输入 [lat, lon] 元组,但使用我拥有的密度值调整我输入它们的方式,我很想知道!
I am looking to build a static KML (Google Earth markup) file which displays a heatmap-style rendering of a few given data sets in the form of [lat, lon, density] tuples.
A very straightforward data set I have is for population density.
My requirements are:
- Must be able to feed in data for a given lat, lon
- Must be able to specify the density of the data at that lat, lon
- Must export to KML
The requirements are language agnostic for this project as I will be generating these files offline in order to build the KML used elsewhere.
I have looked at a few projects, most notably heatmap.py, which is a port of gheat in Python with KML export. I have hit a brick wall in the sense that the projects I have found to date all rely on building the heatmap from the density of [lat, lon] points fed into the algorithm.
If I am missing an obvious way to adapt my data set to feed in just the [lat, lon] tuples but adjusting how I feed them using the density values I have, I would love to know!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
嘿,威尔,heatmap.py 是我。你的请求是一个很常见的请求,并且在我要解决的事情清单上。我还不太确定如何以一般方式做到这一点;用 heatmap.py 的说法,使用每点的点大小而不是现在的全局点大小会很简单,但我不确定这是否能满足真正的需求。我的目标是在 2010 年夏季发布,但你也可以自己制作这个模组。
您可以尝试搜索核密度估计器工具;这就是统计学家所说的热图。 R 有一些很好的内置工具,您可以使用它们来更快地满足您的需求。
祝你好运!
Hey Will, heatmap.py is me. Your request is a common-enough one and is on my list of things to address. I'm not quite sure yet how to do so in a general fashion; in heatmap.py parlance, it would be straightforward to have a per-point
dotsize
instead of a global dotsize as it is now, but I'm not sure that will address the true need. I'm aiming for a summer 2010 release, but you could probably make this mod yourself.You may try searching for Kernel Density Estimator tools; that's what the statisticians call heatmaps. R has some good built-in tools you can use that might satisfy your need more quickly.
good luck!
我更新了 heatmap.py 脚本,以便您可以指定每个点的密度。我将我的更改上传到我的博客。但不确定它是否会完全满足您的要求!
干杯,
Alex
更新 [2020 年 11 月 13 日]
我不久前存档了我的博客,因此链接不再有效,因此以下是更改供参考:
diff 文件:
和演示脚本:
I updated the
heatmap.py
script so you can specify a density for each point. I uploaded my changes to my blog. Not sure if it'll do exactly what you want though!Cheers,
Alex
Update [13 Nov 2020]
I archived my blog a while back, so the link no longer works, so for reference here are the changes:
the diff file:
and a demo script:
我认为做到这一点的一种方法是创建一个(更大的)元组列表,其中每个点根据该点的密度重复。高密度点由许多彼此重叠的点表示,而低密度点则由很少的点表示。因此,您可以使用
[(120.7, 82.5), (120.7, 82.5), (130.6, 81.5)]
(一个相当乏味的数据集)。一个可能的问题是您的密度很可能是浮点数,而不是整数,因此您应该对数据进行标准化和舍入。进行转换的一种方法是这样的:(
这不是很Pythonic,但似乎适用于简单的测试用例)。该子例程应将您的数据转换为 heatmap.py 接受的形式。经过一点努力,我认为子例程可以减少到两行。
I think one way to do this is to create a (larger) list of tuples with each point repeated according to the density at that point. A point with a high density is represented by lots of points on top of each other while a point with a low density has few points. So instead of:
[(120.7, 82.5, 2), (130.6, 81.5, 1)]
you would use[(120.7, 82.5), (120.7, 82.5), (130.6, 81.5)]
(a fairly dull dataset).One possible issue is that your densities may well be floats, not integers, so you should normalize and round the data. One way to do the conversion is something like this:
(which isn't very pythonic, but seems to work for the simple test case). This subroutine should convert your data into a form that is accepted by heatmap.py. With a little effort I think the subroutine can be reduced to two lines.