Как убрать элементы навигации с панорам (маркеры и стрелки)

Тестирую функционал API панорам. Возникло желание выводить на весь экран чистую панораму без маркеров с адресами домов и стрелок.

Искал решения, нашел одно в архиве обращений: https://yandex.ru/blog/mapsapi/kak-spryatat-u-panoramy-strelki-perekhodov#59784b9f670a7100272f7fdd.

Однако пока это не решает задачу. Пользуясь интерактивным курсором, можно переходить на другие ближайшие панорамы и при переходе все установки переопределения методов сбрасываются, маркеры и стрелки снова видны.

Пробовал решить следующим способом: Есть функция get_ypano, которая получает на вход координаты широты/долготы и функция put_pano_in_player, которая берет на входе панораму, очищает div с объектом player, и вкладывает в него объект новый player. При щелчке интерактивным курсором по новой локации определяется новая панорама и функция put_pano_in_player вызывает себя изнутри в сигнале panoramachange, но уже с новой панорамой. Однако это не помогло, в консоли ошибки и маркеры со стрелками видны.

function get_ypano(x, y){
    ymaps.panorama.locate([y, x]).done(
        function(pano_list){
            if (pano_list.length >0){
                var panorama = pano_list[0];
                console.log(panorama)
                panorama.getMarkers = function () { return []; };
                panorama.getConnectionArrows = function () { return []; };
                panorama.getGraph = function () { return null; }
                panorama.getConnectionMarkers = function () { return []; };
                put_pano_in_player(panorama)
            }else{
                console.log('no pano here')
            }
        }
    )
}

function put_pano_in_player(panorama){
    document.getElementById('player1').innerHTML = "";
    player = new ymaps.panorama.Player(
        'player1',
        panorama,
        {
            direction: [0, 0],
            span:[80, 80],
            controls: []
        }
    );
    player.events.add('directionchange', function () {
        get_hs(player)
    });
    player.events.add('spanchange', function () {
        get_hs(player)
     });
    player.events.add('panoramachange', function () {
        panorama = player.getPanorama()
        put_pano_in_player(panorama)
    });
    $('[class*=panorama-control]').css({"display":"none"})
}

Может есть какой-то рабочий и более простой метод?


Ответы (2 шт):

Автор решения: YaSupport

Уже созданные панорамы от Яндекса невозможно изменить и скрыть маркеры и адреса, для них также нельзя задать собственный стиль, который может перекрывать адрес. Поэтому лучшим решением для вашей идеи будет создание собственной панорамы, на которой вы скроете ненужные элементы.

2024-11-21 16:58:44, Pavel Pereverzev <>:

Тестирую функционал API панорам. Возникло желание выводить на весь экран чистую панораму без маркеров с адресами домов и стрелок.

Искал решения, нашел одно в архиве обращений: https://yandex.ru/blog/mapsapi/kak-spryatat-u-panoramy-strelki-perekhodov#59784b9f670a7100272f7fdd.

Однако пока это не решает задачу. Пользуясь интерактивным курсором, можно переходить на другие ближайшие панорамы и при переходе все установки переопределения методов сбрасываются, маркеры и стрелки снова видны.

Пробовал решить следующим способом: Есть функция get_ypano, которая получает на вход координаты широты/долготы и функция put_pano_in_player, которая берет на входе панораму, очищает div с объектом player, и вкладывает в него объект новый player. При щелчке интерактивным курсором по новой локации определяется новая панорама и функция put_pano_in_player вызывает себя изнутри в сигнале panoramachange, но уже с новой панорамой. Однако это не помогло, в консоли ошибки и маркеры со стрелками видны.

function get_ypano(x, y){
    ymaps.panorama.locate([y, x]).done(
        function(pano_list){
            if (pano_list.length &gt;0){
                var panorama = pano_list[0];
                console.log(panorama)
                panorama.getMarkers = function () { return []; };
                panorama.getConnectionArrows = function () { return []; };
                panorama.getGraph = function () { return null; }
                panorama.getConnectionMarkers = function () { return []; };
                put_pano_in_player(panorama)
            }else{
                console.log(&#39;no pano here&#39;)
            }
        }
    )
}

function put_pano_in_player(panorama){
    document.getElementById(&#39;player1&#39;).innerHTML = &quot;&quot;;
    player = new ymaps.panorama.Player(
        &#39;player1&#39;,
        panorama,
        {
            direction: [0, 0],
            span:[80, 80],
            controls: []
        }
    );
    player.events.add(&#39;directionchange&#39;, function () {
        get_hs(player)
    });
    player.events.add(&#39;spanchange&#39;, function () {
        get_hs(player)
     });
    player.events.add(&#39;panoramachange&#39;, function () {
        panorama = player.getPanorama()
        put_pano_in_player(panorama)
    });
    $(&#39;[class*=panorama-control]&#39;).css({&quot;display&quot;:&quot;none&quot;})
}

Может есть какой-то рабочий и более простой метод?

→ Ссылка
Автор решения: Виктор Карев

Вместо блока с player.events.add ..., где вы навешиваете обработчики на player, используйте следующее:

                            const enginePrototype = Object.getPrototypeOf(player._engine);
                            enginePrototype._onThoroughfareLoad = function (e) {
                                e._markers = [];
                                e._connectionArrows = [];
                                this.setPanorama(e);
                            };
                            enginePrototype._onJumpLoad = function (e) {
                                e._markers = [];
                                e._connectionArrows = [];
                                this.setPanorama(e);
                            };

→ Ссылка