Google maps Google Maps v3 OverlayView.getProjection()

Google maps Google Maps v3 OverlayView.getProjection(),google-maps,google-maps-api-3,Google Maps,Google Maps Api 3,我似乎无法理解getProjection()返回的对象为何未定义。这是我的密码: // Handles the completion of the rectangle var ne = recBounds.getNorthEast(); var sw = recBounds.getSouthWest(); $("#map_tools_selat").attr( 'value', sw.lat() ); $("#map_tools_nwlat").attr( 'value', n

我似乎无法理解getProjection()返回的对象为何未定义。这是我的密码:

 // Handles the completion of the rectangle
  var ne = recBounds.getNorthEast();
  var sw = recBounds.getSouthWest();
  $("#map_tools_selat").attr( 'value', sw.lat() );
  $("#map_tools_nwlat").attr( 'value', ne.lat() );
  $("#map_tools_selng").attr( 'value', ne.lng() );
  $("#map_tools_nwlng").attr( 'value', sw.lng() );

  // Set Zoom Level
  $("#map_tools_zoomlevel").attr( 'value', HAR.map.getZoom()+1 );
  document.getElementById("map_tools_centerLat").value = HAR.map.getCenter().lat();
  document.getElementById("map_tools_centerLong").value = HAR.map.getCenter().lng(); 

  // All this junk below is for getting pixel coordinates for a lat/lng  =/
  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(HAR.map);
  var projection = overlay.getProjection();
  // END - all the junk
  var p = projection.fromLatLngToContainerPixel(recBounds.getCenter());
  alert(p.x+", "+p.y);

我的错误是:无法调用未定义的方法“fromLatLngToContainerPixel”

我大致了解了发生了什么。尽管还不清楚为什么会发生这种情况,但我知道我必须在实例化我的google地图(HAR.map)之后立即实例化变量“overlay”。因此,我实际上将该代码片段移动到了我的HAR类中,现在我使用:

HAR.canvassOverlay.getProjection().fromLatLngToContainerPixel( recBounds.getCenter() );
所以现在,每次我通过类“HAR”创建贴图时,我的类中也有一个平行的OverlayView对象

错误可能是由于丢失了类对象的作用域,但我认为更多的是映射事件“projection_changed”没有被触发。我从map类的map API文档中得到了一个提示,在方法getProjection()下:

“”


如果您遇到类似问题,请确保在实例化地图对象后,将overlayView.setMAP(您的_MAP _对象)分配得很紧。

事实上,发生这种情况的原因是,在平移/缩放地图后,投影对象处于空闲状态后创建的。因此,更好的解决方案是监听google.maps.Map对象的idle事件,并获取投影的引用:

// Create your map and overlay
var 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;

// Wait for idle map
google.maps.event.addListener(map, 'idle', function() {
   // Get projection
   projection = overlay.getProjection();
})

顺便说一句:我粘贴了jquery部分以显示我的map对象(HAR.map)可以工作。我已经多次确认getCenter()和getZoom()函数实际上返回了正确的值。所以HAR.map对象是合法的。太棒了!我需要试试这个。我也有这个问题,因为我根本没有这个。setMap()。谢谢。