对数据有距离限制的空间查询

Posted

技术标签:

【中文标题】对数据有距离限制的空间查询【英文标题】:Spatial Query with distance restriction on data 【发布时间】:2014-09-17 22:29:38 【问题描述】:

我正在构建一个具有地理位置功能的应用。我目前被困在存储和查询数据的最佳方式上。 这是我常用的用例。

A 人添加了一张带有地理位置的图片。除了地理位置数据,他/她还添加了标志,表明他/她的图像仅对 1 英里内的用户可见。

现在,我的问题是,存储此信息的最佳方式是什么,以便另一个人可以看到他当前位置附近的所有图像,同时尊重存储图像的限制,例如仅可见 1 英里,仅可见 2 英里等。

【问题讨论】:

您是否仅限于使用 solr 或者是否可以使用其他解决方案 我愿意尝试不同的数据存储 【参考方案1】:

Solr 具有地理空间搜索功能(最近通过 Java 拓扑套件库得到了显着增强)。 Solr documentation 有一个使用距离过滤器的示例,该过滤器允许您找到与某个点的距离为 d 的任何东西,例如,

&q=*:*&fq=!geofilt sfield=location&pt=41.38,2.18&d=5

其中 q 是搜索的非地理空间部分,sfield 是您的位置字段,pt 是点(必须是纬度/经度,在上面的示例中是巴塞罗那),d 是距离字段.您可以将您的属性替换为 d 参数可以看到图像的距离。

请注意,还有 geodist 功能,如果您想突出显示更近的事物,它允许您按距离排序。

您可以使用的另一种方法是使用空间数据库并将位置数据存储为点字段。作为 Postgres/Postgis 的示例,您可以使用 http://postgis.net/docs/ST_DWithin.html 函数,它允许您搜索某个点距离内的所有内容。 Postgres/GIS 使用spatial indexing 的 R-tree 索引,它允许非常快速和有效地搜索这种性质。它还具有良好的属性部分的全文搜索能力。

select * from images where ST_DWithin( point, st_setsrid(st_makepoint(2.1, 41.38), 4326), 5);

您可以使用 Oracle 和 SQL Server 来做类似的事情(在较小程度上使用 mysql)。这种方法可能看起来比 Solr 方法更复杂,如果你坚持在纬度/经度中搜索,给我在距离该点 d 范围内匹配这个属性的所有图像,那么 SOLR 肯定会做你想要的,但是如果你想要要在未来考虑更高级的空间功能,并利用其他数据库功能,您可能需要考虑空间数据库方法。

【讨论】:

感谢约翰的回答。我熟悉使用 solr,我只是在想这是否是最好的方法。我的搜索将是空间搜索+属性搜索。我也研究过 postgres/postgis,但我没有做任何更快的基准测试,solr 或 postgresql/postgis,因为我没有很多数据来做基准测试。 为 solr 的假设道歉。根据我的经验,通过 tsearch 和各种 contrib 包在 Postgres 中进行文本搜索非常强大,但需要进行大量微调,而 Solr (Lucene) 或多或少是开箱即用的。从数据存储的角度来看,Postgres 和 Solr 当然是截然不同的野兽,而且 Postgis 的空间能力要大得多,即使在 Solr 中包含 JTS 也是如此。最终,您只能通过预期的用例测试真正做出决定,正如您所说,这在您的情况下是有问题的。

以上是关于对数据有距离限制的空间查询的主要内容,如果未能解决你的问题,请参考以下文章

Tastypie 的距离空间查询

MongoDB地理空间查询结果未按距离顺序排列

arcgis定义查询like公式

PostgreSQL 是不是实现地理空间关系查询?

ArcEngine不同种类的工作空间建立查询ICursor时“超出系统资源”

Oracle-查询表空间使用量