подсказка по наведению курсора мыши на маркер google maps v3
Я хочу поместить подсказку, сделанную мной с помощью divs, когда мышь находится над маркером, но я не знаю, как получить положение экрана, чтобы поместить 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 не работает. Есть Идеи?
6 ответов:
Это очень сложно. В версии 2 API вы можете сделать:
map.fromLatLngToContainerPixel(marker.getLatLng(), zoomLevel);
В v3 метод fromLatLngToContainerPixel был перемещен в объект MapCanvasProjection. Чтобы получить объект MapCanvasProjection, необходимо вызвать getProjection для объекта OverlayView. Похоже, что класс Marker расширен из OverlayView, но, к сожалению, у него нет метода getProjection. Я понятия не имею, почему - может быть, стоит зарегистрировать ошибку.
Я сделал это, создав свой собственный обычай. класс marker, основанный на OverlayView, поэтому он все еще имеет метод getProjection:
var point = this.getProjection().fromLatLngToDivPixel(this.latlng_);
Вы можете прочитать учебник Google попользовательским наложениям или скопировать их пример , чтобы начать работу.
Вот ссылка на учебник, который я только что создал о том, как создать подсказку для 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/
infowindow
предназначена для решения этой задачи. http://code.google.com/apis/maps/documentation/javascript/overlays.html#InfoWindows
Так или иначе, ни один из других ответов не работал для меня, или я не хотел их реализовывать (например, создание собственного пользовательского класса маркеров).
После еще нескольких поисков я нашел это решение , хотя, что делает именно то, что нужно:
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());
и используйте позицию в свое удовольствие : -)
У меня возникли проблемы с обновлением проекции после перетаскивания карты с помощью метода здесь или создания фиктивного 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; };
Нашел решение в другом посте:
var point = gmap.getProjection().fromLatLngToPoint(marker.getPosition())