17

Quiero poner un tooltip hecho con divs cuando el mouse está sobre un marcador, pero no sé cómo obtener la posición de la pantalla para poner el div en la posición correcta, aquí está mi código:marcador google maps v3 mouseover tooltip

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"); 
}); 

Obviamente, el método get falla. ¿Alguna idea?

Respuesta

15

Esto es complicado. En v2 de la API, que puede hacer:

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

en v3, el fromLatLngToContainerPixel método se ha movido al objeto MapCanvasProjection. Para obtener un objeto MapCanvasProjection, debe llamar a getProjection en un objeto OverlayView. Parece que la clase Marker se extiende desde OverlayView, pero desafortunadamente no tiene el método getProjection. No tengo idea de por qué, puede valer la pena presentar un error.

La forma en que he hecho es mediante la creación de mi propia clase de marcador personalizado, basado en OverlayView, por lo que todavía tiene el método getProjection:

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

Usted puede leer el tutorial de Google en custom overlays o copiar su example para que comiences

+0

Gracias, finalmente, Hice eso, pero algo que pude resolver en 2 líneas de código, fue extremadamente complejo y me llevó varias horas – Santiago

+2

Debería ser mucho más fácil, así que envié este error: http://code.google.com/p/gmaps-api-issues/issues/detail? id = 2342 Cuando (si) se arregla, 'var point = marker.getProjection(). FromLatLngToDivPixel (marker.getPosition());' debería funcionar. – dave1010

0

encontrado una solución en another post:

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

esto no proporciona el píxel de la pantalla en relación con la esquina superior izquierda. En cambio, le da al mundo la coordinación. – Hoque

1

que estaba teniendo problemas para conseguir la proyección de actualizar después de arrastrar el mapa con el método aquí o la creación de un OverlayView maniquí y el uso de su proyección. He encontrado una solución que funciona al 100% para mí aquí: 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

No estoy seguro de por qué, pero esta solución no funcionó para mí, las coordenadas todavía estaban apagadas. Encontré, sin embargo, esta solución: http: // a32.me/2012/03/position-custom-and-fancy-overlay-dialog-on-google-maps-v3/- ¡y funcionó perfectamente! – Oliver

9

Aquí es un enlace a un tutorial que acabo de crear sobre cómo crear un texto de ayuda para la API de Google Maps V3: http://medelbou.wordpress.com/2012/02/03/creating-a-tooltip-for-google-maps-javascript-api-v3/ Para verlo en acción, vaya aquí http://medelbou.com/demos/google-maps-tooltip/

+2

¡Bienvenido a Stack Overflow! Si bien esto podría responder teóricamente a la pregunta, [sería preferible] (http://meta.stackexchange.com/q/8259) incluir aquí las partes esenciales de la respuesta y proporcionar el enlace de referencia. – oers

+1

Esto fue fácil de agregar y funciona bien markerclustererplus. – johntrepreneur

3

De alguna manera, ninguno de la otra respuesta funcionó para mí o no quería implementarlos (por ejemplo, creating your own custom Marker class).

Después de un poco más de la búsqueda me encontré this solution, sin embargo, que hace exactamente lo que se necesita:

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; 
} 

A continuación, sólo llamar var position = latlngToPoint(map, marker.getPosition()); y utilizar la posición de :-) contenido de su corazón

+0

oops. habló pronto. funciona en algunos casos y no en otros. un poco desconcertado por la variabilidad. – elrobis

+0

@elrobis: ¿Estás diciendo que tienes un problema con el código en mi respuesta? ¿Recibes algún error en la consola Javascript de tu navegador? ¿Cuál es el comportamiento roto? – Oliver

+0

ahh hola hombre. No funcionó más tarde, pero ya cerré esta página. Hice algo estúpido como asignar el valor '.x' a ambas posiciones' x' e 'y'. Y dado que tenía un mapa de prueba centrado en un punto (por lo que 'x' e' y' eran casi iguales), parecía estar funcionando, pero los puntos a su alrededor se comportaban de forma alocada. Así que al principio parecía funcionar, el comentario que borré, luego verifiqué los otros puntos y pensé que hablé demasiado pronto. Luego, cuando me estaba volviendo loco, me di cuenta de que había reutilizado uno de los valores. :: head slap :: smh ..:/ – elrobis

Cuestiones relacionadas