Google Maps v3 OverlayView.getProjection () - PullRequest
       3

Google Maps v3 OverlayView.getProjection ()

7 голосов
/ 14 сентября 2010

Не могу понять, почему объект, возвращаемый 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 ]

26 голосов
/ 12 июля 2011

На самом деле, причина, по которой это происходит, заключается в том, что проекционный объект создается после простоя карты после панорамирования / масштабирования. Поэтому лучшим решением будет прослушивание события idle объекта 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();
})
2 голосов
/ 14 сентября 2010

Я вроде понял, что происходит. Несмотря на то, что до сих пор неясно, почему это происходит, я знаю, что мне пришлось создать экземпляр переменной «overlay» сразу после создания моей карты Google (HAR.map). Поэтому я практически переместил этот фрагмент кода в свой класс HAR и теперь использую:

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

Так что теперь, каждый раз, когда я создаю карту через мой класс "HAR", у меня также есть параллельный объект OverlayView внутри моего класса.

Ошибка могла быть связана с потерей области видимости моего объекта класса, но я думаю, что это было больше из-за того, что событие карты «projection_changed» не было запущено. Я получил подсказку из документации API карты для класса карты в методе getProjection ():

" Возвращает текущую проекцию. Если карта еще не инициализирована (т. Е. MapType все еще равен нулю), то результат равен нулю. Прослушайте projection_changed и проверьте его значение, чтобы убедиться, что оно не равно нулю. «

Если вы получаете подобную проблему, убедитесь, что вы присваиваете свой overlayView.setMAP (YOUR_MAP_OBJECT) близко после создания экземпляра объекта карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...