在MySQL数据库中对纬度和经度数据进行聚类

3
我有一个包含纬度和经度值的数据库。我想要对这些数据进行聚类,以便在每次搜索数据库时获得更少的结果。有什么实现方法吗?
这是一个类似的问题: 在数据库中聚类Lat/Longs

你是说你想将结果集限制在提供的纬度/经度半径内吗? - Ray
@Ray 是的,考虑到我想要将这些值分成3个簇。例如,如果我们有100个点,其中30个点与特定位置相近但不同,另外30个点和40个点也是如此。我们希望有3个簇,它们包含:Cluster1(30个值),Cluster2(30个值)和Cluster3(40个值)。或者更好的方法是,如果我可以发送一个中心点,并得到30个非常接近该点的值作为结果。 - George Melidis
经度和纬度是在两列中吗?基本上,您想能够指定一个点并返回最接近的30条记录(或根据您的请求为40条)? - Ray
@Ray 我将它们分别存储在两列中,并将它们作为空间点存储在一列中,以进行一些测试。我想尝试在一个案例中给出一个特定的点,而在另一个案例中不给出,因此需要让程序识别这30个点非常接近,将它们放入一组中。 - George Melidis
@Ray 所以有两种情况:第一种情况是根据给定的特定点组数据;第二种情况是将数据分组成簇,并随机选择初始点。 - George Melidis
考虑将数据加载到适合聚类的工具中,而不是MySQL。 - Has QUIT--Anony-Mousse
1个回答

2

找到最接近给定经纬度的记录不是太难。假设你有一个名为location的表,其中包含longitudelatitude两列,你可以执行以下操作(将代码中的<your_longitude><your_latitude>替换为你所需的值)。

   SELECT id, latitude, longitude,  
               ROUND(6353 * 2 * ASIN(SQRT(POWER(SIN((<point_latitude> - 
                      abs(latitude)) * pi()/180 / 2),2) + COS( <point_latitude>  * pi()/180 ) 
                      * COS( abs(latitude) *  pi()/180) 
                      * POWER(SIN(( <point_longitude> - longitude) 
                      *  pi()/180 / 2), 2) )), 2) AS distance
     FROM location
     ORDER BY distance ASC 
     LIMIT 30;

您可以使用空间函数来进行类似操作。

好的,我明白了。但是如果没有给定特定的点呢?我发现kmeans可以做到这一点,但我不知道如何实现。 - George Melidis
@GeorgeMelidis 不确定如何实现kmeans聚类,但可以查看这个链接http://jonisalonen.com/2012/k-means-clustering-in-mysql/。看起来需要一个存储过程。 - Ray
谢谢Ray,我看到了这篇文章。这是我找到的唯一一篇 :-). 我会尝试一下,如果我的数据有好的结果,我会发布的! - George Melidis
@GeorgeMelidis 祝你好运! - Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接