Клуб API Карт

Изменение свойства точки, после отрисовки.

Пост в архиве.
Андрей Грэй
16 января 2013, 19:24

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

Оговорюсь, в javascript я не селён, потому, возможно простой и очевидный ответ могу не видеть.

Суть задачи такая.

Есть карта. На ней есть точки. Мне нужно иметь возможность перемещать точки по карте, но только после того, как была зажата клавиша. 

$(document).keydown(
function(e) {
// alert(e.keyCode);
switch (e.keyCode) {
case 77: // M
$("#mapTablo").text('Перемещаем точку');
// здесь код 
break;

 

Понимаю что нужно включить для всех объектов на карте {draggable: true}

Но пока еще не очень разобрался как это делается.

Предполагаю что нужно обработать myMap.geoObjects, но не уверен. Подскажите в какую сторону искать.

Спасибо

 

8 комментариев
Создаете коллекцию геообъектов, добавляете в нее точки. При зажатии клавиши прописываете коллекции draggable.

var myCollection = new ymaps.GeoObjectCollection();
// Добавляете метки в коллекцию.
// После показываете метки на карте
map.geoObjects.add(myCollection);

// Дальше ловите зажатие кнопки и прописываете draggable.
myCollection.options.set('draggable', true);

// Когда пользователь отпускает кнопку, возвращаете на место.
myCollection.options.set('draggable', false);


http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/GeoObjectCollection.xml
Андрей Грэй
28 января 2016, 02:52

Класс. Спасибо. Просто пока еще нет понимания структуры api.

не знал что можно устанавливать через .option.set()

И по поводу метода set(), не нашел в описании api.

 

И еще вопрос. Нашел в примерах вот такой код:

 

 if(collection.getParent()) {
 myMap.geoObjects.remove(collection);
 }
 else {
 myMap.geoObjects.add(collection);
 

}

Это используется для отображения коллекции. У GeoObjectCollection есть метод getParent(). 

Не могли бы его пояснить? Что он такое берет у родителя, что позволяет использовать его в таком коде? В api как-то скудно описано. Или я не там читаю...

Пример из которого взял код: http://dimik.github.com/ymaps/examples/group-menu/menu01.html

 

Андрей Грэй
28 января 2016, 02:52

 Работает, да не совсем.

Ниже приведен код. Прописал его внутри функции init() (за её пределами myCollection.options.set('draggable', true); вообще не работает).

$(document).keyup(function(e) {switch (e.keyCode) {case 77: // Mkey_state = 'M';$("#mapTablo").text('');myCollection.options.set('draggable', false);break;}});$(document).keydown(function(e) {switch (e.keyCode) {case 77: // Mkey_state = 'M';$("#mapTablo").text('Перемещаем заявку');myCollection.options.set('draggable', true);break;}});

Как результат. При нажатии кнопки M, включается режим draggable, но при отпускании кнопки он не выключается.

Хотя остальные кнопки отрабатываются нормально. (((

Андрей Грэй
28 января 2016, 02:52

Прямо готовое решение на блюдечке. Примного благодарен за такую щедрость )

 

Вопрос не по теме api, a по javascript (я новичок, а гуглить решение уже устал).

 

Пытаюсь сделать тестовый объект, из которого буду создавать точки и у меня загвоздка:

 

var item = {free : {},group : {}};for ( var j = 1; j item.group[j] = true;for ( var i = 1; i item.group[j][i]=true;var x = 55.5 + Math.random() * (.300 - .100) + .100;var y = 37.4 + Math.random() * (.300 - .100) + .100;item.group[j][i] = {position : [ x, y ],data : {balloonContent : 'Координаты ' + x + ', ' + y,iconContent : 'Точка ' + i}};console.log(item.group[j][i]);}}

Код не работает. Я подозреваю что это связано с тем, как я обращаюсь к элементам объекта.

item.group[j][i]

item.group[j][i].position[0]

Как это сделать паильно? Может быть цикл for здесь не подходит?

{} — хэш, [] — массив. Вы пытаетесь работать с хэшем как с массивом. К тому же, нумерацию в цикле лучше делать с 0, а там где прописываете контент уже указывать не i, а i+1. 

 

Андрей Грэй
28 января 2016, 02:52

В описаниях в интернете я находил, что к хэшу нужно обращаться так:

obj['id']= 123;

odj['type']=1;

Фигурные скобки, как я понял используются при такой записи:

var obj ={

'id':123,

'type':1 

}

Цифру я использовал не для того чтобы работать с массивом, а для последовательного перебора.

Т.е. если мне нужен хэш с элементами от одного до 3, я делал так:

var obj = {};

for(var i = 1; i

obj[i]={

id:i

}

}

Этот метод работает.

Думал что, если в таком же случае обращаться к более глубокому слою, то должен работать и

obj[i][j], но не тут то было... (

Как вы поступаете в таких случаях?

 

Насчет того, чтобы начинать массивы с 0, согласен. Но ведь хеш - это ассоциативный массив, ему ж вроде бы должно быть пофиг?

 

Я не говорю что я прав, я интересуюсь, т.к. с js знаком посредственно.

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