【问题标题】:Clustering Latitude Longitude data in MySQL Database在 MySQL 数据库中聚类经纬度数据
【发布时间】: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 所以两种情况:一种情况:给定基于该点的特定点组数据。第二种情况:将数据分组并随机选择初始点

标签: mysql database cluster-analysis latitude-longitude


【解决方案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 祝你好运!
猜你喜欢
  • 2010-09-24
  • 2019-08-03
  • 2016-08-17
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2021-06-08
  • 2015-02-11
相关资源
最近更新 更多