Клуб API Карт

Как удалить геообъект (или "перезагрузить карту" до изначального состояния)?

Пост в архиве.
kolomoecnv
21 мая 2012, 11:55

Больше половины дня бьюсь над этой задачей. В общем по примерам набросал карту. По клику появляется балун с координатами текущей точки и вокруг него геообъект (полигон). При повторном клике балун пропадает, но удалить геообъект у меня не получается. myMap.geoObjects.remove(myGeoobject); - не работат, выдает ошибку скрипта "b is undefined". 

 

 // Как только будет загружен API и готов DOM, выполняем инициализацию
     ymaps.ready(init);

     function init () {
         // Создание экземпляра карты и его привязка к контейнеру с заданным id ("map")
         var myMap = new ymaps.Map('map', {
                 // При инициализации карты, обязательно нужно указать
                 // ее центр и коэффициент масштабирования
                 center: [46.466444, 30.7058], // Одесса
                 zoom: 12
             }, {
                 balloonMaxWidth: 160,
                 balloonMaxHeight: 80
             }),
                myOptions = {
                    // Цвет заливки
                    fillColor: '#E0D3BD',
                    // Цвет границ
                    strokeColor: '#78694E',
                    // Прозрачность (прозрачная заливка)
                    opacity: 0.7,
                    // Ширина линии
                    strokeWidth: 6,
                    draggable: true      // объект можно перемещать, зажав левую кнопку мыши
                };

         // Для добавления элемента управления на карту используется поле controls, ссылающееся на коллекцию элементов управления картой.
         // Добавление элемента в коллекцию производится с помощью метода add().

         // В метод add можно передать строковый идентификатор элемента управления и его параметры.
         myMap.controls
             // Кнопка изменения масштаба
             .add('zoomControl', { right: 7, top: 35 })
             // Список типов карты
             .add('typeSelector')
             // Кнопка изменения масштаба - компактный вариант
             // Расположим её справа
             /*.add('smallZoomControl', { right: 5, top: 75 })*/
             // Стандартный набор кнопок
             /*.add('mapTools')*/;

        // Выводит массив координат геообъекта в поле
        function printGeometry (coords) {

            function stringify (coords) {
                var res = '';
                if ($.isArray(coords)) {
                    res = '[ ';
                    // (coords.length - 1) - чтоб не дублировалась последняя точка
                    for (var i = 0, l = coords.length; i < l; i++) {
                        if ((stringify(coords[i]) != stringify(coords[0])) || (i == 0))
                        {
                            if (i > 0) {
                                res += ', ';
                            }
                            res += stringify(coords[i]
                        }
                    }
                    res += ' ]';
                } else if (typeof coords == 'number') {
                    res = coords.toPrecision(6);
                } else if (coords.toString) {
                    res = coords.toString(
                }

                return res;
            }
        }

         // Обработка события, возникающего при щелчке левой кнопкой мыши в любой точке карты.
         // При возникновении такого события откроем балун.
         myMap.events.add('click', function (e) {
             if (!myMap.balloon.isOpen()) {
                 var coords = e.get('coordPosition');
                 myMap.balloon.open(coords, {
                     contentHeader: '',
                     contentBody: '<p>Текущие координаты: ' + [
                             coords[0].toPrecision(6),
                             coords[1].toPrecision(6)
                         ].join(', ') + '</p>',
                     contentFooter: '<sup>Чтоб отменить - щелкните еще раз</sup>'
                 }
                 // Создаем новый геообъект (многоугольник)
                  myGeometry = {
                    type: 'Polygon',
                    coordinates: [
                        [
                            [(parseFloat(coords[0].toPrecision(6)) + 0.03), parseFloat(coords[1].toPrecision(6))],
                            [(parseFloat(coords[0].toPrecision(6)) - 0.01), (parseFloat(coords[1].toPrecision(6)) + 0.03)],
                            [(parseFloat(coords[0].toPrecision(6)) - 0.01), (parseFloat(coords[1].toPrecision(6)) - 0.03)]
                        ]
                    ]
                }
                 var myGeoobject = new ymaps.GeoObject({geometry: myGeometry}, myOptions);
                myGeoobject.events.add('geometrychange', function (event) {
                    printGeometry(myGeoobject.geometry.getCoordinates()
                }
                myMap.geoObjects.add(myGeoobject);
                printGeometry(myGeoobject.geometry.getCoordinates()
                myGeoobject.editor.startEditing(
             } else {

// не работает
                 myMap.geoObjects.remove(myGeoobject);
                 myMap.balloon.close(
             }
         }
     }

 

8 комментариев

пока туго в 2.0, но метод update() тут не поможет?

а чей это метод? в map.geoObjects и Map такого нет

используя ваш код у меня никакого многоугольника не появляется, только балун удаляется при втором клике :(

как оно должно работать, если вы создаете переменную myGeooobject внутри if, а удаляете ее из коллекции внутри else?

строчку "document.getElementById('cf59').value = (stringify(coords)"

забыл вырезать.

mouseseen, работает сейчас так (скопировал отсюда код и вставил на чистый сайт): при клике появляется балун и вокруг точки треугольник (полигон), при повторном клике ничего не происходит (ошибка "b is undefined"). Ну балун бы исчезал, если бы в коде его поднять перед нерабочей строчкой myMap.geoObjects.remove(myGeoobject);

бабушка-бэтмэн, переносил и в иф (просто тестил) - тоже без изменений, но логически оно неверно: при загрузке ничего нет, при клике срабатывает иф и создается балун, с полигоном. При повторном клике срабатывает елс, который закрывает балун и должен бы закрывать полигон. Только не пойму почему это не происходит. Если вы имеете в виду, что созданный в "ифе" полигон невидим в "елсе", то объясните пожалуйста почему так, да и вообще: как решить мою задачу?

 

При повторном клике срабатывает елс, который закрывает балун и должен бы закрывать полигон.

откуда в else возьмется указатель на myGeoobject, если эта переменная создается в if по противоположному условию?

 

Создайте ее в родительком scope и в обработчике перед удалением проверьте что она существует

 

} else {

    myGeoobject && myMap.geoObjects.remove(myGeoobject);
    myMap.balloon.close();
}

 

У меня работает, правдо тогда, когда клик не по полигону:

 

   

Спасибо, сейчас перебросили на другой проект. Если вернут к этому - буду смотреть.