我正在设计一个应用程序,它在 Google map 上显示近 5 万辆汽车,其中包含名称、号码和图片等一些详细信息。
我想知道这样做的最佳做法是什么。有些人建议制作 native 移动应用程序或桌面应用程序,但我需要一个可以在网络浏览器上运行的 Web 应用程序。数据将以 JSON 格式直接从服务器中提取。
我应该限制数据还是有一些变通办法?
谢谢
最佳答案
正如评论中所建议的那样,您最好将要显示的 50K 个数据点聚类。
即使在 24"1920x1080 显示器上看到 50K 个数据点意味着每个数据点大约有 41 个像素,这意味着每个数据点有 6x6 个像素正方形,它们会填满整个屏幕。
很明显,您会有很多重叠。
此外,以 JSON 格式从服务器获取 50K 数据点(你可能会得到一个包含所有数据的大 json)意味着你至少有 50k x 10 x 2 = 1,000,000 字节 =从服务器拉取的每个请求 1MB。 (每个 float 50k 点 x 10 个字节,小数点后 5 位 x 2 个数字,因为你有纬度和经度)。
因此,如果您希望这是实时的,您可能必须每 2 秒左右发出一次这些请求。
此外,并非所有这些都适合视口(viewport),因此您必须排除那些不在视口(viewport)中的内容,因为它们无论如何都不会显示。所以服务器应该知道客户端使用的是哪种显示器(分辨率)。
我认为最好的方法是在服务器端编写一些集群逻辑,而让客户端处理较少的数据点。 (我在这里聚类的意思是,多个点得到 grouped together 并且在放大时,它们 start unfolding 分成不同的组)
更新:
还要考虑到随着 DOM 节点数的增加,选择器的运行速度会变慢,因为它们必须搜索许多节点。但是,如果您将标记放在一个层中并且不让选择器接触该层以免浪费时间,则可以避免速度问题。
更新#2:
要有效地发送数据,您可以使用 BSON 对其进行编码然后 zip并将其传递给客户端,您可以在客户端使用 zlib.js 解压缩并使用 BSON阅读它。
我假设您将在服务器端使用 C++,但有 BSON implementations for many other languages
更新#3:
同时检查 mqtt protocol这是一个轻量级的传输协议(protocol)。这里有一个 Javascript 实现 MQTT.js
更新#4: 在某些情况下,某些点可能在上次更新后一直保持着它们的位置,在这种情况下,您不需要发送它们的位置。
同样,根据点的速度和缩放级别,一些点可能 看起来好像它们根本没有移动(如果您从很远的地方查看它们)所以您可能不想每次都发送这些点的位置。 所以只发送那些会改变客户端显示位置的 是有道理的(因为其他的看起来是静态的,尽管它们不是)。
关于javascript - 通过 Javascript 在谷歌地图上创建 ~50K 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15500035/