есть балун с оформлением
setBalloonLayout: function () { var balloonLayout = ymaps.templateLayoutFactory.createClass( '<div class="m-balloon">' + '<a class="close" href="#"></a><div class="m-balloon-inner">' + '<div class="map-description__name">$[properties.name]</div>' + '<div class="map-description__address">$[properties.address]</div>' + '</div></div>', /*Переопределяем build балуна, для расчета смещения*/ { build: function () { var balloon = this.getData().geoObject.balloon; var projection = wifimap.map.options.get('projection'); var position = this.getData().geoObject.geometry.getCoordinates(); var position_global_px = wifimap.map.converter.pageToGlobal(projection.fromGlobalPixels(position, wifimap.map.getZoom())); var position_local_px = wifimap.map.converter.globalToPage(projection.toGlobalPixels(position,wifimap.map.getZoom())); wifimap.map.setGlobalPixelCenter([position_global_px[0] + position_local_px[0], position_global_px[1] + position_local_px[1] + 180]); this.constructor.superclass.build.call(this); /*Вешаем событие на кнопку закрытия*/ jQuery('.close').on('click', function (e) { e.preventDefault(); balloon.close(); }) } }) ymaps.layout.storage.add('wifi#balloon', balloonLayout); },
при открытии меняем координаты центра карты что бы балун был на экране
var projection = wifimap.map.options.get('projection'); var position = this.getData().geoObject.geometry.getCoordinates(); var position_global_px = wifimap.map.converter.pageToGlobal(projection.fromGlobalPixels(position, wifimap.map.getZoom())); var position_local_px = wifimap.map.converter.globalToPage(projection.toGlobalPixels(position,wifimap.map.getZoom())); wifimap.map.setGlobalPixelCenter([position_global_px[0] + position_local_px[0], position_global_px[1] + position_local_px[1] + 180]);
иногогда всё работает, иногда на вызове wifimap.map.setGlobalPixelCenter([position_global_px[0] + position_local_px[0], position_global_px[1] + position_local_px[1] + 180]); карты возвращают ошибку TypeError: this._xq is undefined
соотношение успехов к неудачам примерно 50/50 от чего это зависит понять не могу.