Клуб API Карт

добавление меток циклом

eldis24
24 сентября 2013, 08:45

По определенном унабору параметров нужно осуществлять поиск по карте и выводить метки того или иного цвета. В конечном итоге вывести все метки и отцентровать на карте.  

 

        var myobj = document.getElementById("myallobj").value.split("###"); //разбиваю строку

        for (var col = 0; col < myobj.length; col++) {//обход разбитой строки

            if (myobj[col] != "") {

                var forparse = myobj[col].split('$$$');//разбиваю полученные строки еще раз, чтобы получить статус(цвет) будущей метки 

                if (forparse[1] == "4" || forparse[1] == "5") {//если статус 4 или 5 метка должна быть красной

                    objects = ymaps.geoQuery().add(ymaps.geocode(forparse[0])).setOptions({ preset: 'twirl#redIcon' });

                    objects.addToMap(myMap);

                }

                else {//иначе ставим зеленые метки

                    objects = ymaps.geoQuery().add(ymaps.geocode(forparse[0])).setOptions({ preset: 'twirl#greenIcon' });

                    objects.addToMap(myMap);

                }

            }

            objects.applyBoundsToMap(myMap);//здесь хотелось-бы отцентровать полученные метки

        }

 

  

Может я накорню делаю не так, подскажите как правильно.

10 комментариев
Подписаться на комментарии к посту
Всеволод Шмыров
24 сентября 2013, 12:43
А нет в консоли какой-нибудь ошибки?
myallobj - это input ?

да, это инпут. Туда передаются адреса и статусы типа Адрес1###2$$$Адрес2###2$$$Адрес3###1$$$

вот так работает, но метки не красит в разные цвета

 

        var objects = ymaps.geoQuery();

        var myobj = document.getElementById("myallobj").value.split("###");

        for (var col = 0; col < myobj.length; col++) {

            if (myobj[col] != "") {

                var forparse = myobj[col].split('$$$');

                if (forparse[1] == "4" || forparse[1] == "5") {

                    objects = objects.add(ymaps.geocode(forparse[0])).setOptions({ preset: 'twirl#redIcon' });

                    objects.addToMap(myMap);

                }

                else {

                    objects = objects.add(ymaps.geocode(forparse[0])).setOptions({ preset: 'twirl#greenIcon' });

                    objects.addToMap(myMap);

                }

            }

        }

        objects.applyBoundsToMap(myMap);

 

В примере в топике не работает центрование, но метки раскрашиваются в нужные цвета.

Всеволод Шмыров
24 сентября 2013, 13:12
а в консоли (F12) нет ошибок? Во второй раз вы вызываете все setOptions у одного geoQueryResult объекта.
А какие запросы происходят? То есть что в myallobj ?

консоль смотрел - ошибок нет.

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

Всеволод Шмыров
24 сентября 2013, 15:25
>> Как можно при добавлении метки в объект выставлять опции конкретно для неё?
Вы используете геокодер с функцией-хелпером geoQuery. Можно не использовать geoQuery. Пример
http://api.yandex.ru/maps/jsbox/geocode

...
geocoder(..).then(function (res) {
    res.geoObjects.options.set("preset", "twirl#redIcon");
    ...
}

Но ваш код немного усложнится из-за того, что геокодер - асинхронная операция - и все function (res) будут вызваны после исполнения цикла. geoQuery как раз упрощает такую работу.

>> В примере в топике не работает центрование, но метки раскрашиваются в нужные цвета.
В первом примере applyBoundsToMap вызывает в каждой итерации. Для каждой метки. Вы хотите, чтобы в области видимости были видны все метки? Тогда они должны быть в единой коллекции. Как во втором примере. Или можно завести вторую коллекцию, в которую на каждой итерации будет добавляться "локальная" коллекция с измененным цветом.

>> вот так работает, но метки не красит в разные цвета
Во втором примере есть одна коллекция (и центрирование по этому работает правильно), но установка опция происходит по сути только у последней коллекции в последней итерации.
Вы можете сделать в два цикла - в первом заполнить одну коллекцию без установки цвета и вызвать у этой коллекции applyBoundsToMap.
А потом у коллекции вызвать перебор. each
http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/GeoObjectCollection.xml#each
и по индексу (функция переданная в each содержит значение и индекс)

objects.each(function (obj, index) {
    obj.options.set('preset', '...');
});

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

 

        var objects1 = ymaps.geoQuery();

        var myobj = document.getElementById("myallobj").value.split("#_@_#"); //разбиваю строку

        for (var col = 0; col < myobj.length; col++) {//обход разбитой строки

            if (myobj[col] != "") {

                var forparse = myobj[col].split('$_#_$');//разбиваю полученные строки еще раз, чтобы получить статус(цвет) будущей метки 

                if (forparse[1] == "4" || forparse[1] == "5") {//если статус 4 или 5 метка должна быть красной

                    objects1 = objects1.add(ymaps.geocode(forparse[0])); objects1.addToMap(myMap);

 

                    objects = ymaps.geoQuery().add(ymaps.geocode(forparse[0])).setOptions({ preset: 'twirl#redIcon' });

                    objects.addToMap(myMap);

                }

                else {//иначе ставим зеленые метки

                    objects1 = objects1.add(ymaps.geocode(forparse[0])); objects1.addToMap(myMap);

 

                    objects = ymaps.geoQuery().add(ymaps.geocode(forparse[0])).setOptions({ preset: 'twirl#greenIcon' });

                    objects.addToMap(myMap);

                }

            }

        }

 

        objects1.applyBoundsToMap(myMap);

        myObjects.remove(objects1).removeFromMap(myMap);  //это не работает, а так хотелось бы =((

.setOptiions("visible", false);

или это не работает objects1.setOptiions("visible", false); или его нужно вызывать не в конце init().
А есть возможность сложить два objects = ymaps.geoQuery(); после их добавления на карту?

Спасибо за оказанное внимание.

Посмотрите в документации на geoQueryResult,

кажется называется setOption