マウスがマーカーの上にあるときに自分で作成したツールチップを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メソッドは失敗します。何か案が?
これはトリッキーです。 APIのv2では、次のことができます。
map.fromLatLngToContainerPixel(marker.getLatLng(), zoomLevel);
V3では、メソッドfromLatLngToContainerPixelがMapCanvasProjectionオブジェクトに移動されました。 MapCanvasProjectionオブジェクトを取得するには、OverlayViewオブジェクトでgetProjectionを呼び出す必要があります。 MarkerクラスはOverlayViewから拡張されたようですが、残念ながらgetProjectionメソッドがありません。理由はわかりません-バグを報告する価値があるかもしれません。
私が行った方法は、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
どういうわけか、他の答えはどれもうまくいかなかったか、実装したくありませんでした(例: 独自のカスタムマーカークラスを作成する )。
さらに検索したところ、 このソリューション が見つかりましたが、これはexactly必要なことを実行します。
_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());
を呼び出して、位置を心ゆくまで使用してください:-)
ここのメソッドを使用してマップをドラッグするか、ダミーのオーバーレイビューを作成してその投影を使用した後、投影を更新するのに問題がありました。ここで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())