PHP Geolocation将用户群集到世界区域

时间:2013-07-30 13:02:05

标签: php geolocation

我们的想法是将整个世界划分为带网格的区域。网格中的每个方块都是一个簇。根据用户的纬度和经度,我需要检查用户位置在这些群集中的位置并将用户放入其中。

我需要实现的是一种聚集用户位置并了解哪些用户彼此最近的方法。

将网格划分为网格的想法只是一种选择。如果这是一种更简单的方式,那就更好了。我知道我可以通过多种方式检查两个给定用户的距离,但这不是我想要的。我需要创建位置集群并将每个用户放在相关集群中。

有没有人知道脚本/ api /方法来实现上述目标?

非常感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:0)

Cluster analysis是一个复杂的问题,根据您的需求和可用信息,存在许多解决方案。

k-means是一种算法,您可以在其中提供您希望作为初始参数的多少个群集,算法将围绕该数字进行聚类。它速度很快,但通常不能获得最佳结果和/或强迫您为 k 选择一个您无法猜测的数字。

DBSCAN是一种算法,它根据两个位置之间的距离和您提供的截止半径创建聚类。它创建了比 k -means更好的结果,但也明显更慢。

除此之外,还有更多可用的算法,所有算法都针对不同的数据模型或用例进行了调整和优化。我所知道的PHP中没有任何实现。你真正想要的是一个支持GIS的数据库,例如PostgreSQL + PostGIS。这是一个很好的选择。有一个本地k-means extension可用。你可以hook it into Rmany packages for all sorts of clustering algorithms

如果您的数据集足够大,那么这是唯一可行的路线,并且肯定会进行一些初步的艰难战斗。否则你几乎完全坚持使用简单的舍入坐标到最接近的整数和计数算法,这在几乎任何数据库的PHP中都很容易实现(但只能让你使用基于网格的方块,不漂亮)。

当然,使用简单的工具可以解决这个问题。在数据库中执行简单的基于网格的聚类以缩小数据集范围,然后使用基于权重的算法在客户端上进一步聚类PHP或Javascript中的剩余标记。或者使用你所拥有的任何慢速方法每晚预先计算整个事物。但是没有任何实现可以像使用体面的GIS后端可以实现的那样好。


几年前我曾经遇到过类似的问题,认为它不会那么难,最终会放弃它,因为我用它时可用的工具硬。你的普通PHP / MySQL组合几乎没有任何东西可以解决这个问题。一旦升级到正确的工具,您就可以突然获得更多解决方案。就我而言,目前是PostGIS,R和GeoServer。由于任何算法都是CPU或内存密集型或两者兼而有之,因此PHP通常不足以实现它,而没有本机GIS数据类型和功能的数据库会让您的生活变得不必要。

答案 1 :(得分:-1)

我认为你不要求k-means或dB扫描。 Mysql具有空间扩展和点数据类型。因此,您可以简单地将用户放在点列中,并使用点在矩形内的查询。我还写了一个基于怪物曲线的四键php集群脚本。它是经常在Oracle dB或其他中使用的四叉树。您可以给我写一封电子邮件或从phpclasses下载我的课程。包名是希尔伯特曲线。以下是bing map tiling http://msdn.microsoft.com/en-us/library/bb259689.aspx的示例。