【问题标题】:Group coordinates by proximity to each other按彼此接近程度对坐标进行分组
【发布时间】:2015-07-30 11:31:59
【问题描述】:

我正在构建一个 REST API,因此答案不能包含谷歌地图或 javascript 的东西。 在我们的应用中,我们有一个表格,其中包含如下所示的帖子:

  ID |   latitude   | longitude   | other_sutff
   1 | 50.4371243   |  5.9681102  |    ...
   2 | 50.3305477   |  6.9420498  |    ...
   3 | -33.4510148  | 149.5519662 |    ...

我们有一个带有地图的视图,其中显示了世界各地的所有帖子。 希望我们会有很多帖子,在地图上显示成千上万个标记会很荒谬。所以我们想按邻近度对它们进行分组,这样我们就可以按大陆有 2-3 个标记。

要清楚,我们需要这个: 图片来自https://github.com/googlemaps/js-marker-clusterer

我做了一些研究,发现 k-means 似乎是解决方案的一部分。 因为我在数学方面真的很差,所以我尝试了几个像这样的 php 库:https://github.com/bdelespierre/php-kmeans,这似乎做得不错。 但是,有一个缺点:每次加载地图时,我都必须解析所有表格。就性能而言,这很糟糕。

所以我想知道是否有人已经解决了这个问题,或者是否有更好的解决方案。

【问题讨论】:

  • 您能否缓存集群结果以提高性能?例如,在数据库或某种其他类型的缓存层(如果您使用的是旧版本的 PHP,则为 APC)。
  • 我不确定,该应用程序的工作方式会持续创建/销毁数据。
  • 好吧,这很有趣。我认为这是一个很好的例子,缓存有时是一种权衡,您需要在实时信息和性能之间做出决定。这意味着它是一个巨大的灰色区域……但是您可以问自己一些问题:在给定的时间内(比如一分钟)我需要提供多少次这些数据?处理 SQL 请求需要多长时间 - 几秒钟或几分钟?如果显示的数据不是实时的,比如 30 秒、1 分钟、2 分钟前的数据,这有关系吗?目标是确定您的用户会接受什么。通常是性能 > 新鲜度。
  • 除此之外,关注您的数据。有没有办法通过查看索引(在适当的情况下)或分析我的查询效率来加快查询速度?有没有办法连续或定期地预先计算结果集?
  • 实际上,我并不担心我的 SQL 查询是一个简单的从哪里选择,即使当然需要一些表优化。我认为最慢的部分是在 PHP 端循环我的查询结果和构建组。但是,是的,我认为你是对的,数据可能是 5 分钟前的数据,但我的客户想要真正的实时数据。我将看看我可以用 OPcache 做什么。感谢您的建议@Darragh

标签: php mysql group-by coordinates


【解决方案1】:

我一直在寻找,我找到了 KMeans 的替代方法:GEOHASH

维基百科会比我更好地解释它是什么:Wiki geohash

但总而言之,世界地图分为 32 个单元格,每个单元格都有一个字母数字字符。 每个单元格也分为 32 个单元格,依此类推,共 12 个级别。 因此,如果我在哈希的第一个字母上执行GROUP BY,我将获得最低缩放级别的集群,如果我想要更高的精度,我只需要按哈希的前 N ​​个字母进行分组。

所以,我所做的只是在我的表中添加一个字段并生成与我的坐标对应的哈希:

ID |   latitude   | longitude   | geohash      | other_sutff
 1 | 50.4371243   |  5.9681102  | csyqm73ymkh2 |     ...
 2 | 50.3305477   |  6.9420498  | p24k1mmh98eu |     ...
 3 | -33.4510148  | 149.5519662 | 8x2s9674nd57 |     ...

现在,如果我想得到我的集群,我只需要做一个简单的查询:

SELECT count(*) as nb_markers FROM mtable GROUP BY SUBSTRING(geohash,1,2); 

在子字符串中,2是精度级别,必须在1到12之间

PS:Lib I used to generate my hash

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2021-07-17
    • 2020-03-22
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    相关资源
    最近更新 更多