gpt4 book ai didi

node.js - MongoDB:按地理位置给定区域和最大点数的集群文档?

转载 作者:IT老高 更新时间:2023-10-28 13:28:29 30 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。




Improve this question




我正在尝试基于包含以下文档的 MongoDB 集合开发基于 map 的可视化,其中包括子群的“热图”:

{
"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 非常擅长对客户端的数据进行聚类——所以如果我将一千个具有密度值的位置传递给它,它可以通过处理所有单个值来呈现相关区域的热图。

问题是,假设我缩小 map 以显示整个世界。将所有数据发送给客户端并让它足够快地处理这些信息以实现平滑的可视化,这将是非常低效的,如果不是不可能的话。

所以我需要做的是自动集群数据服务器端,我希望可以在 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 查询中做的事情吗?有没有一种“久经考验”的方法可以做得很好?

最佳答案

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

  • 每个文档将存储一个额外的字段(让我们称之为 geolevel ),这将表示它是多大或多大的实体。您的基本文档将具有 geolevel=1 :
    {
    "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
    }
    },
    "geolevel":1 // added geolevel
    }
  • 您可以在数据库上运行处理,以便为集群和多个级别预先生成类似的文档。
    例如geolevel:2 将是半径 250 公里内的少数城市集群,
    geolevel:3 将是 geolevel:2 集群的集群。
  • 您还可以存储类似 memberids 的字段。将 child 的 ID 存储在
    每个集群。这可能是避免一个实体进入两个相邻集群所必需的,它可以分配给任何一个相邻的集群,您的可视化仍然可以正常工作。
    geolevel:2 集群文档如下所示:
     {
    "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",
    "coordinates" : [ 42.358056, -71.063611 ]
    },
    "Subpopulations": { // total 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
    }
  • 现在,您的可视化应用程序需要将缩放级别映射到地理级别,然后您将根据该映射选择您的文档。对于城市级别的可视化,您可以查询 geolevel:1 文档,当您缩小到州、国家等时,您可以将 geolevel 增加到 2,3...
  • 关于node.js - MongoDB:按地理位置给定区域和最大点数的集群文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36651454/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com