我正在尝试开发一个基于地图的可视化,其中包括子群体的“热图”,基于包含如下文档的 MongoDB 集合:
{
"PlaceName" : "Boston",
"Location" : {
"type" : "Point",
"coordinates" : [ 42.358056, -71.063611 ]
},
"Subpopulations": {
"Age": {
"0_4" : 37122,
"6_11" : 33167,
"12_17" : 35464,
"18_24" : 130885,
"25_34" : 127058,
"34_44" : 79092,
"45_54" : 72076,
"55_64" : 59766,
"65_74" : 33997,
"75_84" : 20219,
"85_" : 9057
}
}
}
数据库中有数十万个单独的位置。它们不重叠——即“纽约市”和“曼哈顿”不会有两个单独的条目。
目标是使用 Leaflet.js 和一些插件来呈现这些数据的各种可视化。Leaflet 非常擅长在客户端对数据进行聚类——因此,如果我将一千个具有密度值的位置传递给它,它可以通过处理所有单独的值来呈现相关区域的热图。
问题是,假设我缩小地图以显示整个世界。如果不是不可能的话,将所有这些数据发送给客户端并让它足够快地处理这些信息以实现流畅的可视化,这将是非常低效的。
所以我需要做的是自动集群数据服务器端,我希望可以在 MongoDB 查询中完成。我已经读过geohashing可能是确定哪些点属于哪些集群的一个很好的起点,但我敢肯定有人以前做过这件事,并且可能比这有更好的洞察力。理想情况下,我想向我的 node.js 脚本发送一个查询,如下所示:
http://myserver.com/popdata?top=42.48&left=-80.57&bottom=37.42&right=-62.55&stat=Age&value=6_11
这将根据该指定地理区域内有多少个单独的点、给定要返回的最大数据点数或类似的东西来确定聚类需要的粒度;它会像这样返回数据:
[
{ "clusterlocation": [ 42.304, -72.622 ], "total_age_6_11": 59042 },
{ "clusterlocation": [ 36.255, -64.124 ], "total_age_6_11": 7941 },
{ "clusterlocation": [ 40.425, -70.693 ], "total_age_6_11": 90257 },
{ "clusterlocation": [ 39.773, -67.992 ], "total_age_6_11": 102752 },
...
]
...其中“clusterlocation”类似于集群中所有文档位置的平均值,“total_age_6_11”是“Subpopulations.Age.6_11”这些文档值的总和。
这是我可以纯粹在 Mongo 查询中做的事情吗?有没有一种“久经考验”的方法来做好它?