当前位置: 首页 > 知识库问答 >
问题:

MongoDB中的多边形分组

孔权
2023-03-14

我有一个包含多边形的json,这些多边形表示一个国家中所有城市(总共78个)的分隔符。例如:

{
    "City1":[
        [-67.103276,18.513426],
        [-67.10339411502086,18.514532657212502],
        [-67.093752,18.515757],
        [-67.05297606966441,18.512073045833525]
    ],
    "City2":[
        [-67.16901339052771,18.472154288860388],
        [-67.169016,18.478488],
        [-67.138249,18.507776],
        [-67.12906260088943,18.510642646697203],
        [-67.125655,18.511706]
    ],
    "City3":[
        [-66.034932,18.333452],
        [-66.03494,18.332214],
        [-66.035911,18.328084],
        [-66.035731,18.31961],
        [-66.036859,18.318627]
    ],
    ...
}
polygon = [[-67.103276,18.513426],[-67.10339411502086,18.514532657212502],[-67.093752,18.515757],[-67.05297606966441,18.512073045833525]]
from_date = DateTime.strptime(params[:from_date], '%Y-%m-%d')
from_date = Time.utc(from_date.year, from_date.month, from_date.day)
to_date = DateTime.strptime(params[:to_date], '%Y-%m-%d')
to_date = Time.utc(to_date.year, to_date.month, to_date.day)

@coll = db.collection("points")
recordset = @coll.find(
    { 
        "$and" => [
            { "geometry.coordinates" => {
                "$within" => {"$polygon" => polygon}
            }}, 
            { "properties.time" => {
                :$gte => from_date,
                :$lte => to_date
            }}
        ]
    },
    :fields => { :_id => false }
)

有没有什么方法可以用一个查询将所有城市的结果分组,或者我必须查询数据库78次才能获得每个城市的计数?

共有1个答案

严俊彦
2023-03-14

当您想要分组时,需要使用聚合框架。您将需要一个包含两个步骤和可选的第三步的聚合管道:

  1. 上面使用$match运算符的查询(顺便说一下,$and是不必要的。您可以将“geometry.coordines”“properties.time”放在同一个关联数组中)
  2. 一个$group运算符,它_id=>“$cityname”(我猜cityname是存储城市名称的字段)和“number_of_points”=>{“$sum”=>1}。新字段number_of_points将包含每个城市的点数。
  3. (可选)城市的名称现在将出现在_id字段中。当您希望字段具有不同的名称时,可以使用额外的$project步骤重命名它。
 类似资料:
  • 我希望通过一条线串拆分一个多多边形(代表一个有岛屿的国家),从而将该县一分为二。 此结果是GeometryCollection对象中的一组多边形。如何将结果分组为两个多多边形对象,每个对象都包含各自一半的多边形? 使现代化 问题:确定分裂形状几何的“左”和“右”侧提供了一个很好的解决方案,其中从结果中的每个多边形中提取一个点,看看当与分裂的LineString结合时,它是否形成顺时针或逆时针线串。

  • 我有一个“SpatialPolygons”对象,我想在@hole==FALSE处对多边形进行子集,并创建一个新对象。 使用下面的代码,一次可以预测得到1个多边形(如果@hole==TRUE,则没有),但我无法从对象中分割多个多边形。 我认为我的问题在于我不知道如何“一般”引用第二个列表,即从列表(Polygon)中获取项目,其中@孔==FALSE。将第二个[[]]留空不起作用。 附言:抱歉,没有可

  • 返回顶点的输入数组,并且附有一些其他方法,如下面所描述 polygon.area() 返回此多边形的标定区域。如果顶点是逆时针顺序,面积为正,否则为负。 polygon.centroid() 返回一个表示此多边形的质心的两元素数组。 polygon.clip(subject) 对这个多边形剪切主题多边形。换句话说,返回一个多边形表示这个多边形和主题多边形的交集。假定剪切的多边形是逆时针方向以及凸多

  • 我们是否可以使用符合以下条件的mongodb地理空间查询来查询和获取位置数据? 获取两个框或一般两个多边形之间交集的所有位置。 例如,在下面,我们能在查询输出中只获得那些位于黄色区域内的位置吗?黄色区域实际上是紫色和红色几何对象[多边形]的公共区域?

  • 假设我有两个不相交的多边形组/“岛屿”(想想两个不相邻县的人口普查区)。我的数据可能看起来像这样: 我希望每个岛内的多边形采用表示其组的ID(可以是任意的)。例如,左下角的3个多边形的IslandID为1,右上角的3个多边形的IslandID为2。 我已经开发了一种方法来做到这一点,但我想知道这是否是最好/最有效的方法。我做以下工作: 1) 创建一个几何体等于多多边形一元并集内多边形的地理数据框。

  • 问题内容: 我正在使用MongoDB开发地理空间网络应用程序。我在具有不同类别(,等)的集合上有很多多边形,我想知道哪个是某个多边形,但是在某些情况下,邻居的边界碰到了多边形的边界,所以当我查询十字路口,我有2个国家。 我想计算该州与两个国家之间的重叠百分比,以了解哪个是父级。我一直在寻找,但是我没有找到具有这种操作的任何库,并且我做这种算法不是很好。 编辑:添加更多上下文 这是我正在使用的模型