通过HTTP处理大型地图数据

时间:2015-06-12 01:04:47

标签: javascript json google-maps

如何通过HTTP有效地发送大量地图数据以供客户端渲染?似乎有一种比提供JSON file with all of the map data更好的方法。我很好奇大型网站如Apartments.com或Foursquare如何提供他们的地图数据"需要知道"基础。

2 个答案:

答案 0 :(得分:0)

通常,这些大型网站"懒惰负载"它。基本上,这意味着即使它是一个大型数据集,它们也只能一次下载相关项目,当您排序,翻页等时,它们会加载更多。因此,您可以拥有数百万行,但实际上只能实际处理一个非常小的子集。

如果你谷歌延迟加载,你应该找到很多例子。

答案 1 :(得分:0)

如果地图图层的数据很大,您可能需要考虑以下几个选项:

  1. 一次只传输一个屏幕的数据。 (使用这种方法,在屏幕周围包含一个缓冲区也很有用,这样如果用户平移一小段距离就不必刷新数据。)我在以前的项目中使用了这个,这对于中低密度层。

    您可能希望为密集图层引入缩放触发器,这样您就不会渲染太多。编写基于AJAX的图层系统相对简单。我们最终只有几十行,主要涉及响应地图缩放和移动事件,如果用户发现了卸载区域,则使图层无效,以及处理对返回GeoJSON的Web服务的AJAX请求。

    您显然还必须处理传入您感兴趣的空间范围,但所有空间数据库都支持仅请求总数据集的一小部分。如果遇到性能问题,可能必须使用空间索引 - 例如,我必须对存储在SQL Server中的非常密集的层进行一些调整。

  2. 群集地图数据取决于您的缩放级别。虽然现代Web映射引擎功能强大,但是当您尝试在图层上渲染数千个标记时,即使是最好的也会变慢。使用聚类来组合紧密相邻的元素,提高性能并创建更清晰的地图。 Leaflet's MarkerCluster plugin就是一个很好的例子。

  3. 如果所有其他方法都失败了,您可以使用UTFGrid方法为交互式图层数据尝试基于图块的渲染。这会将底层地图数据拆分为统一大小的图块(例如256x256像素),并在幕后将数据建模为字符网格。例如,'X'可以对应于特定的人口密度。这些网格的创建成本相对较高,但如果您的数据是静态的,它们对于积极的缓存非常开放;你甚至可以提前预先生成整个地图的UTFGrid数据。

  4. 这里有一个很好的UTFGrids介绍:http://blog.perrygeo.net/2012/02/24/utfgrids-with-openlayers-and-tilestache/

    Mapnik和Tilestache可以从给定的多边形+数据源生成UTFGrids,或者编写自己的相对容易。