我正在设计一个应用程序,该应用程序几乎在谷歌地图上显示 50K汽车,其中包含名称,数量和图片等详细信息。
我想知道这样做的最佳做法是什么。有些人建议制作原生移动应用或桌面应用,但我需要一个可以在网络浏览器上运行的 Web App 。数据将以 JSON 格式直接从服务器提取。
我应该限制数据还是有一些解决方法?
由于
答案 0 :(得分:3)
正如评论中所建议的那样,最好制作想要显示的50K数据点的聚类。
即使在24英寸1920x1080显示屏上看到50K数据点,也意味着每个显示器大约有41个像素,这意味着每个都有6x6像素的正方形,它们会填满你的所有屏幕。
很明显,你会有很多重叠。
此外,从JSON中的服务器获取50K数据点(并且你可能会得到一个包含所有这些数据的大json)将意味着你至少有50k x 10 x 2 = 1,000,000字节=每个请求从服务器提取1MB。 (50k点x每个浮点数10个字节,5个小数×2个数字,因为你有lat和long)。
因此,如果您希望这是实时的,您可能需要每2秒左右发出一次这些请求。
此外,并非所有这些都适合视口,因此您必须排除那些不在视口中的视频,因为它们无论如何都不会显示。所以服务器应该知道客户端使用什么样的显示(分辨率)。
我认为最好的方法是在服务器端编写一些集群逻辑,让客户端处理更少的数据点。 (我在这里聚类的意思是,多个点得到grouped together,当放大时,它们start unfolding成为不同的组)
<强>更新强>:
另外请注意,随着DOM节点数量的增加,选择器将运行得更慢,因为它们必须搜索许多节点。但是如果你将标记放在一个图层中并且不让选择器接触那个图层,那么你可以避免速度问题。所以它们不会浪费时间。
更新#2 :
要有效地发送数据,您可以使用BSON然后zip对其进行编码,然后将其传递到客户端,您可以使用zlib.js解压缩并使用{{3}阅读它。
我假设您将在服务器端使用C ++,但也有BSON。
更新#3 :
同时检查BSON implementations for many other languages这是一种轻量级传输协议。它在这里有一个Javascript实现mqtt protocol
更新#4 : 在某些情况下,自上次更新以来,某些点可能保持其位置,在这种情况下,您不需要发送其位置。
同样,根据点的速度和缩放级别,可能会有一些点 看起来好像他们根本没有移动(如果你是从很远的地方查看它们),所以你可能不想每次都发送这些点的位置。 所以只发送会改变客户端显示位置的那些 会有意义(因为其他的看起来是静态的,虽然它们不是)。
答案 1 :(得分:0)
恕我直言,如此大量的对象的最佳方式是使用光栅的服务器端渲染。
答案 2 :(得分:0)
一次获取所有数据,但只绘制视口或视口附近的标记。 ;)