7

我开始使用 maps api v3 实现我的软件。不幸的是,我发现 v3 API 存在一些严重的问题,这让我无法获得营业执照。

我的客户使用高清分辨率为 1920x1080 的显示器,地图占用了 90% 的屏幕空间。不幸的是,我正在谈论的问题来了。当我在地图上单击鼠标并开始拖动它时,它并不顺畅,而且真的很烦人。所有的乐趣都消失了。

我使用windows XP、windows 7 和 Windows 8尝试了一些不同的场景。我正在使用的浏览器是最新版本的 Firefox、Chrome 和 IE。以下是我尝试拖动地图时的结果:

  1. 小屏幕分辨率 320x240:Firefox、Chrome 和 IE 处理得很好。不可能注意到拖动不顺畅。
  2. 小屏幕分辨率 320x240,地图上有 10 条折线:Chrome 和 IE 处理得很好,但如果您有使用 v2 API 的经验,您会注意到不同之处。Firefox - 噩梦,拖动一点也不顺畅。
  3. 中等屏幕分辨率 1024x768。Firefox - 有一些不一致的滞后。Chrome 和 IE - 一种平滑的拖动,但如果你快速移动鼠标,情况会变得更糟。
  4. 中等屏幕分辨率 1024x768,地图上有 10 条折线。火狐——噩梦。Chrome 和 IE - 你开始注意到有一些延迟,但同时它看起来有点流畅。
  5. 高屏幕分辨率 1920x1080。Firefox - 巨大的滞后。Chrome 和 IE - 稍微好一点,但仍然有明显的滞后。6) 高屏幕分辨率 1920x1080,地图上有折线:Firefox、Chrome 广告 IE - NIGHTMARE。拖动地图几乎是不可能的。

有趣的事实:

  1. 谷歌地图的 v2 API 不存在上述问题。
  2. 当鼠标移动小于每秒 50-60 像素时,上述问题不存在。拖动真的很流畅。当鼠标快速移动时,会出现滞后。
  3. http://maps.google.com上,这个问题根本不存在,但是当我打开开发人员指南上的一些代码示例时,问题就在那里。这是一个示例:https ://google-developers.appspot.com/maps/documentation/javascript/examples/full/circle-simple 。

我认为我尽可能深入地描述了这个问题,无论我多么努力地试图绕过它,我都找不到任何解决方案。

如果有人就这个问题分享他们的意见,我会很高兴。

PS 不幸的是,我没有 v2 的密钥,因此我无法创建一个示例,您可以在其中查看本地主机之外的地图,但我找到了一个可以并排比较的网站(v2 和 v3)。尝试拖动地图以查看差异。

http://www.wolfpil.de/v2-v3-sidebyside.html

地图的分辨率非常小,很可能没有经验的用户可能看不到差异,所以我也会给你地图的单独链接,你只需要使用 firebug 或类似的调试器来使画布分辨率更大。然后你会看到我在说什么。

4

4 回答 4

6

我们遇到了将 CSS3 过渡添加到所有元素的问题。

所以删除过渡,它的工作正常..

参见示例:

#map * {
  -moz-transition: none;
  -webkit-transition: none;
  -o-transition: all 0s ease;
  transition: none;
}

于 2020-02-14T09:04:28.133 回答
5

同样在这里。我注意到的是,v3 在平移地图时会触发很多事件,并且浏览器往往会阻塞(尤其是 FF)。我这样说是因为我也使用了 Bing Maps API,并且每秒的事件数viewchange(相当于center_changedGoogle 中的)要小得多。它们还提供了addThrottledHandler()减少生成事件数量的方法。

据我所知,谷歌地图似乎会在地图视图更新之前center_changed为每个事件触发一个事件。mousemove因此,您会生成很多事件,但它们都不会在屏幕上复制;浏览器在地图视图更新时阻塞,或者地图可能会等到没有更多更改时才会更新视图。

编辑:如果我们阻止某些mousemove事件到达谷歌地图,那么浏览器将不会阻塞mousemove事件以及谷歌地图从该事件生成的所有其他事件,例如center_changed,地图将顺利平移。

为此,我们向#mapdiv 添加了一个事件侦听器(我们也可以将其添加到body标签中)。我们为捕获阶段添加事件。当鼠标在屏幕上移动时,body标签首先接收事件,然后是我们的#mapdiv,然后是 Google Maps 元素(div、tile)。这是捕获阶段。之后是冒泡阶段,事件从 Google 地图元素返回到我们的#mapdiv,然后返回到body标签。通常事件处理程序是为冒泡阶段注册的,所以如果我们为捕获阶段注册一个处理程序,我们可以取消事件,因此该事件将没有冒泡阶段。这也意味着谷歌地图将不会收到该事件。

你可以增加periodspace参数来杀死更多的事件。杀死太多事件意味着地图将开始从一个位置跳到下一个位置。杀死太少意味着所有事件都将到达谷歌地图,并且浏览器将阻塞谷歌地图新生成的事件,因此地图将从一个位置跳转到下一个位置。一些中间立场效果最好。

现在毕竟这些,谷歌地图不会像必应地图那样流畅。这是因为 Bing 地图使用惯性:当您猛烈移动地图时,地图将开始缓慢跟随鼠标,然后越来越快。这确实创造了一个非常光滑的平底锅。

我发现一个有趣的事实是,mousemove即使鼠标不动,Google Chrome 和 Opera/Chrommium 也会每秒生成一个事件!此代码也将终止这些事件(因为distance这些事件为零)。

http://jsfiddle.net/uNm57/ (检查 Firefox 中的 js 控制台;您应该会看到一些已停止的事件,然后是一个允许的事件)

<html>
  <head>
    <style type='text/css'>
      #map {
          position: absolute;
          width: 100%;
          height: 100%;
          margin: 20px;
      }
    </style>

    <script type='text/javascript'>
      var last = {time : new Date(),    // last time we let an event pass.
                  x    : -100,          // last x position af the event that passed.
                  y    : -100};         // last y position af the event that passed.
      var period = 100; // ms - don't let pass more than one event every 100ms.
      var space  = 2;   // px - let event pass if distance between the last and
                        //      current position is greater than 2 px.

      function init_map() {
          map_div = document.getElementById("map")
          // map
          var map_options = {
              center: new google.maps.LatLng(45.836454, 23.372497),
              zoom: 8
          };
          map = new google.maps.Map(document.getElementById("map"), map_options);

          // register event handler that will throttle the events.
          // "true" means we capture the event and so we get the event
          // before Google Maps gets it. So if we cancel the event,
          // Google Maps will never receive it.
          map_div.addEventListener("mousemove", throttle_events, true);
      };

      function throttle_events(event) {
          var now = new Date();
          var distance = Math.sqrt(Math.pow(event.clientX - last.x, 2) + Math.pow(event.clientY - last.y, 2));
          var time = now.getTime() - last.time.getTime();
          if (distance * time < space * period) {    //event arrived too soon or mouse moved too little or both
              console.log("event stopped");
              if (event.stopPropagation) { // W3C/addEventListener()
                  event.stopPropagation();
              } else { // Older IE.
                  event.cancelBubble = true;
              };
          } else {
              console.log("event allowed: " + now.getTime());
              last.time = now;
              last.x    = event.clientX;
              last.y    = event.clientY;
          };
      };
    </script>
</head>
<body onload = "init_map()">
    <div id="map"></div>
</body>
</html>
于 2014-02-26T03:00:16.210 回答
0

我只在移动浏览器中遇到了这个问题。桌面浏览器中的拖动/平移很流畅,但在移动设备上,用户拖动地图时会出现延迟。我花了大约 3 个小时在这上面,终于意识到缺少元标记是原因。

基本上,如果您不包含此元标记

<meta name="viewport" content="width=device-width, initial-scale=1">

问题来了。在 3 小时后意识到这一点或一开始就没有添加元标记,我感到非常愚蠢。但无论如何,如果其他人也犯了这个错误,我希望我能节省你的一些时间。

于 2019-06-20T07:49:29.857 回答
0

我遇到了同样的问题并且浪费了我的时间来解决,最后我想出了如何简单地解决这个问题。@Arturs Smirnovs 的回答非常有帮助。就我而言,css 中有一个过渡,由于那个 google map 运行不顺畅,我添加了 css 以禁用过渡到地图中,这样地图就可以正常工作了。希望这可以帮助任何人。

.google-map * {
    transition: none !important;
}
于 2021-06-28T15:36:05.817 回答