Клуб API Карт

groupPolygon[k].geometry.getCoordinates() - до editor.stopEditing()?

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

На практиве еще не проверял. Просто не у компутера.

Можно ли получить координаты, до того как выполнится stopEditing?

 

Необходимо для проверки, что полигон состоит как минимум из трех точек

6 комментариев

можно. можно слушать событие change на геометрии и смотреть длину внешнего контура

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

Прошу помочь разъяснениями.

Я не совсем понял, как это слушать события на геометрии, такое вообще возможно? Мы можем слушать событие изменения объекта.

Например:groupPolygon[k].events.add('change', function(e){...});

Разме возможно делать groupPolygon[k].geometry.events.add('change', function(e){...});???

ПС: пошукав нашел geometrychange. речь о нем???

И вопрос по поводу длины внешнего контура. Это мне совсем непонятно. Прошерстил geoobject и polygon в справочнике, там вообще таких методов и близко нет.

Можете чуть конкретнее указать докуменетацию об этих методах?

Да, geometrychange

Я на каждый создаваемый полигон навешиваю событие

myPolygon.events.add("geometrychange", function(result){
var coords = this.geometry.getCoordinates();

....

Тут сразу хочу предупредить о грабле. Поскольку у меня полигоны могут таскаться пользователем, то в процессе перетаскивания тоже постоянно генерилось событие geometrychange. у меня изменение геометрии записывается в БД, соотвественно передавать на сервер весь процесс таскания мне ни к чему (это у меня висит на событии dragend). Чтобы подавить попытки реакции на изменение геометрии именно при перетаскивании, я добавила еще строку

if (this.state.get('drag')!=true){ 

......запись новых координат в БД

 

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

а) получаем координаты внешнего контура многоугольника

var contur=myPolygon.geometry.get(0) //получаем координаты контура с индексом 0

(getLength() в данном случае вернет число контуров многоугольника, поэтому не подходит). Основной, внешний контур имеет индекс 0, вложенные - 1,2, ....и т.д.

в contur попадет массив вида

[[-1, 1], [1, 1], [1, -1], [-1, -1], [-1, 1]]
Обратите внимание - у меня четырехугольник, но вершин 5, последняя совпадает с первой.
Поэтому число вершин на одну больше.
б) обрабатываем contur как обычный массив, получая количество элементов
NumOfVertex=contur.length-1

Вуаля! :)

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

Вот как существуют супер герои в сети: днём обычная бабушка-бэтмен, а ночью превращается в Yulka.

 

Спасибо. Собственно меня смутило измерение длины контура, я и подумал, накой ляд мне нужен периметр многоугольника и как он меня приблизит к цели. Про length вообще не подумал :))

Спасибо за более чем подробные примеры и описани логики. прямо все на блюдечке выдали. балуете :)

 

ЗЫ: не лучше ли запись в БД производить по editor.stopEditing? или что еще лучше state.get('editing')==false? Т.е. в тот момент, когда вы прекращаете редактирование полигона.

Возможно и лучше, но у меня startEditing включается сразу на много полигонов, не факт, что они будут все изменяться, поэтому я и отсылаю изменения на сервер по каждому индивидуально (опять же, чтобы избежать ситуации - пользовтель полигон изменил, а режим редактирования отключить забыл и закрыл страницу. и где тогда эти изменения? :) )

Примеры.. да... периодически самой их очень не хватает, поэтому я стараюсь улучшить ситуацию :)

ты не там шерстил

у полигона есть поле geometry

http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/geometry.Polygon.xml

и у него тоже есть поле events,

myPolygon.geometry.events.add('change' ...)

И как правильно заметила Yulka это событие 

пропагируется до самого полигона, при этом получая префикс geometrychange

 

если внимательно читать доки то вопросов и чудес будет меньше