我们的想法是将整个世界划分为带网格的区域。网格中的每个方块都是一个簇。根据用户的纬度和经度,我需要检查用户位置在这些群集中的位置并将用户放入其中。
我需要实现的是一种聚集用户位置并了解哪些用户彼此最近的方法。
将网格划分为网格的想法只是一种选择。如果这是一种更简单的方式,那就更好了。我知道我可以通过多种方式检查两个给定用户的距离,但这不是我想要的。我需要创建位置集群并将每个用户放在相关集群中。
有没有人知道脚本/ api /方法来实现上述目标?
非常感谢任何帮助。
由于
答案 0 :(得分:0)
Cluster analysis是一个复杂的问题,根据您的需求和可用信息,存在许多解决方案。
k-means是一种算法,您可以在其中提供您希望作为初始参数的多少个群集,算法将围绕该数字进行聚类。它速度很快,但通常不能获得最佳结果和/或强迫您为 k 选择一个您无法猜测的数字。
DBSCAN是一种算法,它根据两个位置之间的距离和您提供的截止半径创建聚类。它创建了比 k -means更好的结果,但也明显更慢。
除此之外,还有更多可用的算法,所有算法都针对不同的数据模型或用例进行了调整和优化。我所知道的PHP中没有任何实现。你真正想要的是一个支持GIS的数据库,例如PostgreSQL + PostGIS。这是一个很好的选择。有一个本地k-means extension可用。你可以hook it into R,many packages for all sorts of clustering algorithms。
如果您的数据集足够大,那么这是唯一可行的路线,并且肯定会进行一些初步的艰难战斗。否则你几乎完全坚持使用简单的舍入坐标到最接近的整数和计数算法,这在几乎任何数据库的PHP中都很容易实现(但只能让你使用基于网格的方块,不漂亮)。
当然,使用简单的工具可以解决这个问题。在数据库中执行简单的基于网格的聚类以缩小数据集范围,然后使用基于权重的算法在客户端上进一步聚类PHP或Javascript中的剩余标记。或者使用你所拥有的任何慢速方法每晚预先计算整个事物。但是没有任何实现可以像使用体面的GIS后端可以实现的那样好。
答案 1 :(得分:-1)
我认为你不要求k-means或dB扫描。 Mysql具有空间扩展和点数据类型。因此,您可以简单地将用户放在点列中,并使用点在矩形内的查询。我还写了一个基于怪物曲线的四键php集群脚本。它是经常在Oracle dB或其他中使用的四叉树。您可以给我写一封电子邮件或从phpclasses下载我的课程。包名是希尔伯特曲线。以下是bing map tiling http://msdn.microsoft.com/en-us/library/bb259689.aspx的示例。