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

2024-02-23

我目前正在开发一种谷歌地图概述小部件,它将位置显示为地图上的标记。标记的数量从数百个到数千个(10000 个以上)不等。现在我正在使用谷歌地图的 MarkerClusterer v3 1.0谷歌地图 javascript api v3(高级)对于一百个标记来说,它的效果相当不错。由于标记的数量会增加,我需要一种新的标记聚类方法。根据我的阅读,保持性能的唯一方法是将集群从客户端移动到服务器端。有谁知道一个好的 PHP5 库可以帮我完成这个任务吗?

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

提前致谢!


我不知道有哪个服务器端库可以为您完成这项工作。不过,我可以为您提供一些有关如何自行实施的指导。

聚类的基本方法就是计算标记之间的距离以及其中两个标记之间的距离。足够接近您可以将它们替换为位于两者之间的中点的单个标记。

您不仅可以限制彼此标记的距离,还可以(或相反)选择限制您想要的簇/标记的数量。

为了实现这一点,您可以计算所有标记对之间的距离,对它们进行排序,然后从顶部合并,直到您想要的标记/簇数量为止。

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

我猜想,如果标记数量有限,这种简单的聚类形式就足够了。如果您的数据集(标记数量及其位置)大致是静态的,您可以偶尔在服务器上计算聚类,对其进行缓存,然后直接从缓存中为客户端提供服务。

但是,如果您需要支持可能具有世界各地标记的大规模场景,您将需要更复杂的方法。

上述集群算法无法扩展。事实上,其计算成本通常会随着标记数量呈指数增长。

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

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

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

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

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

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

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

然而,这种方法有一个缺陷:考虑两个相邻的图块,一个在左边,一个在右边。如果左侧图块在其最右侧包含一个标记/簇,而右侧图块在其最左侧包含一个标记/簇,则这两个标记/簇应该合并,但不会合并,因为我们正在执行聚类每个图块单独的机制。

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

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

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

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

递归地应用此方法,您最终将得到一个分区键,该分区键可识别您的图块,允许快速转换为 x、y、z 坐标并具有位置属性。这种密钥命名方案有时称为Quad Key由于分区方案形成了一个事实四叉树。局部性属性与使用 Z 顺序曲线将 2D 值映射到 1D 值时获得的属性相同。

如果您需要更多详细信息,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谷歌地图 API v3 的服务器端集群 的相关文章

  • Apache 2.4.9 在启用 ssl 模块并设置 ssl 证书后失败

    Apache 在尝试设置 ssl 证书后抛出以下错误 ssl emerg pid 30907 AH02572 Failed to configure at least one certificate and key for localhos
  • Magento 中的子域 htaccess 问题

    public html www domain com public html subdomain subdomain domain com public html htaccess public html subdomain htacces
  • 准备好的语句需要 0 个参数,给定 1 个参数..,使用 php 手册示例 [重复]

    这个问题在这里已经有答案了 我直接从 php 手册示例中获取了这个 它几乎与我需要的相同 但我仍然收到此错误 有人可以告诉我我错过了什么吗 stmt link gt prepare SELECT obitBody Photo FROM tn
  • PHP 用星号替换所有字符

    假设我有一个字符串形式的密码 password thisisaplaintextpassword 我怎样才能把它变成下面的样子 password 我想通过电子邮件向用户发送他们的帐户详细信息 但不想发送整个内容 Use 字符串重复 http
  • 从样式化的 Google 地图中删除室内地图

    我正在尝试制作一个样式化的谷歌地图 其中仅包含波士顿地铁线路 土地和水 我将所有内容的可见性设置为关闭 但一些建筑物仍然显示出来 而且它看起来是唯一带有室内地图的建筑物 这是我的代码
  • MYSQL 的 Google OAuth 2.0 用户 ID 数据类型

    我正在实施 Google OAuth 2 0 并注意到 Google OAuth 返回的唯一用户 ID 是21位数字长的 我想大整数 20 足以满足这种需求 但我现在看到 Google OAuth 返回的用户 ID 的长度感到困惑 关于我应
  • 地图路由,像谷歌地图一样吗?

    我一直对地图路由很感兴趣 但我从未找到任何好的入门 甚至高级 级别的教程 有人有任何指示 提示等吗 Update 我主要寻找有关如何实现地图系统 数据结构 算法等 的指导 看看开放街道地图项目 http www openstreetmap
  • Magento - 将特定父类别的子类别列为链接

    我是 php 的初学者 并且一直试图将一个父类别的子类别作为链接调用 我得到了这个 它调出了 getName 但 getUrl 根本没有返回任何 URL 输出代码只是 li a href name of sub a li
  • 重复使用相同的卷曲手柄。性能大幅提升?

    在 PHP 脚本中 我对不同的 URL 执行了许多不同的curl GET 请求 一百个 将重复使用来自curl init提高性能 还是与请求的响应时间相比可以忽略不计 我这么问是因为在当前的架构中保持相同的句柄并不容易 交叉发布自我应该关闭
  • 如何在 Zend Framework 中存储 cron 作业的脚本?

    因为 ZF 的所有 URL 都依赖于 mod 重写 所以我并不清楚应该在哪里存储用于 cron 作业的本地脚本 有人有什么建议 或者有 正式接受 的方式吗 我用模块化目录结构 http framework zend com manual e
  • TOMCAT 6 中的 PHP - 异常

    我一直在努力融入PHP in APACHE TOMCAT 6依照指示second answer为了QUESTION https stackoverflow com questions 779246 run a php app using t
  • 如何以编程方式获取 WooCommerce 中的所有产品?

    我想获取 WooCommerce 中的所有产品数据 产品 sku 名称 价格 库存数量 可用性等 我可以使用 wp query 来做到这一点吗 这样你就可以通过 wp query 获取所有产品 global wpdb all product
  • AWS S3 上传的图像已损坏

    我正在 AWS ec2 ubuntu 机器上工作 我的代码在 cakephp 中 当我尝试将任何图像上传到 AWS S3 时 它都会损坏 虽然它在核心 php 代码中运行良好 这是我的控制器代码 if this gt User gt sav
  • Laravel 按动态 ID 数组对集合进行排序 [重复]

    这个问题在这里已经有答案了 我有以下 people array 5 2 9 6 11 people collection People find people 但当我倾倒并死去时 people collection集合按 ID ASC 排序
  • PHP 中的 NOW() 函数

    是否有 PHP 函数以与 MySQL 函数相同的格式返回日期和时间NOW 我知道如何使用date 但我想问是否有专门用于此的功能 例如 返回 2009 12 01 00 00 00 您可以使用date https www php net m
  • 使用 DOJO 自动完成文本框

    我正在寻找一种使用 DOJO 进行文本框自动建议的简单方法 我将查询的数据库表 使用 PHP 脚本 以 JSON 形式返回 有超过 100 000 条记录 因此这确实不应该采用 FilteringSelect 或 ComboBox 的形式
  • Azure 上的“phpcomposer.phar install”出现“无法终止进程”错误

    我正在尝试将我的 Symfony 2 应用程序部署到 Microsoft Azure 网站云 为此 我按照本指南中的步骤操作http symfony com doc current cookbook deployment azure web
  • 如何使用 Google 帐户对我们网站中的用户进行身份验证

    如何在我们的网站中使用 Google 帐户对用户进行身份验证 我希望用户重定向到谷歌登录页面 然后将他重定向到我的网站 我想要这个 PHP 实现 你要OAuth http code google com apis accounts docs
  • PHP cURL 在本地工作,在 AWS 服务器上出现错误 77

    最新更新 脚本作为管理员用户通过 SSH shell 作为 php script php 成功运行 当由 nginx 用户运行时 curl 命令无法执行 https 请求 所以我猜测这是nginx用户无法正确使用curl的问题 我已经检查了
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将

随机推荐

  • tailwindcss:强制 tailwind 使用兼容的 RGB 语法?

    我正在使用 tailwindcss 移植一个应用程序以与 IE11 一起使用 不幸的是 tailwindcss 坚持使用现代技术生成颜色W3C CSS 颜色模块级别 4 rgb https drafts csswg org css colo
  • 加载新键盘时从数字键盘上删除“完成”按钮

    好吧 我会尽力解释这一点 我有一个 iPhone 应用程序 它有一个文本字段 用户只能输入数字 那里不是问题 但是 数字键盘上没有完成按钮 所以我无法让它消失 我可以制作一个按钮 用户按下该按钮即可关闭键盘 但我宁愿有一个完成按钮 因为屏幕
  • Eigen static libaligned_free“双重释放或损坏”

    这是一个延续较早的帖子 https stackoverflow com questions 70788173 eigen static lib memory align 但这一次希望有一个更好的例子 设置向量时 这个简单的测试会崩溃 我正在
  • 使用 DotNetZip 库解压包含非 ASCII 字符的文件

    我正在尝试使用 DotNetZip 库解压缩文件 该文件包含带有丹麦语字符 的文件夹和文件 TotalCommander 7Zip Windows 自己的 zip 都能正确提取文件 但 DotNetZip Library 会破坏丹麦语字符
  • MVC4 FoolProof 数据注释 - 如何检查该字段不等于零?

    我正在尝试使用 MVC Foolproof 库来验证我的模型并分别显示错误消息 但是 当我使用万无一失的验证时 单击提交按钮时 即使常规验证也不会显示 我的要求是我有一个数字文本框 它不应该为空或零 文本框值是根据从前面的下拉列表中选择的值
  • 如何将变量从控制器传递到视图 joomla mvc

    根据此示例 如何将变量从 joomla 子控制器传递到视图 class MYControllerControllerParser extends JController public function construct default a
  • 如何仅序列化.Net 中的某些属性?

    这是一个 Web 项目 所以我有几个继承自 Web UI 的类 我只想序列化非常特殊的属性 基本上 只有本地属性 我知道 XMLIgnore 属性可以放置在属性上以忽略项目 但这在我的上下文中不起作用 因为这需要修改一堆我真的不想修改的东西
  • 使用 Woocommerce 中的元查询从任何地方排除特定产品

    我想从我的商店页面以及我的主页中排除来自给定城市的产品 在主页中我显示来自 flatsome UX Builder 的 woocommerce 商店小部件 不确定它是一个小部件 的产品 给定城市的产品不会出现在我的商店页面中 但它们仍然出现
  • 如何在 Flutter 中将数据从子 Stateful widget 传递到 Parent Widget

    我的 flutter 应用程序中有一个有状态的小部件 DayPicker 相同的代码是 class DayPicker extends StatefulWidget override DayPickerState createState g
  • 分布式 ASP.Net 状态服务

    我想知道是否存在任何分布式 ASP Net State Service 替代方案 Session 可以存储在 InProc StateService 或 SQL 中 您还可以编写自定义存储提供程序 对于负载平衡 没有任何形式的粘性 IP 只
  • json 模式中的对象重用和组合

    我有一个 json blob 看起来像这样 ObjectA Object1 fields Object2 fields Object3 fields ObjectB Object1 fields Object2 fields Object3
  • srand (time (null)) 导致编译器警告:隐式转换丢失整数精度

    如果这个问题已经得到解答 我们深表歉意 include
  • ASP.net Bin目录-dll加载

    我需要在我的 asp net 应用程序中使用 dll 如何加载不是来自 bin 目录的 dll 也许我应该提到该应用程序是 asp 代码和 asp net 代码的混合体 所以 当我在我的机器上开发它时 我在 bin 目录中放置了一个 dll
  • 将 JSX 转换为 JSON 或 String,然后再转换回来

    我想将 React 组件的状态保存在数据库中 Json stringify myComponent 但是 当我尝试通过 JSON parse 再次使用该组件时 我得到了 Error Objects are not valid as a Re
  • 如何更改 Mac 上的 JAR 图标?

    我的 Mac 上有一个名为 Test jar 的 JAR 文件 当我单击它时 该文件运行得非常好 它所做的只是打开一个小窗口 并显示 Test 所以它是一个简单的应用程序 我是 Java 编程新手 我的问题是如何将 jar 文件的图标更改为
  • C# 二进制常量表示

    我真的被这个难住了 在C 中 有如下的十六进制常量表示格式 int a 0xAF2323F5 有二进制常量表示格式吗 不 C 中没有二进制文字 您当然可以使用 Convert ToInt32 解析二进制格式的字符串 但我认为这不是一个很好的
  • 如何在 Python 中将*所有*字符转义为相应的 html 实体名称和数字?

    我想将字符串编码为其相应的 html 实体 但不幸的是我无法做到 正如我在问题标题中所说 我想要all字符串中的字符将被转换为相应的 html 实体 数字和名称 所以根据文档 https docs python org 3 library
  • 如何在 firestore 文档 ID 的位置添加用户 UID

    我正在尝试获取用户 UID 来代替 Firebase Firestore 中自动生成的文档 ID 但由于此错误而无法获取它 类型错误 firebase auth currentUser 为 null 这是我的 index js 文件 Fir
  • Python请求访问OAUTH网站内容 - SNL财经

    我一直在用头撞墙 试图从新闻来源 SNL 财经 检索内容 我拥有有效的凭据 因此理论上我应该能够以编程方式访问他们的新闻内容 简而言之 我尝试执行以下脚本但没有成功 s requests Session client id client s
  • 谷歌地图 API v3 的服务器端集群

    我目前正在开发一种谷歌地图概述小部件 它将位置显示为地图上的标记 标记的数量从数百个到数千个 10000 个以上 不等 现在我正在使用谷歌地图的 MarkerClusterer v3 1 0和谷歌地图 javascript api v3 高