【问题标题】:google maps v3 marker mouseover tooltip谷歌地图 v3 标记鼠标悬停工具提示
【发布时间】:2011-02-09 19:33:36
【问题描述】:

当鼠标悬停在标记上时,我想放置一个用 div 自己制作的工具提示,但我不知道如何获取屏幕位置以将 div 放在正确的位置,这是我的代码:

google.maps.event.addListener(marker, "mouseover", function() {
            divover.css("left", marker.get("left"));
            divover.css("top", marker.get("top"));
            divover.css("display", "block");
});

google.maps.event.addListener(marker, "mouseout", function() {
            divover.css("display", "none");
});

显然 get 方法失败了。有什么想法吗?

【问题讨论】:

    标签: google-maps tooltip mouseover google-maps-api-3 google-maps-markers


    【解决方案1】:

    如果您使用MarkerWithLabel 来渲染标记,您可以轻松地使用它的label 属性在鼠标悬停时显示额外的数据

      google.maps.event.addListener(marker, 'mouseover', function (ev) {
        this.labelContentOld = this.labelContent
        this.set("labelContent", this.id + ' ' + this.labelContent)
      })
      google.maps.event.addListener(marker, 'mouseout', function (ev) {
        this.set("labelContent", this.labelContentOld)
      })
    

    【讨论】:

      【解决方案2】:

      不知何故,其他答案都不适合我,或者我不想实现它们(例如creating your own custom Marker class)。

      经过更多搜索后,我找到了this solution,不过,这正是所需要的:

      function latlngToPoint(map, latLng) {
          var topRight = map.getProjection().fromLatLngToPoint(map.getBounds().getNorthEast());
          var bottomLeft = map.getProjection().fromLatLngToPoint(map.getBounds().getSouthWest());
          var scale = Math.pow(2, map.getZoom());
          var worldPoint = map.getProjection().fromLatLngToPoint(latLng);
          var point = new google.maps.Point((worldPoint.x - bottomLeft.x) * scale, (worldPoint.y - topRight.y) * scale);
          return point;
      }
      

      然后只需拨打var position = latlngToPoint(map, marker.getPosition()); 并根据您的内心使用该位置:-)

      【讨论】:

      • 哎呀。很快就谈到了。它在某些情况下有效,而在其他情况下无效。对可变性有点困惑。
      • @elrobis:你是说我的回答中的代码有问题吗?您在浏览器的 Javascript 控制台中是否遇到任何错误?什么是坏行为?
      • 啊,嘿,伙计。没有让它以后工作,但我已经关闭了这个页面。我做了一些愚蠢的事情,比如将.x 值分配给xy 位置。因为我有一个以一个点为中心的测试地图(所以xy 几乎相同),它似乎工作正常,但它周围的点表现得很古怪。所以起初它似乎有效——我删除了评论——然后我检查了其他点,并认为我说得太早了。后来当我快要发疯的时候,我意识到我重用了其中一个值。 ::打头:: smh.. :/
      • 谢谢,比选择的答案好多了
      【解决方案3】:

      这是我刚刚创建的关于如何为 Google Maps API V3 创建工具提示的教程的链接:http://medelbou.wordpress.com/2012/02/03/creating-a-tooltip-for-google-maps-javascript-api-v3/ 要查看它的实际效果,请转到此处http://medelbou.com/demos/google-maps-tooltip/

      【讨论】:

      • 欢迎来到 Stack Overflow!虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
      • 特别是现在的演示 404s。 :)
      【解决方案4】:

      infowindow 就是为了解决这个问题而设计的。 http://code.google.com/apis/maps/documentation/javascript/overlays.html#InfoWindows

      【讨论】:

      • 这是最实用的解决方案。我的意思是,如果你不想编写自己的弹出信息。
      【解决方案5】:

      在使用此处的方法拖动地图或创建虚拟叠加视图并使用其投影后,我无法更新投影。我在这里找到了一个 100% 适合我的解决方案:http://qfox.nl/notes/116

      /**
      * @param {google.maps.Map} map
      * @param {google.maps.LatLng} latlng
      * @param {int} z
      * @return {google.maps.Point}
      */
      var latlngToPoint = function(map, latlng, z){
          var normalizedPoint = map.getProjection().fromLatLngToPoint(latlng); // returns x,y normalized to 0~255
          var scale = Math.pow(2, z);
          var pixelCoordinate = new google.maps.Point(normalizedPoint.x * scale, normalizedPoint.y * scale);
          return pixelCoordinate; 
      };
      /**
      * @param {google.maps.Map} map
      * @param {google.maps.Point} point
      * @param {int} z
      * @return {google.maps.LatLng}
      */
      var pointToLatlng = function(map, point, z){
          var scale = Math.pow(2, z);
          var normalizedPoint = new google.maps.Point(point.x / scale, point.y / scale);
          var latlng = map.getProjection().fromPointToLatLng(normalizedPoint);
          return latlng; 
      };
      

      【讨论】:

      • 不完全确定为什么,但这个解决方案对我不起作用,坐标仍然关闭。但是,我找到了这个解决方案:a32.me/2012/03/… - 效果很好!
      【解决方案6】:

      another post找到解决方案:

      var point = gmap.getProjection().fromLatLngToPoint(marker.getPosition())
      

      【讨论】:

      • 这不会给出相对于左上角的屏幕像素。相反,它给出了世界坐标。
      【解决方案7】:

      这是一个棘手的问题。在 API 的 v2 中,您可以:

      map.fromLatLngToContainerPixel(marker.getLatLng(), zoomLevel);
      

      在 v3 中,方法 fromLatLngToContainerPixel 已移至 MapCanvasProjection 对象。要获取 MapCanvasProjection 对象,您需要在 OverlayView 对象上调用 getProjection。看起来 Marker 类是从 OverlayView 扩展而来的,但不幸的是它没有 getProjection 方法。我不知道为什么 - 可能值得提交一个错误。

      我的做法是创建自己的自定义标记类,基于 OverlayView,所以它仍然有 getProjection 方法:

      var point = this.getProjection().fromLatLngToDivPixel(this.latlng_);
      

      您可以阅读 Google 在 custom overlays 上的教程或复制他们的 example 以帮助您入门。

      【讨论】:

      • 谢谢,我终于做到了,但我可以用两行代码解决的问题非常复杂,我花了好几个小时
      • 应该容易很多,所以我提交了这个错误:code.google.com/p/gmaps-api-issues/issues/detail?id=2342 当(如果)它被修复时,var point = marker.getProjection().fromLatLngToDivPixel(marker.getPosition()); 应该可以工作。
      猜你喜欢
      • 2012-01-02
      • 1970-01-01
      • 2012-02-13
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多