如何在Google Maps API V3中调用fromLatLngToDivPixel?

时间:2009-10-08 15:50:59

标签: javascript google-maps google-maps-api-3 projection

我知道该方法存在且已记录,但我不知道如何获取MapCanvasProjection对象。

5 个答案:

答案 0 :(得分:30)

查看http://qfox.nl/notes/116

var overlay = new google.maps.OverlayView();
overlay.draw = function() {};
overlay.setMap(map);
var point = overlay.getProjection().fromLatLngToDivPixel(latLng); 
确实很难看。在v2中更容易 - 谷歌api v3的另一个缺陷!

答案 1 :(得分:24)

我认为最简单的方法是忽略谷歌通过删除和隐藏有用的功能而不是添加新功能来让我们的生活更加艰难的愿望,并且只是编写自己的方法来做同样的事情。

这是某个人在其他地方发布的功能版本(我现在找不到),这对我有用:

fromLatLngToPixel: function (position) {
  var scale = Math.pow(2, Map.getZoom());
  var proj = Map.getProjection();
  var bounds = Map.getBounds();

  var nw = proj.fromLatLngToPoint(
    new google.maps.LatLng(
      bounds.getNorthEast().lat(),
      bounds.getSouthWest().lng()
    ));
  var point = proj.fromLatLngToPoint(position);

  return new google.maps.Point(
    Math.floor((point.x - nw.x) * scale),
    Math.floor((point.y - nw.y) * scale));
},

现在您可以随时随地拨打电话。我特别需要它用于自定义上下文菜单,它完美地完成了它。

编辑:我还写了一个反向函数, fromPixelToLatLng ,完全相反。它只是基于第一个,应用了一些数学:

fromPixelToLatLng: function (pixel) {
  var scale = Math.pow(2, Map.getZoom());
  var proj = Map.getProjection();
  var bounds = Map.getBounds();

  var nw = proj.fromLatLngToPoint(
    new google.maps.LatLng(
      bounds.getNorthEast().lat(),
      bounds.getSouthWest().lng()
    ));
  var point = new google.maps.Point();

  point.x = pixel.x / scale + nw.x;
  point.y = pixel.y / scale + nw.y;

  return proj.fromPointToLatLng(point);
}

答案 2 :(得分:21)

我对这里的答案并不满意。所以我做了一些实验,发现了最简单的"工作解决方案,接近拉尔夫的答案,但希望更容易理解。 (我希望Google能够更方便地使用此功能!)

首先在某处声明OverlayView的子类:

function CanvasProjectionOverlay() {}
CanvasProjectionOverlay.prototype = new google.maps.OverlayView();
CanvasProjectionOverlay.prototype.constructor = CanvasProjectionOverlay;
CanvasProjectionOverlay.prototype.onAdd = function(){};
CanvasProjectionOverlay.prototype.draw = function(){};
CanvasProjectionOverlay.prototype.onRemove = function(){};

然后在你的代码中的其他地方,你实例化地图,你也实例化这个OverlayView并设置它的地图,如下所示:

var map = new google.maps.Map(document.getElementById('google-map'), mapOptions);

// Add canvas projection overlay so we can use the LatLng to pixel converter
var canvasProjectionOverlay = new CanvasProjectionOverlay();
canvasProjectionOverlay.setMap(map);

然后,只要您需要使用fromLatLngToContainerPixel,就可以执行此操作:

canvasProjectionOverlay.getProjection().fromLatLngToContainerPixel(myLatLng);

请注意,因为MapCanvasProjection对象只有在调用draw()时才可用,这是地图的idle之前的某个时间,我建议创建一个布尔值" mapInitialized&#34 ; flag,在第一个地图idle回调中将其设置为true。然后在那之后做你需要做的事。

答案 3 :(得分:13)

var map;
// Create your map
MyOverlay.prototype = new google.maps.OverlayView();
MyOverlay.prototype.onAdd = function() { }
MyOverlay.prototype.onRemove = function() { }
MyOverlay.prototype.draw = function() { }
function MyOverlay(map) { this.setMap(map); }
var overlay = new MyOverlay(map);
var projection = overlay.getProjection();

答案 4 :(得分:9)

要获取MapCanvasProjection,您可以从OverlayView派生一个类,并调用返回MapCanvasProjection类型的getProjection()方法

必须实现

onAdd(),draw()和onRemove()才能从OverlayView派生。

function MyOverlay(options) {
    this.setValues(options);

    var div = this.div_= document.createElement('div');

    div.className = "overlay";
};

// MyOverlay is derived from google.maps.OverlayView
MyOverlay.prototype = new google.maps.OverlayView;

MyOverlay.prototype.onAdd = function() {

    var pane = this.getPanes().overlayLayer;
    pane.appendChild(this.div_);

}

MyOverlay.prototype.onRemove = function() {
    this.div_.parentNode.removeChild(this.div_);
}

MyOverlay.prototype.draw = function() {
    var projection = this.getProjection();
    var position = projection.fromLatLngToDivPixel(this.getMap().getCenter());

    var div = this.div_;
    div.style.left = position.x + 'px';
    div.style.top = position.y + 'px';
    div.style.display = 'block';
};

然后当你创建你的地图时

var OverLayMap = new MyOverlay( { map: map } );

对于V2 你应该能够从GMap2实例中调用fromLatLngToDivPixel

var centerPoint = map.fromLatLngToDivPixel(map.getCenter());