17

Tôi muốn đặt một chú giải công cụ làm cho bản thân mình với div khi con chuột trên một điểm đánh dấu, nhưng tôi không biết làm thế nào để có được vị trí màn hình để đưa div vào đúng vị trí, đây là mã của tôi:google maps v3 marker toolover

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

Rõ ràng phương thức tải không thành công. Bất kỳ ý tưởng?

Trả lời

15

Đây là một điều khó khăn. Trong v2 của API, bạn có thể làm:

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

trong v3, phương pháp fromLatLngToContainerPixel đã được chuyển đến các đối tượng MapCanvasProjection. Để có được một đối tượng MapCanvasProjection, bạn cần gọi getProjection trên một đối tượng OverlayView. Có vẻ như lớp Marker được mở rộng từ OverlayView, nhưng tiếc là nó không có phương thức getProjection. Tôi không biết tại sao - có thể đáng để nộp một lỗi.

Con đường tôi đã thực hiện nó là bằng cách tạo riêng lớp tùy chỉnh điểm đánh dấu của tôi, dựa trên OverlayView, vì vậy nó vẫn có phương pháp getProjection:

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

Bạn có thể đọc hướng dẫn của Google trên custom overlays hoặc sao chép example của họ để giúp bạn bắt đầu.

+0

Cảm ơn, cuối cùng Tôi đã làm điều đó, nhưng một cái gì đó mà tôi có thể giải quyết trên 2 dòng mã, là vô cùng phức tạp và nó đã cho tôi giờ máy chủ – Santiago

+2

Nó phải dễ dàng hơn rất nhiều, vì vậy tôi đã gửi lỗi này: http://code.google.com/p/gmaps-api-issues/issues/detail? id = 2342 Khi (nếu) cố định, 'var point = marker.getProjection(). FromLatLngToDivPixel (marker.getPosition());' sẽ hoạt động. – dave1010

0

Tìm thấy một giải pháp trong another post:

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

điều này không cho điểm ảnh màn hình so với góc trên bên trái. Thay vào đó nó mang lại cho thế giới phối hợp. – Hoque

1

tôi đã gặp khó khăn chiếu để cập nhật sau khi kéo bản đồ bằng cách sử dụng phương pháp này đây hoặc tạo ra một overlayview giả và sử dụng chiếu của nó. Tôi tìm thấy một giải pháp mà làm việc 100% đối với tôi ở đây: 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

Không chắc chắn lý do tại sao, nhưng giải pháp này đã không làm việc cho tôi, các tọa độ vẫn còn tắt. Tôi tìm thấy, tuy nhiên, giải pháp này: http: // a32.tôi/2012/03/vị trí-tùy chỉnh-và-ưa thích-overlay-dialog-on-google-maps-v3/- và điều đó làm việc hoàn hảo! – Oliver

9

Dưới đây là liên kết đến một hướng dẫn, tôi vừa tạo về cách tạo một tooltip cho Google Maps API V3: http://medelbou.wordpress.com/2012/02/03/creating-a-tooltip-for-google-maps-javascript-api-v3/ Để nhìn thấy nó trong hành động, hãy vào đây http://medelbou.com/demos/google-maps-tooltip/

+2

Chào mừng bạn đến với Stack Overflow! Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp liên kết để tham khảo. – oers

+1

Điều này rất dễ dàng để thêm và hoạt động tốt markerclustererplus. – johntrepreneur

3

Bằng cách nào đó, không ai trong số các câu trả lời khác đã làm việc cho tôi hoặc tôi không muốn thực hiện chúng (ví dụ: creating your own custom Marker class).

Sau khi tìm kiếm một số chi tiết tôi thấy this solution, tuy nhiên, điều đó không chính xác những gì cần thiết:

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

Sau đó, chỉ cần gọi var position = latlngToPoint(map, marker.getPosition()); và sử dụng vị trí để :-) nội dung của trái tim của bạn

+0

oops. đã nói chuyện sớm. nó hoạt động trong một số trường hợp và không hoạt động trong các trường hợp khác. kinda bối rối bởi sự thay đổi. – elrobis

+0

@elrobis: Bạn có nói rằng bạn đang gặp sự cố với mã trong câu trả lời của tôi không? Bạn có gặp bất kỳ lỗi nào trong bảng điều khiển Javascript của trình duyệt không? Hành vi bị hỏng là gì? – Oliver

+0

ahh này. không có nó làm việc sau này nhưng tôi đã đóng trang này. Tôi đã làm điều gì đó ngu ngốc như gán giá trị '.x' cho cả hai vị trí' x' và 'y'. Và kể từ khi tôi có một bản đồ thử nghiệm tập trung vào một điểm (vì vậy 'x' và' y' gần như giống nhau), nó dường như đang hoạt động, nhưng những điểm xung quanh nó cư xử lập dị. Vì vậy, lúc đầu nó dường như làm việc - bình luận tôi đã xóa - sau đó tôi đã kiểm tra các điểm khác và nghĩ rằng tôi đã nói quá sớm. Sau đó, khi tôi phát điên, tôi nhận ra mình đã sử dụng lại một trong những giá trị. :: đầu slap :: smh ..:/ – elrobis

Các vấn đề liên quan