Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – MongoDB:按地理位置划分区域和最大点的群集文档?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试开发一个基于地图的可视化,其中包含一个子群体的“热图”,基于包含以下文档的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
        }
    }
}

数据库中有数十万个单独的位置.它们不重叠 – 即“纽约市”和“曼哈顿”不会有两个单独的条目.@H_197_10@

目标是使用Leaflet.js和一些插件来呈现此数据的各种可视化. Leaflet非常擅长聚类数据客户端 – 所以如果我通过密度值传递了千个位置,它可以通过处理所有单个值来渲染相关区域的热图.@H_197_10@

问题是,我说缩小地图以显示整个世界.如果不是不可能的话,将所有数据发送到客户端并使其足够快地处理该信息以实现平滑可视化将是非常低效的.@H_197_10@

所以我需要做的是自动集群数据服务器端,我希望可以在MongoDB查询中完成.我已经读过geohashing可能是确定哪些点属于哪些集群的一个很好的起点,但我确信有人之前已经完成了这个问题并且可能有更好的洞察力.理想情况下,我想向我的node.js脚本发送一个查询,如下所示:@H_197_10@

http://myserver.com/poPDAta?top=42.48&left=-80.57&bottom=37.42&right=-62.55&stat=Age&value=6_11

这将根据要返回的数据点的最大数量或沿着这些线的某些内容,根据指定地理区域内有多少个点来确定聚类需要多少粒度;它将返回如下数据:@H_197_10@

[
    { "clusterLOCATIOn": [ 42.304,-72.622 ],"@R_430_10586@l_age_6_11": 59042 },{ "clusterLOCATIOn": [ 36.255,-64.124 ],"@R_430_10586@l_age_6_11": 7941 },{ "clusterLOCATIOn": [ 40.425,-70.693 ],"@R_430_10586@l_age_6_11": 90257 },{ "clusterLOCATIOn": [ 39.773,-67.992 ],"@R_430_10586@l_age_6_11": 102752 },...
]

…其中“clusterLOCATIOn”类似于集群中所有文档位置的平均值,“@R_430_10586@l_age_6_11”是“Subpopulations.Age.6_11”的文档值的总和.@H_197_10@

这是我可以纯粹在Mongo查询中做的事吗?是否有“经过试验和测试”的方法来做得好?@H_197_10@

解决方法

即使您在运行时进行此查询,也会导致效率低下并且不能快速被视为良好的用户界面.
我建议你预生成特定大小的簇,并将它们与原始文档一起存储在当前集合中.
方法如下:

>每个文档将存储一个额外的字段(我们称之为geolevel),它将表示它是多么小或大的实体.您的基础文档将具有geolevel = 1:@H_197_10@

{
    "Placename" : "Boston","85_" : 9057
        }
    },"geolevel":1  // added geolevel
}

>您可以对数据库运行处理,以便为群集和多个级别预生成类似的文档.
例如geolevel:2将是半径250公里范围内的几个城市的集群,
geolevel:3将是geolevel集群:2个集群.
>您还可以存储像memberids这样的字段来存储子项ID
每个集群.这可能是必要的,以避免实体进入两个相邻的集群,它可以分配给任何一个相邻的集群,你的可视化仍然可以正常工作.
geolevel:2集群文档看起来像:@H_197_10@

{
    "Placename" : "cluster_sdfs34535",// The id can be generated from hash like sha of a list of all children ids.
    "LOCATIOn" : {  // center of the cluster
        "type" : "Point","Subpopulations": { // @R_430_10586@l population of the cluster
        "Age": { 
                "0_4" : 371220,"6_11" : 331670,"12_17" : 354640,"18_24" : 1308850,"25_34" : 1270580,"34_44" : 790920,"45_54" : 720760,"55_64" : 597660,"65_74" : 339970,"75_84" : 202190,"85_" : 90570
        }
    },"geolevel":2,"childs":[4,5,6,7] // ids of child documents
}

>现在,您的可视化应用程序需要执行zoomlevel到geolevel的映射,并在此基础上选择您的文档.对于城市级可视化,您可以查询geolevel:1文档,当您缩小到州,国家等时,您可以将geolevel增加到2,3 …@H_197_10@

大佬总结

以上是大佬教程为你收集整理的node.js – MongoDB:按地理位置划分区域和最大点的群集文档?全部内容,希望文章能够帮你解决node.js – MongoDB:按地理位置划分区域和最大点的群集文档?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。