当鼠标悬停在标记上时,我想用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方法失败了。有什么想法吗?
答案 0 :(得分:16)
这是一个棘手的问题。在API的v2中,您可以执行以下操作:
map.fromLatLngToContainerPixel(marker.getLatLng(), zoomLevel);
在第3版中,方法fromLatLngToContainerPixel已移至MapCanvasProjection对象。要获取MapCanvasProjection对象,需要在OverlayView对象上调用getProjection。看起来Marker类是从OverlayView扩展的,但不幸的是它没有getProjection方法。我不知道为什么 - 可能值得提交错误。
我这样做的方法是创建我自己的基于OverlayView的自定义标记类,所以它仍然有getProjection方法:
var point = this.getProjection().fromLatLngToDivPixel(this.latlng_);
您可以在custom overlays上阅读Google的教程,或复制他们的example以开始使用。
答案 1 :(得分:9)
以下是我刚刚创建的有关如何为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/
答案 2 :(得分:4)
infowindow
旨在解决此问题。
http://code.google.com/apis/maps/documentation/javascript/overlays.html#InfoWindows
答案 3 :(得分: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());
并使用您心中的位置: - )
答案 4 :(得分:1)
在使用此处的方法拖动地图或创建虚拟覆盖视图并使用其投影后,我无法更新投影。我在这里找到了一个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;
};
答案 5 :(得分:0)
在another post中找到了解决方案:
var point = gmap.getProjection().fromLatLngToPoint(marker.getPosition())
答案 6 :(得分:0)
如果您使用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)
})