查询以匹配包含点的多边形
Query to Match a Polygon that contains a Point
我的 mongodb collection 中的文档如下所示:
{
"_id" : ObjectId("5562d6831683523f449e7d85")
"geometry" : {
"type" : "Polygon",
"coordinates" :
[[
[-122.4,37.81],
[-132.9, 39.9],
[-122.28, 37.80],
[-124.18, 39.81]
]]
}}
我有一个点(经纬度对),我称之为 x
和 y
。我需要查看文档的坐标是否创建了一个多边形,以便这些坐标位于该多边形内。
所以,我当然需要计算描述多边形每条边的线等,然后查看点的坐标是否在其中。但是,现在,假设我们要查询 x
和 y
在整个数组的最大和最小经纬度值范围内的文档。
以下是我尝试查询的方式:
db.<collection-name>.find(
{'geometry.coordinates':
{$elemMatch:
{
[{$gt:-122.1}, {$lt:-122.0 }], [{$gt: 37.89 },{$lt: 37.91}]
}
}
}
)
然而,结果是:Unexpected token [
。我试着按照这个例子 here。
如何查询这样一个数组,文档中数组的每个元素都有条件?谢谢。
你似乎试图通过匹配数组元素来做的实际上是 "Finding a Polygon that contains a Point",这就是为什么我改变了你的问题标题。
要完成此操作,您最好使用 MongoDB 的 geoSpatail 功能,而不是尝试自己计算边界。使用有效的 GeoJSON 数据,使用 $geoIntersects
运算符查询非常简单。
为了演示,我将首先设置一个 collection,其中包含一些多边形数据:
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
不需要)在处理地理空间数据时最好定义一个 "index"。对真正的 GeoJSON 位置有意义的是 "2dsphere"。索引是在包含 GeoJSON 数据的 "root" 的字段上创建的,在本例中称为 "geometry":
db.areas.createIndex({ "geometry": "2dsphere" })
然后您需要做的就是提供一个 .find()
查询。我在这里使用 "San Francisco city" 的坐标:
db.areas.find({
"geometry": {
"$geoIntersects": {
"$geometry": {
"type": "Point",
"coordinates": [
-122.45361328124999,
37.76420119453823
]
}
}
}
})
当然 returns "Polyon" 定义了 "San Franciso" 区域,因为 "Point" 位于 object.
内
{
"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 ]
]]
}
}
这就是查找您的 "Point" 是否位于您存储在 collection 中的 "Polygon" 内的全部内容。
另请查看 geojsonlint.com and geojson.io(示例,而非认可)等工具,以验证和可视化您的数据,从您的示例来看,这些工具并未提供格式正确的多边形。
我的 mongodb collection 中的文档如下所示:
{
"_id" : ObjectId("5562d6831683523f449e7d85")
"geometry" : {
"type" : "Polygon",
"coordinates" :
[[
[-122.4,37.81],
[-132.9, 39.9],
[-122.28, 37.80],
[-124.18, 39.81]
]]
}}
我有一个点(经纬度对),我称之为 x
和 y
。我需要查看文档的坐标是否创建了一个多边形,以便这些坐标位于该多边形内。
所以,我当然需要计算描述多边形每条边的线等,然后查看点的坐标是否在其中。但是,现在,假设我们要查询 x
和 y
在整个数组的最大和最小经纬度值范围内的文档。
以下是我尝试查询的方式:
db.<collection-name>.find(
{'geometry.coordinates':
{$elemMatch:
{
[{$gt:-122.1}, {$lt:-122.0 }], [{$gt: 37.89 },{$lt: 37.91}]
}
}
}
)
然而,结果是:Unexpected token [
。我试着按照这个例子 here。
如何查询这样一个数组,文档中数组的每个元素都有条件?谢谢。
你似乎试图通过匹配数组元素来做的实际上是 "Finding a Polygon that contains a Point",这就是为什么我改变了你的问题标题。
要完成此操作,您最好使用 MongoDB 的 geoSpatail 功能,而不是尝试自己计算边界。使用有效的 GeoJSON 数据,使用 $geoIntersects
运算符查询非常简单。
为了演示,我将首先设置一个 collection,其中包含一些多边形数据:
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
不需要)在处理地理空间数据时最好定义一个 "index"。对真正的 GeoJSON 位置有意义的是 "2dsphere"。索引是在包含 GeoJSON 数据的 "root" 的字段上创建的,在本例中称为 "geometry":
db.areas.createIndex({ "geometry": "2dsphere" })
然后您需要做的就是提供一个 .find()
查询。我在这里使用 "San Francisco city" 的坐标:
db.areas.find({
"geometry": {
"$geoIntersects": {
"$geometry": {
"type": "Point",
"coordinates": [
-122.45361328124999,
37.76420119453823
]
}
}
}
})
当然 returns "Polyon" 定义了 "San Franciso" 区域,因为 "Point" 位于 object.
内 {
"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 ]
]]
}
}
这就是查找您的 "Point" 是否位于您存储在 collection 中的 "Polygon" 内的全部内容。
另请查看 geojsonlint.com and geojson.io(示例,而非认可)等工具,以验证和可视化您的数据,从您的示例来看,这些工具并未提供格式正确的多边形。