Клуб API Карт

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

zh00pel
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

Класс. Спасибо. Просто пока еще нет понимания структуры 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

 

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

Ниже приведен код. Прописал его внутри функции 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, но при отпускании кнопки он не выключается.

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

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

 

Вопрос не по теме 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. 

 

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

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 знаком посредственно.

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