繁体   English   中英

谷歌地图api v3的服务器端群集

[英]Server-side clustering for google maps api v3

我目前正在开发一种谷歌地图概览小部件,在地图上显示位置作为标记。 标记物的数量从几百到几千个标记物(10000个以上)变化。 现在我正在使用MarkerClusterer进行谷歌地图v3 1.0谷歌地图javascript api v3(总理) ,它的工作相当不错,让我们说一百个标记。 由于标记的数量将增加,我需要一种新的聚类标记的方法。 从我读到的,保持性能提升的唯一方法是将集群从客户端移动到服务器端。 有谁知道一个好的PHP5库能够为我完成这个吗?

Atm我正在深入研究谷歌地图的层机制。 也许还有一些领先的PHP库我可以开始检查? 我也遇到了FusionTables,但由于我需要群集,我认为这可能不是正确的解决方案。

提前致谢!

我不知道服务器端库会为你做什么。 但是,我可以给你一些关于如何自己实现一个的指示。

聚类的基本方法是简单地计算标记之间的距离,当它们中的两个足够接近时,用位于两者之间的中点的单个标记替换它们。

您可以(或者相反)选择限制所需的聚类/标记数量,而不仅仅限制彼此标记的接近程度。

要完成此操作,您可以计算所有标记对之间的距离,对它们进行排序,然后从顶部进行合并,直到您只拥有任意数量的标记/簇。

要在形成聚类时细化中点定位,您可以考虑要合并的两个中的每一个所代表的实际标记的数量。 将该数字视为权重,将两个标记之间的线条视为比例。 然后,不要总是选择中点,而是选择能够平衡比例的点。

我想如果你的标记数量有限,那么这种简单的聚类形式就足够了。 如果您的数据集(标记的数量及其位置)大致是静态的,您可以偶尔计算服务器上的群集,直接从缓存中缓存它和服务器客户端。

但是,如果您需要支持世界各地可能使用标记的大规模方案,则需要采用更复杂的方法。

提到的聚类算法不能扩展。 事实上,它的计算成本通常会随着标记的数量呈指数增长。

要解决此问题,您可以将世界拆分为分区并计算群集并为每个分区的客户端提供服务。 这确实会支持扩展,因为工作负载可以由几个(大致)独立的服务器拆分和执行。

那么问题是如何找到一个好的分区方案。 您可能还需要考虑在不同的缩放级别提供不同的标记聚类,并且您的分区方案也应该包含此标记以允许缩放。

Google将地图划分为具有x,y和z坐标的图块,其中xy是从地图的西北角开始的图块的水平和垂直位置,其中z是缩放级别。

在最小缩放级别(零)处,整个地图由单个图块组成。 (所有图块均为256x256像素)。 在下一个缩放级别,该图块被划分为四个子图块。 这继续,因此在缩放级别2中,这四个图块中的每一个都被划分为四个子图块,这给出了总共16个图块。 缩放级别3有64个图块,级别4有256个图块,依此类推。 (任何缩放级别的图块数量可以表示为4^z 。)

使用此分区方案,您可以从最低缩放级别(最高z坐标)开始计算每个拼贴的聚类,然后冒泡直至到达顶部。

要为单个图块聚类的标记集是其四个子图块的所有标记(其中一些可以表示聚类)的并集。

这为您提供了有限的计算成本,并为您提供了一种很好的方法来分块发送到客户端的数据。 客户端可以在加载到地图中时逐个图块地请求标记,而不是请求给定缩放级别的所有标记( 不会缩放)。

然而,这种方法存在一个缺陷:考虑两个相邻的瓷砖,一个在左边,一个在右边。 如果左侧磁贴在其最右侧包含标记/集群,而右侧磁贴在其最左侧包含标记/集群,那么这两个标记/集群应该合并但不会是因为我们正在执行集群每个瓷砖单独的机制。

要解决此问题,您可以在对其进行聚类后对其进行后处理,以便合并位于四个边缘中的每个边上的标记/聚类,同时考虑给定切片的八个相邻切片中的每一个。 这种后合并机制仅在我们可以假设没有单个簇足够大以影响不在同一子区块中的周围标记时才起作用。 然而,这是一个合理的假设。

最后要注意的是:通过扩展方法,您可以让客户提出几个小请求。 这些请求将具有局部性(即,瓦片不是随机请求的,而是通常也一起访问在地理上彼此接近的瓦片)。

为了提高查找/查询性能,您将受益于使用也具有此局部性属性的搜索键(表示切片)(因为这将存储磁盘上相邻数据块中相邻切片的数据 - 从而提高了读取时间和缓存利用率)。

您可以使用tile / sub tile分区方案来形成这样的密钥。 让顶部图块(跨越整个图的单个图块)将空字符串作为键。 接下来,让它的每个子瓦片具有键A,B,C和D.下一级将具有键AA,AB,AC,AD,BA,BC,...,DC,DD。

递归地应用这个,你最终会得到一个识别你的图块的分区键,允许快速转换为x,y,z坐标并具有locality属性。 这种关键命名方案有时被称为Quad Key,源于分区方案形成四叉树的事实。 当使用Z顺序曲线将2D值映射到1D值时,locality属性与您获得的属性相同。

如果您需要更多详细信息,请与我们联系。

你可以尝试我的免费群集应用程序。 它能够比客户端谷歌地图api更多的引脚。 它为kmeans提供基于网格的聚类。

https://github.com/biodiv/anycluster

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM