Клуб API Карт

Найдено на тему «коллекции»:
Получение координат из JSON и отображение их как коллекции объектов. Нужна помощь!
Azat Zagitov
10 марта 2017, 15:22

Добрый день. Необходима помощь. Пытаюсь получить координаты из JSON и вывести их на карте как коллекцию объектов.

Данные получаю, в консоли выводится, а карта не хочет их отображать.

Вот код: 

var items = [];
	console.log("JSON start...")
	jQuery.getJSON( url, function( json ) {
		jQuery.each(json.posts, function(key, index) {
			loc = index.custom_fields.map_coords[0];
			items.push(loc);
		});
	})
	.done(function() {
		console.log("JSON received... Start YMaps")
		ymaps.ready(init);
		function init() {
			var myMap = new ymaps.Map("map", {
				center: [54.738307, 55.945710],
				zoom: 13
			}),
			addresses = new ymaps.GeoObjectCollection(null, {
				preset: 'islands#yellowIcon'
			});
			console.log('1st elem: ' + items[0] + "\nArray length: " + items.length);
			for (var i = 0, l = items.length; i < l; i++) {
				addresses.add(new ymaps.Placemark(items[i]));
			}

			myMap.geoObjects.add(addresses);
		}
	})
	.fail(function() {
		console.log( "error" );
	});

Получаю ошибку, Cannot read property 'then' of null. Я так понял массив координат ему не нравится. Хотя в консоли всё нормально отображается.

В чём может быть проблема?

3 комментария
JSON,коллекции
.GeoObjectCollection each() перебирает элементы до предпоследнего
Удалённый пользователь
25 августа 2015, 11:32

Создаю коллекцию

 

collection=new ymaps.GeoObjectCollection();

 

добавляю  в коллекцию полигоны загружая данные из БД о координатах 

collection.add(polygon);

Создаю Placemark 

placemark=new ymaps.Placemark([56.01,93.04],
                                                                  {},
                                                                  {
                                                                    hideIcon: false,                   
                                                                    draggable: true
                                                                  }
                                                                  );
placemark.events.add(['dragend'], function(e){
                                                                console.log(collection.getLength());
                                                                collection.each(function(els){  console.log(els)})
                                                                })


Получаю объектов 3 а выводит только 2. Получается что проходит не все объекты.

 

3

yandexmap.js:55 s {geometry: e.d…e.S, properties: o, state: o, options: Object, events: s…} 

yandexmap.js:55 s {geometry: e.d…e.S, properties: o, state: o, options: Object, events: s…}

 


Если выполнить проход 2 раза то обходятся все объекты... 

Как решиьт данную проблему?

 

1 комментарий
API 2.0,коллекции,each
Область показа объекта на заданном приближении
maxnesterenko
2 июля 2015, 06:21

Приветствую!

Идея такова - есть объекты карты, которые нужно показывать например только на приближении свыше 10... На других - они должны  быть скрыты.

Вопрос такой: использовалась версия API 2.0, следующий код работал:

 

var myObjectManager = new ObjectManager();

tile=10;
myObjectManager.add(myPlacemark[key], tile, Infinity); 
...
myMap.geoObjects.add(myObjectManager);
Обновился до версии 2.1, этот код не работает... Пытался сделать вида:
myMap.geoObjects.add(myPlacemark[key], tile, Infinity);
- все отображается, но не учитывается, на каком зуме показывать...
Как можно сделать поставленную задану на api 2.1? В примерах что-то не нашел такого (((
2 комментария
масштаб,метка,API 2.1,менеджер объектов,коллекции
Перенос вложенных колеекций из одной в другую
tgarl
24 июня 2015, 16:15

 

 Я метки раскидываю по коллекциям. Сами коллекции помещаю в общую.

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

вот что получается

 // Пункт меню.
                var menuItem = $(\'<li><span class="imges">\'+ group.picture +\'</span><a href="javascript:void(0);" class="colect\'+group.colect+\'">\' + group.name + \'</a></li>\'),
                // Коллекция для геообъектов группы.
                    collection = new ymaps.GeoObjectCollection(null, { preset: group.style });
                
                // Добавляем коллекцию на карту.
                //map.geoObjects.add(collection);
                visible.add(collection);
                
                $("div.obolochka_map").show();

                // Добавляем подменю.
                menuItem
                    
                    // Добавляем пункт в меню.
                    .appendTo(menu)
                    // По клику удаляем/добавляем коллекцию на карту и скрываем/отображаем подменю.
                    .find("a")
                    .click(function(){
                        //map.geoObjects.removeAll();
                        $("#main_map li").removeClass("active");
                        /* var itr, groupr;
                        itr = visible.getIterator();
                while(groupr = itr.getNext()) {
                    
                        hidden.add(group);
                    
                } */
                
                //visible.each(function (itemr) {hidden.add(itemr);});
                visible.removeAll();
                visible.add(collection);
                        //map.geoObjects.add(collection);
                        $(this).parent("li").addClass("active");    
                        showsub();    
                        //показать так чтобы все содержимое коллекции было видно
                        map.setBounds(map.geoObjects.getBounds());
                        
                    });
                    
                for (var j = 0, m = group.items.length; j < m; j++) {
                    createSubMenu(group.items[j], collection);
                }
ни один ни второй вариант не работает
/* var itr, groupr;
                        itr = visible.getIterator();
                while(groupr = itr.getNext()) {
                    
                        hidden.add(group);
                    
                } */
                
                //visible.each(function (itemr) {hidden.add(itemr);});

 

 



1 комментарий
API 2.1,коллекции
Зависание браузера на большом кол-ве объектов
Удалённый пользователь
1 июня 2015, 17:20

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

 

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

 

Объекты приходят из отдельного файла в виде JSON:

 

Points.stores =  [{"id":"1", "name":"ТУТ ИМЯ", "lat":"55.751656", "lng":"37.71718", "descript":"ОПИСАНИЕ", "type":"ТИП", "sell":"1", "refill":"1" ,"refund":"0"},.....]

 

После создания карты, обычным образом создаю метки:

 

map = new ymaps.Map('map', {

            center: [55.754015, 37.618827],

            zoom: 15

        });

collection = new ymaps.GeoObjectCollection();

for (var i = 0; i < Points.stores.length; i++) {

            marker = new ymaps.Placemark([Points.stores[i].lat, Points.stores[i].lng], {

                    iconContent: i,

                    balloonContent: Points.stores[i].descript,

                    content: Points.stores[i].descript

                },{

                    preset: 'islands#blueStretchyIcon'

                });

              collection.add(marker); //вот тут все умирает

}

map.geoObjects.add(collection);

 

Пробовал создавать коллекции по запросу,  а не при инициализаии карты; вносить метки в атрибуты самих объектов Points, но работает хоть как-то только если уйти от коллекций. Где-то что-то я не замечаю. Прошу помощи.

2 комментария
коллекция,метка,API 2.1,коллекции
Поиск маркеров по properties в коллекции
Verstaka
20 мая 2015, 22:23

Есть массив

 

var groups = [

{

coordinates: [55.826564, 37.532527],

title: 'Title',

color: 'gray'

},

{...}

]

 

 

Есть пустая коллекция

myCol = new ymaps.GeoObjectCollection();

 

Из массива достаем нужную инфу и создаем маркеры

 

for (var i = 0; i < groups.length; i++) {

placemark = new ymaps.Placemark(groups[i].coordinates, {

title: groups[i].title,

color: groups[i].color

});

myCol.add(placemark); // Добавляем в коллекцию

}

 

 

Добавляем на карту

myMap.geoObjects.add(myCol);

 

Все работает идеально.

 

А теперь я хочу выбрать все маркеры, у которых color == 'red'

 

 

var result = ymaps.geoQuery(myMap.geoObjects);

console.log(result.search('properties.color == "red"').getLength())

 

Получаю 0.

 

Причем если так,

console.log(result.search('geometry.coordinates.0 > 100').getLength())

То все ищется корректно.

 

Немного поизучав вопрос, выясняется, что на этапе

myCol.add(placemark); // Добавляем в коллекцию

properties теряется.

 

Есть ли варианты, кроме создания разных коллекций?

5 комментариев
метка,API 2.1,коллекции,geoQuery
Ошибка при добавлении объекта в коллекцию с индексом
pilyuginivan
3 апреля 2015, 17:21

Здравствуйте.

Согласно документации при добавлении объекта в коллекцию можно указать индекс.

Почему-то при указании индекса в консоль вылетает ошибка "Uncaught TypeError: Cannot read property 'getPixelBounds' of undefined".

Вот пример кода (скопировал из песочницы, вырезал все объекты, кроме одного, и оставшемуся при добавлении задал индекс).

Что я делаю не так?

1 комментарий
API 2.1,коллекции
Отключение показа коллекций по умолчанию.
Удалённый пользователь
14 марта 2015, 23:19

Доброй Всем ночи! Обращаюсь к вам с вопросом, как отключить по дефолту показ коллекций в примере:

https://tech.yandex.ru/maps/jsbox/2.1/object_list

что бы было как в примере:

http://dimik.narod.ru/ymaps/grouping.html

 

Использовал display:none в классе .submenu. В итоге метки по прежнему показываются. А сами группы свернуты.

Заранее спасибо за ответ

1 комментарий
API 2.1,коллекции
Cобытий на отдельный placemark api Яндекс.карт 2.0
Владимир Усольцев
3 февраля 2015, 09:17

Нужно каждому placemark добавлять событие click, и при этом событии вызывать ф-ю, передавая туда параметр properties._K.entityid, но почемуто всем меткам пердается параметр последней метки??

Вот код:

         var Placemarks = [];

          for (var i in Map.options.placemarks) {

            var Coords = Map.options.placemarks[i].coords;

            var Params = Map.options.placemarks[i].params;

            var Icon = Map.options.placemarks[i].icon;

            var Placemark = new ymaps.Placemark(Coords, Params, Icon);

            Placemark.events.add('click', function () {

              //console.log(Placemark.properties._K.entityid);

              GetDataComplex(Placemark.properties._K.entityid);

            });

            Placemarks.push(Placemark);

          }

          clusterer.add(Placemarks);

3 комментария
метка,API 2.1,события,коллекции
Удаление объектов из геоколлекции
D.Abramov8
26 января 2015, 17:55

Добрый вечер!
Как реализовать удаление всех объектов из коллекции?

this._map.geoObjects.remove(-все-объекты-);

С уважением,
Дмитрий А.

5 комментариев
API 2.1,коллекции
res.geoObjects.each возвращает не все объекты
Дмитрий Тимофеев
24 января 2015, 12:06

загружаю объекты через XML и вывожу их так

res.geoObjects.each(function (item) { 

для того, чтобы на каждый объект прописать событие 

item.events.add('click', function (e) {

----

Xml http://veq.ru/compass/get_pl_xml.aspx?v= возвращает 4 объекта.

А на карту http://veq.ru/compass/ выводится только два.

-----

если я использую вывод через 

myMap.geoObjects.add(res.geoObjects);

то выводится все 4 объекта из Xml

---

подскажите что поправить.

 

ЗЫ: и еще вопрос - можно ли подобный обработчик прописать как то иначе, без перебора each 

 

5 комментариев
API 2.1,коллекции,YMapsML
Скрипт перестаёт выполняться
Костерин Максим
30 ноября 2014, 20:27

Пытаюсь найти в каком полигоне появляется результат поиска. Но на строчке myMap.geoObjects.searchInside(ttk_polygon.geometry); выполнение кода останавливается. Отладчик не выдает ни одной ошибки. 

Не совсем понимаю, какой объект использовать для вызова searchInside.

 

mySearchControl.events.add('resultselect', function (e) {
        var index = e.get('index');
        mySearchControl.getResult(index).then(function (res) {
            mySearchResults.add(res);           
            objectsInTTk = myMap.geoObjects.searchInside(ttk_polygon.geometry);
            objectsInMoscow = myMap.geoObjects.searchInside(mkad_polygon.geometry);
            if (objectsInTTk.length) {

                // Адрес внутри ТТК
                console.log('внутри ттк');

            } else if (objectsInMoscow.length) {

                // Адрес внутри МКАД
                console.log('внутри мкад');

            } else {

                // Адрес за МКАД
                // Расчет расстояния до адреса
                console.log('за мкад');       
            }

 

 

Помогите разобраться. Спасибо!

3 комментария
API 2.1,коллекции,geoQuery
При обработке данных из json не отрабатывает setBounds
Atach
10 ноября 2014, 20:25
Если в кратце ....

То получаю данные и добавляю их в коллекцию перебором

var myGeoObjects = new ymaps.GeoObjectCollection();
$.getJSON("jsonItems.php", function(json) { 
     for (i = 0; i < json.markers.length; i++) {
          myGeoObjects.add(new ymaps.Placemark([json.markers[i].lat,json.markers[i].lon]));
     } 
});

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

myMap.geoObjects.add(myGeoObjects);
myMap.setBounds(myGeoObjects.getBounds())

Но setBounds не отрабатывает ...
Если же добавить Placemark в коллекцию просто вручную не в переборе, а просто записать строку: 

myGeoObjects.add(new ymaps.Placemark([55.76, 37.64]));

то всё нормально работает ... Т.е. myMap.setBounds(myGeoObjects.getBounds()), не видит коллекцию которая добавляется перебором.


 Рабочий пример вот тут 


4 комментария
масштаб,API 2.1,область видимости,коллекции,балун
Быстрая смена предустановленных параметров отображения коллекции объектов
Noita
1 октября 2014, 10:48

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

Есть ли у коллекций механизм комплексного хранения параметров отображения? Этакий "вью".

Или нужно просто хранить параметры в виде вложенных массивов у себя в переменной и в циклах проходиться по значениям?

3 комментария
API 2.1,коллекции,стили
Как определить нужный geoObjects
Atach
15 августа 2014, 22:32

Возможно вопрос сформулирован некорректно .... Есть общее понятие работы API, но до конца вникнуть не могу ....
На карту добавляются геообъекты из geoXml  (все объекты это полигоны).

Событие1

ymaps.geoXml.load("http://mysite/xmlzone.xml?" + timestamp).then(function (res) {
map.geoObjects.add(res.geoObjects);
}, function (error){
alert('Ошибка: ' + error);
});


Дальше по событию добавляется ещё один объект (уже баллун). Геокодирование адреса.

Событие2

var position = res.geoObjects.get(0).geometry.getCoordinates();
placemark = new ymaps.Placemark(position, {}, {});
map.geoObjects.add(placemark);

 

Вопрос вот в чем. У меня "событие 2" (добавление балуна) повторяется регулярно, и задача очищать предыдущий объект баллун и ставить новый в зависимости от новых координат. Сейчас они только добавляются к уже имеющимся.

 

Подскажите как правильно сделать это. Я пробовал очищать все геообъекты таким путём:

map.geoObjects.each(function (geoObject) {
        map.geoObjects.remove(geoObject);
});

Но при переборе удаляются все объекты и даже полигоны из "события 1". Я не знаю как при переборе исключить полигоны или наоборот найти имеено балун, чтобы применить имеенно к ниму удаление объекта.

 

3 комментария
метка,Javascript,API 2.1,коллекции
Добавление и удаление треков на карте.
hitriy-m
21 июля 2014, 10:04

Здравствуйте, у меня вот какая задача есть база треков (набор .gpx файлов), которые лежат в определённой директории на сервере с WordPress. Нужно показать их на карте. html код я генерирую с помощью PHP.

<form><inputtype="checkbox"name="2014-07-13.gpx"value="2014-07-13.gpx"onchange="showtrack('2014-07-13.gpx',1)">2014-07-13.gpx<br><inputtype="checkbox"name="2014-06-21.gpx"value="2014-06-21.gpx"onchange="showtrack('2014-06-21.gpx',4)">2014-06-21.gpx<br></form>

Под самой картой список checkbox'ов при смене состояния вызывается javascript

function showtrack (name,k){
checkbox
=document.getElementsByName(name);
if(checkbox[0].checked==true){
  ymaps
.geoXml.load('http://mkpp.org/geo/tracks/'+name).then(
   
function(res,k)
   
{ myMap.geoObjects.add(res.geoObjects,k);
    myMap
.setBounds(res.geoObjects.getBounds());
 
});
}
else{
  myMap
.geoObjects.remove(k);
}

Суть в том, что трек надо показывать только при выделенном checkbox'е. Отображаться отображается, а вот при попытке удалить трек с карты, на myMap.geoObjects.remove(k); ругается "Uncaught TypeError: undefined is not a function". Как побороть? Уже запутался в этих коллекциях. В голове каша, проясните пожалуйста.

1 комментарий
API 2.1,коллекции,GPX
Ajax загрузка содержимого балуна
mafia2resurs
17 июля 2014, 16:57

Здравствуйте!

Возникла проблема с пониманием, каким образом можно из коллекций меток сделать аякс загрузку содержимого балуна.

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

Не понятно, как сделать одно событие на все коллекции. Получить в этом событии свойство linkAjax текущей нажатой метки, подгрузить контент по ссылке из этого свойства аяксом в открытый в данный момент балун.

Примеры с загрузкой содержимого балуна аяксом смотрел, но так и не получилось ничего сделать на их основе (примера подгрузки аяксом с применением коллекций не нашел). JS знаю плохо, в основном jQuery. Очень прошу помочь знающих людей :)

 

Вот ссылка на страницу с картой (код карты в html разметке) http://html5-coder.com/html/131/map.html

2 комментария
API 2.0,коллекции,балун
Класс GeoObjectArray не поддерживается
Петропавлов Павел
9 июля 2014, 18:53

Класс GeoObjectArray не поддерживается (соответствующая функциональность доступна в GeoObjectCollection)

Такое сообщение выскакивает при попытке создать данный объект. А что мне делать, если нужна ordered коллекция???

3 комментария
API 2.1,коллекции
Прошу помощи с удалением Полилинии с карты
Олег Семенов
4 июля 2014, 05:38

Ребята, с yandex map работаю не так давно но вот не могу разобраться как удалить полилию

1) есть ф-я которая повешана на click:

 

 $.post("/get_points.php", {
         user_id: "<? echo $uid; ?>",
         password: "<? echo $password;?>",
         child_id: child_id,
         type: type,
         data: arr
     },
     function (json) {
         if (!json.errCode) {
             for (i = 0; i < json.length; i++) {
                 var myPlacemark = new ymaps.Placemark([json[i].lat, json[i].lng], {
                         // Свойства
                         hintContent: json[i].hinttext,
                         balloonContentHeader: json[i].header,
                         balloonContentBody: json[i].balloontext,
                         balloonContentFooter: json[i].footer
                     }, // Опции
                     { // preset: +json[i].preset
                         preset: 'mystyle#' + json[i].preset
                     }
                 );
                 myCollection.add(myPlacemark);
                 if (i == json.length - 1) {
                     go_to(json[i].lng, json[i].lat);
                 }
                 points.push([+json[i].lat, +json[i].lng]);
             }
             if (type != 'online') {
                 poliline(points);
             } - здесь мы вызываем ф - ю которая рисует нам полилинию
         } else {
             alert(json.errMessage);
         }
     }, 'json');
 myMap.geoObjects.add(myCollection);
 return false;

 

все отлично метки выводятся на карту и рисуется полилиния

   if (type !='online'){poliline(points); }  - здесь мы вызываем ф-ю которая рисует нам полилинию

вот сама ф-я  function poliline(points)

  

function poliline(points) {
    console.log(points);
    var color = $.cookie('child_color');
    if (color == '') {
        color = '#CC3300';
    }
    // Создаем ломаную линию.
    var polyline = new ymaps.Polyline(points, {
        hintContent: "Путь следования"
    }, {
        draggable: true,
        strokeColor: color,
        strokeWidth: 4,
        strokeStyle: '1 2' // Первой цифрой задаем длину штриха. Второй цифрой задаем длину разрыва.
    });
    myMap.geoObjects.add(polyline); // Добавляем линию на карту.
    myMap.setBounds(polyline.geometry.getBounds()); // Устанавливаем карте границы линии.
}

 

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

1 комментарий
API 2.1,Javascript,полилиния,коллекции
Отобразить коллекции
Александр
1 июля 2014, 12:35

Есть коллекция

 

           myCollection

                .add(ait1) 

                .add(ait2);

            myMap.geoObjects.add(myCollection);

 

 

По кнопке

Прячу одну коллекцию - 

hidden.add(ait1);

(добавляю в пустую коллекцию)

 

Подскажите пожалуйста - как теперь показать эту коллекцию? 

по нажатию другой нопки делаю -  

myCollection.add(ait1);

- метки не появляются;



16 комментариев
Javascript,API 2.1,коллекции