Google Maps v3 маркер при наведении курсора - PullRequest
18 голосов
/ 19 апреля 2010

Я хочу поместить всплывающую подсказку, созданную мной, с помощью 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 не работает. Любая идея?

Ответы [ 6 ]

16 голосов
/ 28 апреля 2010

Это сложный вопрос. В v2 API вы можете сделать:

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

В версии 3 метод fromLatLngToContainerPixel был перемещен в объект MapCanvasProjection. Чтобы получить объект MapCanvasProjection, вам нужно вызвать getProjection для объекта OverlayView. Похоже, класс Marker расширен от OverlayView, но, к сожалению, у него нет метода getProjection. Я понятия не имею, почему - возможно, стоит подать ошибку.

Я сделал это, создав собственный класс маркеров, основанный на OverlayView, поэтому у него все еще есть метод getProjection:

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

Вы можете прочитать руководство Google по пользовательским оверлеям или скопировать пример , чтобы начать работу.

9 голосов
/ 03 февраля 2012

Вот ссылка на только что созданное руководство по созданию всплывающей подсказки для API Карт Google V3: http://medelbou.wordpress.com/2012/02/03/creating-a-tooltip-for-google-maps-javascript-api-v3/ Чтобы увидеть это в действии, перейдите сюда http://medelbou.com/demos/google-maps-tooltip/

4 голосов
/ 04 ноября 2011

infowindow предназначен для решения этой проблемы. http://code.google.com/apis/maps/documentation/javascript/overlays.html#InfoWindows

3 голосов
/ 25 апреля 2013

Каким-то образом ни один из других ответов не сработал для меня, или я не хотел их реализовывать (например, создание собственного пользовательского класса маркеров ).

После еще нескольких поисков я нашел это решение , однако, оно точно , что нужно:

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()); и воспользуйтесь положением, которое душе угодно: -)

1 голос
/ 09 сентября 2011

У меня возникли проблемы с обновлением проекции после перетаскивания карты с использованием этого метода или создания фиктивного наложения и использования его проекции. Я нашел решение, которое работает на 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 голосов
/ 06 октября 2010

Нашел решение в другой пост :

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