mongodb $geoIntersects 或 $geoWithin 一个点匹配多个多边形 - 按面积排序?
mongodb $geoIntersects or $geoWithin a point matches multiple polygons - sort by area?
我有一个 mongo 查询来检查一个点是否在多边形内。
neighborhood = db.collection.findOne({
loc: {$geoInteresects: {$geometry: {
type: 'Point',
coordinates: [lng, lat]
}}}
})
目前,我所有的多边形都只是一个层次,一个邻域,其中 none 个重叠。
我想开始在同一个集合中存储城市、县和国家数据。显然,我可以将 findOne 更改为查找和修改
代码适当,但特别是,我希望结果排序
匹配,所以结果是:
[ "Downtown", "San Francisco", "California", "US", "North America"]
用它来构建一个漂亮的字符串对我来说是微不足道的。
我还没有设置多层多边形,所以我还没有测试。
我知道 $near 运算符 returns 最近指向一个对象,并且可以排序,但我的假设是,通过阅读文档,因为我的测试点在 polgyon 内,所以排序顺序将是不确定的,而且我也 运行 也有获得附近多边形的风险,然后我将不得不检查第二个地理相交以确保我们不在其中。
所以我用不同的方式解决了这个问题。计算地理对象的面积应该在填充索引时提前完成。
我编写了代码来计算每个多边形的面积和边界并插入到集合中,因此可以使用常规排序及其索引。
db.collection.find({
loc: {$geoInteresects: {$geometry: {
type: 'Point',
coordinates: [lng, lat]
}}}).sort({'properties.area': 1})
将始终给出我们匹配的最小多边形。如果 Mongo 可以做到这一点,那就太好了,但由于它可能是一个计算量大的操作,即使使用梯形模型,它也应该在插入时完成一次,而不是在查找时每次都完成。
我有一个 mongo 查询来检查一个点是否在多边形内。
neighborhood = db.collection.findOne({
loc: {$geoInteresects: {$geometry: {
type: 'Point',
coordinates: [lng, lat]
}}}
})
目前,我所有的多边形都只是一个层次,一个邻域,其中 none 个重叠。
我想开始在同一个集合中存储城市、县和国家数据。显然,我可以将 findOne 更改为查找和修改 代码适当,但特别是,我希望结果排序 匹配,所以结果是: [ "Downtown", "San Francisco", "California", "US", "North America"]
用它来构建一个漂亮的字符串对我来说是微不足道的。
我还没有设置多层多边形,所以我还没有测试。
我知道 $near 运算符 returns 最近指向一个对象,并且可以排序,但我的假设是,通过阅读文档,因为我的测试点在 polgyon 内,所以排序顺序将是不确定的,而且我也 运行 也有获得附近多边形的风险,然后我将不得不检查第二个地理相交以确保我们不在其中。
所以我用不同的方式解决了这个问题。计算地理对象的面积应该在填充索引时提前完成。
我编写了代码来计算每个多边形的面积和边界并插入到集合中,因此可以使用常规排序及其索引。
db.collection.find({
loc: {$geoInteresects: {$geometry: {
type: 'Point',
coordinates: [lng, lat]
}}}).sort({'properties.area': 1})
将始终给出我们匹配的最小多边形。如果 Mongo 可以做到这一点,那就太好了,但由于它可能是一个计算量大的操作,即使使用梯形模型,它也应该在插入时完成一次,而不是在查找时每次都完成。