需要有关必须显示250 000条折线的Google地图应用程序的指南

时间:2009-12-11 14:48:10

标签: asp.net google-maps kml

1 个答案:

答案 0 :(得分:10)

大量短GPolylines比少量长GPolylines慢大幅

Google Maps v2和Google Maps v3之间的速度差异不会很大,因为大部分CPU时间将由浏览器的实际图形系统占用。 Google地图使用VML,SVG或Canvas图形系统,具体取决于浏览器。其中,VML是迄今为止最慢的,只要浏览器是MSIE就可以使用它。

在着手处理250,000个细分市场之前,我建议您先看看这个quick speed test of 200 random polylines。尝试在MSIE中缩放和显示该地图。

然后,还要考虑需要从服务器发送到客户端以指定250,000个线段的数据量。数据量将根据您选择KML还是JSON或GeoRSS而有所不同,但如果每个线段最终需要20个字节,则需要50秒才能获取1兆位宽带连接。考虑一下您的用户是否准备好坐50秒钟。

真正有意义的唯一解决方案是执行Google为其流量覆盖做的事情,并将线条绘制到服务器中的切片上,并将这些切片显示为客户端中的GTileLayerOverlay。

您需要的是一个空间感知数据库,以及像gd或ImageMagik这样的服务器端图形库。客户端要求服务器提供磁贴。如果缩放高于某个级别,服务器将扫描数据库以查找具有与所请求磁贴的边界框重叠的边界框的线段,并使用图形库绘制它们。

缩放级别限制用于限制数据库和服务器需要执行的工作量。您不希望最终将250,000个线段绘制到单个缩小的区块上,因为这对于服务器来说是一项非常艰苦的工作,并且对用户来说并不是很重要。

关于点击处理:

最简单的方法是侦听地图上的点击,而不是对象,并将点击详细信息发送到服务器。然后,服务器使用单击位置搜索空间感知数据库,并返回所单击对象的详细信息(如果有)。客户端代码执行此操作:

  GEvent.addListener(map,"click",function(overlay,point) {
    var url="clickserver.php?lat=" + point.lat() + "&lng=" +point.lng();
    GDownloadUrl(url, function(html) {
      if (html.length) {
        map.openInfoWindow(html)
      }
    });
  });

更难的是当指针位于折线上时处理光标的更改。有一种已知的技术可以对小标记进行光标更改,其工作原理如下:

每当提取一个tile时,.getTileUrl()也会调用一个服务器,该服务器返回该tile的热点框列表。当鼠标移动时,客户端会不断计算鼠标所在的图块,然后扫描相应的热点框列表。

Google自己在他们的GLayer()代码中添加了执行四叉树搜索的复杂性,以加快搜索磁贴内的热点,但是在自己的代码中实现此策略的其他人认为这不是必需的,热点列表的线性扫描足够快。

我不知道如何将其扩展到在折线检测上处理光标。