gpt4 book ai didi

javascript - 在 mongodb 地理位置查询中使用对象属性作为 $maxDistance 参数

转载 作者:行者123 更新时间:2023-11-28 09:00:11 25 4
gpt4 key购买 nike

我想编写一个带有 $maxDistance 参数的 $near 查询,该参数的值不是恒定的。例如,我有一个具有位置和覆盖半径的消防站集合,我想找到覆盖半径包括某个特定点的所有消防站。覆盖半径可能因站而异。

我有一个充满文档的集合,如下所示:

{
'loc' : [-72,40],
'radius' : 10
}

查询类似于:

{'loc': { $near : coordinates, $maxDistance : 'radius'}};

但这并不正确。

如果我正在编写 SQL 查询,我会使用类似以下内容的内容:

SELECT * FROM table AS foo WHERE foo.radius ... (whatever your distance method looks like)

但我不知道如何在 mongo 查询中访问该 radius 变量。这可能吗?

最佳答案

你不能完全这样做——一般来说,你不能将 MongoDB 查询中的任何内容基于集合中的值。

但是,从 MongoDB 2.4 开始,我们支持名为 2dsphere 的新索引,它不仅允许您在数据库中存储点,还可以存储多边形。您可以将该信息存储在如下文档中:

db.so.ensureIndex( { loc: '2dsphere' } );
db.so.insert( {
name: "Firestation 1",
loc: {
type: "Polygon",
coordinates: [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
}
} );

然后您可以使用“相交”查询来确定某个点是否被每个多边形覆盖:

db.so.find( {
'loc' : {
$geoIntersects: {
$geometry: { type: 'Point', coordinates: [ 0, 0 ] }
}
}
} );

然后返回:

{ 
"_id" : ObjectId("51f24d566775068ab0b786f0"),
"name" : "Firestation 1",
"loc" : {
"type" : "Polygon",
"coordinates" : [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
}
}

这里它找到了消防站,因为 0, 0 位于多边形的中间。现在的技巧当然是计算构成距中心点“半径”(例如 10 公里)的圆的多边形点。您将无法获得真正的圆形,但六边形或八边形应该足够了。其数学原理并不是非常简单,但是 http://www.movable-type.co.uk/scripts/latlong.html#destPoint有一个 JavaScript 示例。只需将方位 Angular 从 0 到 2PI 分 8 步循环即可计算沿圆圆周的点,并将它们放入坐标中。确保将它们嵌入到双重嵌套数组中,并使第一个和最后一个相同:

{
name: "Firestation 1",
loc: {
type: "Polygon",
coordinates: [ [
[ point1-lon, point1-lat ],
[ point2-lon, point2-lat ],
[ point3-lon, point3-lat ],
...
[ point1-lon, point1-lat ],
] ]
}
}

关于javascript - 在 mongodb 地理位置查询中使用对象属性作为 $maxDistance 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17868480/

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