Google Maps v3 OverlayView.getProjection()

时间:2010-09-14 16:12:57

标签: 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', 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'

2 个答案:

答案 0 :(得分:26)

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

// 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();
})

答案 1 :(得分:2)

我想知道发生了什么。即使仍然不清楚为什么会发生这种情况,我知道在实例化我的谷歌地图(HAR.map)之后我必须立即实例化变量“overlay”。所以我几乎将代码片段移动到我的HAR类中,现在我使用:

HAR.canvassOverlay.getProjection().fromLatLngToContainerPixel( recBounds.getCenter() );

所以现在,每次我通过我的班级“HAR”创建地图时,我的班级中也有一个并行的OverlayView对象。

错误可能与丢失我的类对象的范围有关,但我认为更多的是地图事件“projection_changed”没有被触发。我在map getProjection()方法的地图类的地图API文档中得到了一个提示:

Returns the current Projection. If the map is not yet initialized (i.e. the mapType is still null) then the result is null. Listen to projection_changed and check its value to ensure it is not null.

如果您遇到类似问题,请确保在实例化地图对象后紧密分配overlayView.setMAP(YOUR_MAP_OBJECT)。