一对多地理空间搜索

Posted

技术标签:

【中文标题】一对多地理空间搜索【英文标题】:One to many geospatial search 【发布时间】:2013-05-25 13:01:48 【问题描述】:

对于一个对象,我想关联多个 lat/lng 对,这样当给定我的地理位置时,我可以获得离我最近的对象 [即如果这些 lat/lng 对中的任何一个满足最近的条件]

虽然我知道如果对象只有一对 lat/lng 时如何进行地理空间搜索,但我被困在这个多重地理空间搜索中。

我想知道如何在 mysql、Sphinx 或 MongoDB 中实现这一点?如果有其他技术可以做到这一点,我也将不胜感激。非常感谢!

【问题讨论】:

【参考方案1】:

您可以在 MongoDB 中使用位置数组。

> db.array.insert(locs:[ [ 1, 2], [1.5, 1.8], [2, 1] ])
Inserted 1 record(s) in 134ms
> db.array.ensureIndex(locs:'2d')
Inserted 1 record(s) in 6ms
> db.array.insert(locs:[ [ 1, 2], [7.5, 1.8], [2, 5] ])
Inserted 1 record(s) in 2ms
> db.array.find(locs:$near:[1,2])
 "_id" : ObjectId("51a193f11192cab2195f7a8a"), "locs" : [ [ 1, 2 ], [ 1.5, 1.8 ], [ 2, 1 ] ] 
 "_id" : ObjectId("51a1940b1192cab2195f7a8c"), "locs" : [ [ 1, 2 ], [ 7.5, 1.8 ], [ 2, 5 ] ] 
 "_id" : ObjectId("51a193f11192cab2195f7a8a"), "locs" : [ [ 1, 2 ], [ 1.5, 1.8 ], [ 2, 1 ] ] 
 "_id" : ObjectId("51a193f11192cab2195f7a8a"), "locs" : [ [ 1, 2 ], [ 1.5, 1.8 ], [ 2, 1 ] ] 
 "_id" : ObjectId("51a1940b1192cab2195f7a8c"), "locs" : [ [ 1, 2 ], [ 7.5, 1.8 ], [ 2, 5 ] ] 
 "_id" : ObjectId("51a1940b1192cab2195f7a8c"), "locs" : [ [ 1, 2 ], [ 7.5, 1.8 ], [ 2, 5 ] ] 
Fetched 6 record(s) in 8ms

【讨论】:

【参考方案2】:

制作新表 - 一对多的关系。所以有你的对象表,第二个有一个 object_id 和一个纬度/经度。如果一个对象有很多位置,那么它在这个新表中有很多行。

然后像其他方式一样搜索这个新表。 (无论是 mysql 还是 sphinx)

(您已经有了 MongoDB 的答案:)

【讨论】:

以上是关于一对多地理空间搜索的主要内容,如果未能解决你的问题,请参考以下文章

sql 一对多查询

不搜索一对多核心数据关系

在一对多映射中使用休眠条件(以行表列作为搜索条件之一的搜索标题表)

使用 SQL 搜索一对多关系中的集合

在模型值及其关系中查找字符串的一部分的自定义搜索(一对多)

交响乐。如何使用一对多的表格创建表单汽车搜索?