Клуб API Карт

Как обратиться к определенному объекту коллекции?

papuska
14 февраля 2014, 18:53

Здравствуйте. В общем такой вопрос, как можно обратиться к определенному объекту коллекции, чтобы совершать с ним какие-нибудь манипуляции? Например, есть несколько точек на карте, как удалить не все, а определенную?

34 комментария
Подписаться на комментарии к посту

к элементу GeoObjectArray можно обратиться по индексу, через метод get

myCollection.remove(myCollection.get(0))

Спасибо большое!

А еще вопрос, а как проверить, есть ли хотя бы 1 объект в этой коллекции или вообще может создана ли эта коллекция?

А у меня не получается, он ругается, пишет

TypeError: myPoint.get is not a function
 
myPoint.remove(myPoint.get(0));
  

Значит myPoint это не коллекция

А вот я добавляю вот так

 

var point = res.geoObjects.get(0);

map.geoObjects.add(point);

 

Можно ли потом из коллекции геообъектов карты удалить эту точку? И как это сделать?

 

map.geoObjects.remove(point)

а еще вопрос, извиняюсь, надоел наверное уже.

Как проверить, есть ли эта точка уже в коллекции, и если есть, то удалить, а то пока его нету, пока он не создан, он выдает ошибку!

в 2.0 есть 2 типа коллекций, обычная коллекция

и коллекция на основе массива

во второй есть indexOf

но для всех можно проверить так:

myPoint.getParent() == myMap.geoObjects

Вот мне нужно в 2.0

Опишу что нужно, при каждом изменении адреса, я апдейчу карту, и мне нужно удалить предыдущую точку на карте.

if (res.geoObjects.getLength()) {
                            var point = res.geoObjects.get(0);


                        if(point.getParent() == map.geoObjects){
                            map.geoObjects.remove(point);

                        }

                            map.geoObjects.add(point);
                            map.panTo(point.geometry.getCoordinates());

 

Но не работает так. Я пишу в 2.0. Мне нужно удалить предыдущую точку с карты, а не все точки, так как на карте есть еще геообъекты.

Надо сохранить ссылку в родительском scope на point

И удалять его перед добавлением новой

А не напишете как это сделать? Я не очень разбираюсь, что-то не получается. 

напишите как вы пробовали

лучше выложить свой вариант на jsfiddle.net

Там все очень сложно, вот мой отрывок кода:

 

myGeocoder.then(
                function (res) {
                        if (res.geoObjects.getLength()) {

                            var myPoints = new ymaps.GeoObjectArray({}, {
                            preset: "twirl#airplaneIcon",
                            strokeWidth: 4,
                            geodesic: true
                        });

                            myPoints.removeAll(); (тут предварительно удаляю все точки при каждом обновлении адреса, а затем ниже добавляю)

                            var position = res.geoObjects.get(0).geometry.getCoordinates();

                                    placemark = new ymaps.Placemark(position, {}, {});

                                    myPoints.add(placemark);

                                    map.geoObjects.add(myPoints);

                            map.panTo(position);
                    }
                },
                    function (error) {
                        alert("Возникла ошибка: " + error.message);
                    }
            )

На каждый вызов геокодера вы создаете новую коллекцию myPoints, удаляете из нее все, хотя она итак пуста, и добавляете в нее одну метку и добавляете коллекцию на карту

ссылка на эту коллекцию теряется и при следующем геокодировании метки будут накапливаться на карте

А если сделать так?

После инициализации карты, я добавляю на карту плейсмарк с координатами, например Москвы.

После обновления адреса я получаю новые координаты. Есть ли возможность переместить существующий плейсмарк на карте, задав новые координаты?

Расскажите для какого проекта вам нужно реализовать такое поведение.

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

Т.е. определяю адрес и вычисляю за мкадом он находится или нет =)

А можно еще вопрос? Вот я добавляю route в свою коллекцию геообъектов которая array.

Как мне получить доступ к первой или второй точке маршрута, чтобы поменять ее координаты?

myCollection.get(2).getWayPoint().get(1).setCoordinates(coords)???

Так почему-то не получается...

наверное надо менять через геометрию

myCollection.get(2).getWayPoint().get(1).geometry.setCoordinates(coords);

да, разобрался, точка меняется, а маршрут нет. Как теперь перестроить маршрут с этой точки?

может через editor?

Не понимаю. В документации есть перетаскивание точек. А как изменить конечную точку маршрута и перестроить маршрут я не понимаю (

Для редактирования маршрута можно использовать редактор маршрута, либо просто строить новый маршрут

Т.е при обновлении текстового поля (адреса) лучше заного строить маршрут? При этом удалить старый. правильно? Или есть какой-нибудь "сброс" маршрута?

Нет просто удаляете старый, строите и добавляете новый

Т.е я удаляю старый маршрут из коллекции геообъектов, а затем заного добавляю новый маршрут? А еще вопрос. я все-таки не понимаю с геоколлекциями.

Вот предположим я создал геоколлекцию не индексированную:

var myPath = new ymaps.GeoObjectCollection();

затем добавил туда, например, маршрут:

myPath.add(route);

затем эту коллекцию добавил в коллекцию карты

map.geoObjects.add(myPath);

И вышел из функции then.

Я вот не понимаю, как мне теперь из коллекции геообъектов myPath, которая добавлена в геоколлекцию карты удалить маршрут (route) ???

 

 

Не понимаешь просто потому что не прочел документацию

Методы remove и removeAll у GeoObjectCollection

Хорошо, еще вопросик, а если дважды будет такая конструкция

var myPath = new ymaps.GeoObjectCollection();

map.geoObjects.add(myPath);

какой-то там код и еще раз

var myPath = new ymaps.GeoObjectCollection();

map.geoObjects.add(myPath);

 

Вопрос, заменится ли в коллекции карты myPath или создастся новый?

 

 

 

 

 

 

Ох

сделай просто очистку коллекции 

Не пересоздавай ее

                                if(route_created){
                                    myPath.removeAll(); (ругается, он не видит myPath или что...блин никак не пойму)
                                }       

             
                                var myRouter = ymaps.route([
                                    [centerOfMoscow],  [position]
                                ], {
                                    mapStateAutoApply: true
                                    });

                                myRouter.then(function(route) {
                                    var myPath = new ymaps.GeoObjectCollection();
                                    map.geoObjects.add(myPath);
                                    myPath.add(route);
                                    route_created = true;
                                    }
                                );

Вам надо прочитать про область видимости переменных

В javascript

Вынесите из обработчиках then

var myPath = new ymaps.GeoObjectCollection();

 map.geoObjects.add(myPath);


На уровень выше, а на их месте удаляете из коллекции path перед добавлением нового маршрута

myPath.removeAll();


А то что он ругается, он не видит потому что запрос за маршрутом асинхронный


Все делаю и делаю свою штуку, уже сделал построение маршрута по отрезку за мкадом, по примеру, что Вы давали, но немного по-другому реализовал. Есть еще вопрос, вот я строю когда маршрут, у меня есть две крайние точки, по клику на них выводится информация о координатах, а как вывести туда адрес местоположения? Мне приходит в голову только мысль с помощью geocode сделать два запросах по двум точкам, и получить данные и потом занести в эти точки, правильно или нет? Или есть в функции route что-то готовое?