17

我想要把鼠標放在標記上時使用div自帶的工具提示,但我不知道如何獲取屏幕位置以將div放在正確的位置,這裏是我的代碼:谷歌地圖v3標記鼠標懸停工具提示

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方法失敗。任何想法?

回答

15

這是一個棘手的問題。在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_); 

你可以閱讀谷歌的教程custom overlays或複製其example讓你開始。

+0

感謝最後,我這樣做了,但是我可以在兩行代碼中解決的問題非常複雜,並且花了我很多時間 – Santiago 2010-05-03 21:51:05

+2

它應該更容易,所以我提交了這個bug:http://code.google.com/p/gmaps-api-issues/issues/detail?id = 2342 當(如果)它是固定的,'var point = marker.getProjection()。fromLatLngToDivPixel(marker.getPosition());' 應該工作。 – dave1010 2010-05-04 07:22:38

0

實測值的溶液中another post

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

這不會使屏幕像素相對於左上角。相反,它給了世界的協調。 – Hoque 2011-04-28 02:32:41

1

我是有麻煩的投影這裏使用該方法拖動地圖或創建一個虛擬OverlayView的和使用它的投影后更新。我發現,我在這裏工作的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; 
}; 
+0

不完全確定爲什麼,但此解決方案對我無效,座標依然關閉。然而,我發現這個解決方案:http:// a32。me/2012/03/position-custom-and-fancy-overlay-dialog-on-google-maps-v3/- 並且完美運作! – Oliver 2013-04-24 21:17:34

9

這裏是鏈接到我只是在如何創建谷歌地圖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/

+2

歡迎來到Stack Overflow!雖然這可能在理論上回答這個問題,[這將是更可取的](http://meta.stackexchange.com/q/8259)在這裏包括答案的重要部分,並提供供參考的鏈接。 – oers 2012-02-03 07:13:37

+1

這很容易添加和運作良好markerclustererplus。 – johntrepreneur 2013-01-22 21:26:47

3

不知何故,沒有其他答案爲我工作,或者我不想實施它們(例如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());和使用位置,你的心臟的內容:-)

+0

oops。很快就說了。它在某些情況下有效,而不是在其他情況下。有點令人困惑的變化。 – elrobis 2014-10-16 17:00:46

+0

@elrobis:你是說你在我的回答中遇到問題嗎?你在瀏覽器的JavaScript控制檯中是否有任何錯誤?什麼是破壞的行爲? – Oliver 2014-10-17 12:15:30

+0

啊嘿嘿。之後沒有工作,但我已經關閉了這個頁面。我做了一些愚蠢的事情,比如將'.x'值分配給'x'和'y'位置。而且因爲我有一個以一個點爲中心的測試圖(所以'x'和'y'幾乎相同),它似乎在工作,但它周圍的點表現得很古怪。所以起初它似乎工作 - 我刪除了評論 - 然後我檢查了其他點,並認爲我說了太早。後來當我發瘋的時候,我意識到我會重用其中的一個價值觀。 ::頭巴掌:: smh ..:/ – elrobis 2014-10-17 14:14:24