在 MySQL 数据库中聚类经纬度数据

Posted

技术标签:

【中文标题】在 MySQL 数据库中聚类经纬度数据【英文标题】:Clustering Latitude Longitude data in MySQL Database 【发布时间】:2014-08-20 15:32:03 【问题描述】:

我有一个包含纬度和经度值的数据库。我想要做的是对这些数据进行聚类,以便每次搜索数据库时获得更少的结果。有什么想法可以实现吗?

这是一个类似的问题: Clustering Lat/Longs in a Database

【问题讨论】:

您是说要将结果集限制为提供的纬度/经度半径还是什么? @Ray 是的,考虑到我想将它们分组到 3 个集群中的值。例如,如果我们有 100 个点,其中 30 个不同但靠近特定位置,其他 30 个和 40 个值相同。我们想要 3 个集群,其中包含:Cluster1(30 个值)、Cluster2(30 个值)Cluster3(40 个值)或者如果我可以发送一个中心点并作为结果取 30 个非常接近该点的值会更好跨度> 经纬度是2列吗?所以基本上,您希望能够指定一个点并返回 30 条最接近的记录(或 40 条,具体取决于您的要求)? @Ray 我将它们分别存储在两列中,并将它们作为空间点存储在一列中,以便进行一些测试。我想尝试在一种情况下给出一个特定的点,而不是在另一种情况下,所以让程序认识到这 30 个点非常接近,所以把它们放在一个组中。 @Ray 所以两种情况:一种情况:给定基于该点的特定点组数据。第二种情况:将数据分组并随机选择初始点 【参考方案1】:

找到与给定经度/纬度最近的记录并不太疯狂。假设您有一个表 location 包含 longitudelatitude 列,您可以执行以下操作(用您的点中的值替换 and。

   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可以做到这一点,但我不知道如何实现。 @GeorgeMelidis 不确定如何实现 kmeans 集群,但请查看此 jonisalonen.com/2012/k-means-clustering-in-mysql 看起来需要存储过程 谢谢雷 我看过这篇文章。这是我找到的唯一一个:-)。我会尝试一下,如果我的数据有好的结果,我会发布! @GeorgeMelidis 祝你好运!

以上是关于在 MySQL 数据库中聚类经纬度数据的主要内容,如果未能解决你的问题,请参考以下文章

在R中聚类非常大的数据集

常见的5中聚类算法

在mongodb中聚类地理数据

5中聚类方法介绍

R 中聚类的训练和测试评估

请问spss中聚类分析的操作步骤