按距离排序,你觉得我应该怎么做?

Posted

技术标签:

【中文标题】按距离排序,你觉得我应该怎么做?【英文标题】:Sort by distance, how do you think I should do this? 【发布时间】:2013-06-26 11:14:35 【问题描述】:

My Company 目前提供家庭活动列表服务。在我们的 CMS 中,我们有两种类型的实体 Branches(我们列出的商店)和 Events(特别优惠、场合等)。

通常在列出活动时,我们会说出它是针对哪些分支机构并建立关系的,我们会在附近的商店中搜索活动。抓取它们并按距离排序。

现在我们的客户希望能够列出一个没有与之关联的分支的一次性活动(例如,他们在附近的花园中心而不是他们的商店之一举办节日),我可以轻松让它我也可以按距离排序。

但我想知道如何将两者结合起来,所以我们的一个应用程序可以访问我们的 API,“伙计,我现在在哪里附近有 10 个事件?”并且 api 会拉出一个列表10 个最接近的事件。

它应该能够处理使用分支位置以及拥有自己独特位置的事件。

或者你认为我应该将位置存储为它自己的实体还​​是隐藏分支,我们可以将这些位置设置为事件发生的地方,但实际上并不显示为应用程序中的一个分支 :)

【问题讨论】:

【参考方案1】:

如果您的活动和分支机构有纬度/长期位置,您可以应用Haversine 公式计算近似距离,然后按升序排列。

如果您愿意使用复杂的查询,mysql 可以做到这一点。谷歌地图团队的这篇笔记给出了查询。您不必使用 Google 地图来执行此操作;您只需要涉及每个地点的经纬度信息。

https://developers.google.com/maps/articles/phpsqlsearch_v3

编辑 确实,如果您计算多对地点之间的距离,这会非常慢。使这种操作快速进行的技巧是使用边界框(球形)距离限制,并在纬度和经度上放置索引。

看这个:Geolocation distance SQL from a cities table

【讨论】:

:) 这是我使用的,它工作得很好,如果我有两个带有纬度和经度的表,它是否可以与连接一起工作。我可以加入他们并排序吗?我知道这是一项非常昂贵的手术。【参考方案2】:

MYSQL 支持“空间数据库”,如spacial extension 这将允许您在列中使用“空间”数据类型,并在它们上建立索引,并执行各种“空间分析”,例如多边形相交。

不确定这是您需要的,但这可能值得调查。

【讨论】:

谢谢我去看看:) 由于某种原因,MySQL 空间扩展对非欧几里得球面几何没有任何作用。 与 PostGIS 之类的相比,我所听到的总是非常有限

以上是关于按距离排序,你觉得我应该怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

按邮政编码距离升序计算和排序用户的最快方式(也是最优化的)

订餐系统之按距离[根据经纬度]排序搜索

按计算距离对 MySQL 结果排序(距离未存储在 DB 中)

Excel技巧 | 这个快速排序方式你得会(视频)

使用空间分析函数和数据类型在 MySQL 中按距离排序

Elasticsearch:在 Elasticsearch 中按距离有效地对地理点进行排序