gpt4 book ai didi

mongodb - 查询以匹配包含点的多边形

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

我的 mongodb 集合中的文档如下所示:

{
"_id" : ObjectId("5562d6831683523f449e7d85")
"geometry" : {
"type" : "Polygon",
"coordinates" :
[[
[-122.4,37.81],
[-132.9, 39.9],
[-122.28, 37.80],
[-124.18, 39.81]
]]
}}

我有一个点(lat long pair),我将其称为 xy。我需要查看文档的坐标是否创建了一个多边形,使得这些坐标位于该多边形内。

所以,我当然需要计算描述多边形每条边的线等,然后查看点的坐标是否在其中。但是,现在,让我们假设我们要查询具有整个数组的最大和最小 lat long 值内的 xy 的文档。

这是我尝试查询的方式:

db.<collection-name>.find(
{'geometry.coordinates':
{$elemMatch:
{
[{$gt:-122.1}, {$lt:-122.0 }], [{$gt: 37.89 },{$lt: 37.91}]
}
}
}
)

然而,结果是:Unexpected token [。我试图按照示例 here .

我如何查询这样的数组,文档中数组的每个元素都有条件?谢谢。

最佳答案

你似乎试图通过匹配数组元素来做实际上是“找到一个包含一个点的多边形”,这就是我改变你的问题标题的原因。

要实现这一点,您最好使用 MongoDB 的 geoSpatail 功能,而不是尝试自己确定界限。使用有效的 GeoJSON 数据,使用 $geoIntersects 查询非常简单。运算符。

为了演示,我将首先设置一个包含一些 Polygon 数据的集合:

db.areas.insert([
{
"name": "San Jose",
"geometry": {
"type": "Polygon",
"coordinates": [[
[ -122.20916748046876, 37.13404537126446 ],
[ -122.20916748046876, 37.496652341233364 ],
[ -121.65710449218749, 37.496652341233364 ],
[ -121.65710449218749, 37.13404537126446 ],
[ -122.20916748046876, 37.13404537126446 ]
]]
}
},
{
"name": "San Franciso",
"geometry": {
"type": "Polygon",
"coordinates": [[
[ -122.73651123046874, 37.58811876638322 ],
[ -122.73651123046874, 37.89219554724437 ],
[ -122.28332519531249, 37.89219554724437 ],
[ -122.28332519531249, 37.58811876638322 ],
[ -122.73651123046874, 37.58811876638322 ]
]]
}
}
])

然后(尽管 $geoIntersects 不需要专门)在处理 geoSpatial 数据时,最好定义一个“索引”。对真正的 GeoJSON 位置有意义的是 "2dsphere" .索引是在包含 GeoJSON 数据“根”的字段上创建的,在本例中称为“几何”:

db.areas.createIndex({ "geometry": "2dsphere" })

那么您需要做的就是提供一个 .find() 查询。我在这里使用“旧金山市”的坐标:

db.areas.find({
"geometry": {
"$geoIntersects": {
"$geometry": {
"type": "Point",
"coordinates": [
-122.45361328124999,
37.76420119453823
]
}
}
}
})

这当然会返回定义“San Franciso”区域的“Polyon”,因为该“Point”位于该对象内。

    {
"name": "San Franciso",
"geometry": {
"type": "Polygon",
"coordinates": [[
[ -122.73651123046874, 37.58811876638322 ],
[ -122.73651123046874, 37.89219554724437 ],
[ -122.28332519531249, 37.89219554724437 ],
[ -122.28332519531249, 37.58811876638322 ],
[ -122.73651123046874, 37.58811876638322 ]
]]
}
}

这就是找出您的“点”是否位于您存储在收藏中的“多边形”内的全部内容。

还可以查看 geojsonlint.com 等工具和 geojson.io (示例,而不是背书)以验证和可视化您的数据,从您的示例中,这些数据不能提供格式良好的多边形。

关于mongodb - 查询以匹配包含点的多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31576966/

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