服务器端 Google 标记聚类 - Python/Django

7 投票
4 回答
4320 浏览
提问于 2025-04-15 11:19

在尝试用客户端的方法来处理大量谷歌标记的聚合后,我发现这对我的项目来说是不可能的(我的社交网络有超过28,000个用户)。

有没有关于在服务器端聚合坐标的例子 - 最好是用Python/Django来实现的?

我希望这个功能的工作方式是根据标记之间的距离(半径)和缩放级别逐渐进行索引。

换句话说,当一个新用户注册时,他/她会自动被分配到一组彼此靠近的标记中,从而增加这个“组”的计数。发送到服务器的只是少量的“组”。只有当地图的缩放级别是1:1时,实际的用户才会显示在地图上。

这样,客户端每次请求/缩放级别只需要处理10到50个标记。

4 个回答

0

一种方法是根据缩放级别来定义一个网格,网格的单位大小就是这个缩放级别。你可以把所有的点根据经纬度(保留到小数点后一位)放到一个网格里。比如说,42.2x73.4就是一个网格的坐标。如果有一个点的坐标是42.2003x73.4021,那它就落在这个网格里。这个网格的边界是42.2x73.3到42.2x73.5之间。

如果一个网格里有一个或多个点,你就可以在这个网格的中心放一个标记。

接着,你需要监听缩放结束的事件,然后根据新的缩放级别调整网格的大小,并重新绘制标记。

http://code.google.com/apis/maps/documentation/reference.html#GMap2.zoomend

1

你可以看看维基百科上的DBSCANOPTICS页面,这些方法非常适合在地图上进行地点聚类。此外,还有一个关于聚类分析的页面,里面展示了你可以使用的所有可能的算法,大多数算法用你选择的编程语言实现起来都很简单。

如果你有超过28000个数据点,建议你直接使用C/C++,而不是先用django,并且也不要指望能实时处理这些数据来响应网页请求。

2

这个是一个收费服务,它使用服务器端的聚类技术,但我不太清楚具体是怎么运作的。我猜他们只是利用你的数据来生成在不同缩放级别下显示的标记。

更新: 这个教程展示了一个基本的服务器端聚类功能。它是用PHP写的,适用于静态地图API,但你可以把它当作一个起点来使用。

撰写回答