查询匹配包含点的多边形



我的mongodb集合中的文档看起来像这样:

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

我有一个点(长对),我称它为xy。我需要看看文档的坐标是否创建了一个多边形,这样这些坐标就在那个多边形内。

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

下面是我如何查询的:

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

的结果是:Unexpected token [。我试着在这里效仿这个例子。

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

你似乎想通过匹配数组元素做的实际上是"找到一个包含点的多边形",这就是为什么我改变了你的问题标题。

要做到这一点,你最好使用MongoDB的geoSpatail功能,而不是试图找出自己的界限。对于有效的GeoJSON数据,使用 $geoIntersects 操作符查询非常简单。

为了演示,我将首先设置一个集合,其中包含一些多边形数据:

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数据"根"的字段上创建的,在本例中称为"geometry":

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

那么你所需要做的就是提供一个.find()查询。这里我使用的是"San Francisco city"的坐标:

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

返回定义"San francisco"区域的"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(示例,而不是背书),以验证和可视化您的数据,从您的示例中没有提供一个格式良好的多边形。

最新更新