Клуб API Карт

Возможный багрепорт

Пост в архиве.

Столкнулся с двумя странностями:

1. В радио-группе кнопок (controls.Button), сначала происходит событие select нажимаемой кнопки, только затем deselect - ранее выбранной кнопки. По логике, нужно все по порядку делать. Сейчас решил ее дополнительной проверкой.

2. Добавляем несколько линий и полигонов в режиме редактирования в коллекцию myCollection (ymaps.GeoObjectCollection). Когда пользователь удаляет все точки линий и полигонов через контекстное меню, так чтобы на карте не осталось ни единой точки - код myCollection.getLength() по прежнему возвращает кол-во линий и полигонов. Пока решил проблему так:

myObject.geometry.events.add('pixelgeometrychange', function (event) {
  if (!myObject.geometry.getPixelGeometry().getCoordinates().length) {
    myCollection.remove(myObject); // удаляем объект если у него не осталось координат
  }
});

3 комментария

По пункту 2. Так задумано. Объект без точек - тоже объект, и если включить для него рисование, то можно снова надобавлять в него точек.

Если вы ходите чтобы при удалении всех точек объект удалялся из группы, то ваше решение подойдет, но только правильнее работать не с пиксельной геометрией а с основной. Т.е. слушать change и проверять !myObject.geometry.getLength().

Если смотреть визуально, после удаления последнего угла линии или многоугольника - остается пятнышко, которое не реагирует на нажатия ни левой, ни правой кнопок мыши.

Проблема в том, что после удаления всех точек (углов) многоугольника, его координаты по прежнему выглядят как "[ [ ] ]", тогда как у линии "[ ]". Учитывая это, метод getLength в первом случае возвращает "1", а во втором случае "0". Код вероятно должен выглядеть так:

myObject.events.add('geometrychange', function (event) {
  var type = myObject.getType(),
    coordinates = myObject.geometry.getCoordinates();

  if ((type == 'LineString' && !coordinates.length) || type == 'Polygon' && !coordinates[0].length) {
    myCollection.remove(myObject);
  }
});

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

Да у полигона getLength возвращает кол-во контуров и для него надо проверять наличие точек во всех контурах в цикле.

Про пятнышко посмотрим, возможно баг.