Отключить поведение маркеров POI в API Google Maps JS

Начиная с Google Maps API версии 3.6, теперь карты включают "интересные точки", которые представляют собой серые маркеры, встроенные в карту. Когда пользователь нажимает на этот значок, появляется информация InfoWindow с информацией об этом бизнесе (или в парке, больнице и т.д.).

Их можно отключить, установив стиль. (См. "Пример массива стилей" )

https://code.google.com/apis/maps/documentation/javascript/styling.html

Как только они отключены, исчезают значки, имена и затененные области (для парков и больниц).

До Google Maps API версии 3.6 не было значков; только имена и области.

Вопрос: есть ли способ удалить поведение этих точек интереса по кнопке "click icon to open info"? Я все еще хочу сохранить значки, имена и регионы; только хотите удалить поведение кликов.

Альтернативный вопрос: есть ли способ загрузить/сохранить JavaScript v3.5 API Карт Google для хранения на моем сервере? В настоящее время v3.5 отлично работает для того, что мне нужно. В феврале Google больше не будет предоставлять v3.5 кода и вместо этого будет предоставлять только v3.6, v3.7, v3.8.

Устранение незначительных версий API Карт Google v3 и использование "замороженной" версии API:

https://code.google.com/apis/maps/documentation/javascript/basics.html#Versioning

Вещи, которые я пробовал и рассмотрел: Добавление прослушивателя событий при щелчке по карте не работает, потому что вместо встроенных маркеров щелкнут. Добавление "clickable: false" в качестве свойства - это выстрел в темноте, без результата. Установка "visiblility: off" удаляет все, оставляя карту с меньшим количеством контента. Установка "видимость: упрощенная" удаляет имя местоположения, хотя поведение onclick все еще присутствует. Нанесение невидимого DIV, накладывающегося на карту, может работать, хотя это позволит удалить возможность панорамирования/масштабирования/перетаскивания карты без увеличения сложности.

Настройка стиля так, чтобы featureType: poi, elementType: labels, visibility: off приведет к отображению областей розовый/серый/зеленый для больниц/кладбищ/парков без маркера или имени. Он возвращает больше цвета на карту.

Ответы

Ответ 2

Я не уверен, что это все еще имеет отношение к вам, но Google действительно разрешил проблему в апреле 2016 года. Все, что вам нужно сделать, это от clickableIcons до false в MapOptions

Ответ 3

Несколько вещей, о которых нужно знать:

1) Если ваша карта имеет высокий трафик, вы можете оказаться в нарушении TOS Google Maps. Вы должны использовать официальную версию. Если это ваш собственный блог или что-то еще небольшое движение, никто не заметит и не заботится.

2) Это только догадка с моей стороны, но я заметил эту POI и раздражен ими. Я уверен, что они заплатили за "встроенные объявления", так сказать. Некоторые бензоколонки и сети для закусок имеют их, поэтому вы скоро увидите, что карты Google рассылаются спамом с этими маркерами POI. Если они позволяют отключить их в API, то это идет вразрез с деловыми интересами тех, кто заплатил за значок POI... поэтому я очень сомневаюсь, что вы сможете их удалить.

Если вы найдете способ, пожалуйста, пожалуйста, ПОЛУЧИТЕ решение! Спасибо.

Ответ 4

Я не уверен, что это не является нарушением Google Maps TOS, он немного взломан и не работает на IE < 9, но вы можете прослушивать событие dom, для обнаружения создания окна, используя Mutation Observer

Вот демон, демонстрирующий: http://plnkr.co/edit/pGep9OZFligLhRtHlhgk Вы можете проверить консоль, событие запускается (фактически дважды), когда вы нажимаете на POI, и окно скрыто

Ответ 5

Переходя по этому URL-адресу (fooobar.com/info/371434/...), мне как-то удалось скрыть информационные окна POI и вызвать прослушиватель событий клика по карте, когда пользователь нажимает POI. Но я не уверен, нарушает ли это TOS или нет, поэтому используйте на свой страх и риск.

        //keep a reference to the original setPosition-function
        var fx = google.maps.InfoWindow.prototype.setPosition;

        //override the built-in setPosition-method
        google.maps.InfoWindow.prototype.setPosition = function () {

            //this property isn't documented, but as it seems
            //it only defined for InfoWindows opened on POI's
            if (this.logAsInternal) {
                if (this.getPosition()) {
                    console.log(this.getPosition());
                    google.maps.event.trigger(map, 'click', {latLng: this.getPosition()});
                }
                else{
                    google.maps.event.addListenerOnce(this, 'map_changed',function () {
                        console.log(this.getPosition());
                        google.maps.event.trigger(map, 'click', {latLng: this.getPosition()});

                        // var map = this.getMap();
                        // //the infoWindow will be opened, usually after a click on a POI
                        // if (map) {
                            //trigger the click

                            var removeInfoWindow = null;

                            removeInfoWindow = setInterval(function(){
                                if ($('.gm-style-iw').parent().length) {
                                    $('.gm-style-iw').parent().hide();
                                    clearInterval(removeInfoWindow);
                                };
                            },1);
                        // }
                    });
                };
            }

            //call the original setPosition-method
            fx.apply(this, arguments);
        };

        google.maps.event.addListener(map,'click',function(e){
            alert('clicked @'+e.latLng.toString())
            console.log('ok');
        });