Клуб API Карт

vertexdragend - получить координаты вершины

emil.utug
5 февраля 2014, 12:50

1) Vertexdragend как получить конечные координаты перетаскиваемой вершины

 

myPolyline.editor.events.add(['vertexdragstart'], function(e){
startDragCoord = e.get('target').properties.get('model').geometry.getCoordinates();
console.log(startDragCoord);
});
myPolyline.editor.events.add(['vertexdragend'], function(e){
// Вариант 1
endDragCoord = e.get('target').geometry.getCoordinates();
// Вариант 2
//endDragCoord = e.get('target').properties.get('model').getPixels();
//endDragCoord = myMap.options.get('projection').fromGlobalPixels(endDragCoord, myMap.getZoom())
// Вариант 3
//endDragCoord = e.get('target').properties.get('model').geometry.getCoordinates();
console.log(endDragCoord);
});

 

В варианте 1 при 2х тасканиях:

1. Начало перетаскивания №1 - [55.8, 37.4]

2. Конец перетаскивания №1 - [154.53989149305553, 80.24318011557905]

3. Начало перетаскивания №2 (координаты должны быть = п.2) - [55.762851931823704, 37.32172241210934]

4. Конец перетаскивания №2 - [154.4861805555555, 80.277359803087]

т.е. возвращает непонятный какие-то цифры

Вариант 2

1. Начало перетаскивания №1 - [55.8, 37.4]

2. Конец перетаскивания №1 - [55.79999999999366, 37.39999999999996]

3. Начало перетаскивания №2 (координаты должны быть = п.2) - [55.77291637894876, 37.35468139648434]

4. Конец перетаскивания №2 - [55.77291637894244, 37.35468139648431] 

возвращает какое-то милиметровое смещение

 

Вариант 3

1. Начало перетаскивания №1 - [55.8, 37.4]

2. Конец перетаскивания №1 - [55.8, 37.4]

3. Начало перетаскивания №2 (координаты должны быть = п.2) - [55.730318189710175, 37.279150390624984]

4. Конец перетаскивания №2 - [55.730318189710175, 37.279150390624984]

возвращает начальные координаты, т.е. видимо model изменяется после события vertexdragend

2) Как можно изменить стиль отдельный вершин в ломаной, если задавать через опцию в конструкторе линии editorVertexLayout: то изменятся все вершины, а хочется менять каждую индивидуально. Ещё непонятно почему опции конструктора линии с префиксом editor не описаны в документации и нет никакого упоминания об этом.

3) В режиме рисовани новой вершины за курсором тянется линия, но если наводишь на другую вершину линия пропадает. Можно ли управлять этим поведением?

4) Если есть несколько линий у которых вершина в одной точке, то можно ли тащить (drag) одновременно вершины всех линий? На самом деле первым вопросом я эту задачу и решаю, но отбюросил визуальную часть, т.е. тащим вершину, по завершении (vertexdragend) перерисовываем все линии у которых вершина была в этой точке, но может можно всё-таки как-то решить более красиво.
2 комментария
Подписаться на комментарии к посту

1. Правильный путь - вариант 3, но то, что координаты не обновляются - это наша ошибка. Действительно получается, что событие бросается до обновления модели. Пока мы это будем исправлять, могу предложить один из следующих обходных путей.

-

setTimeout(function () {
    // ваши действия
}, 0); 


- Можно перевести пиксельные координаты вершины в гео координаты:
         

var vertex = event.get('target'),
                vertexCoords = vertex.geometry.getCoordinates(),
                zoom = geoMap.getZoom(),
                vertexGlobalPixels = vertex.options.get("projection").toGlobalPixels(vertexCoords, zoom),
                geoCoords = geoMap.options.get("projection").fromGlobalPixels(vertexGlobalPixels, zoom); 


Спасибо за багрепорт.

2. Описание префикса опций editor дано в геообъекте в описании параметра конструктора options, т.е. там же, где описаны опции геообъекта. Сами опции редактора в геообъекте не описаны, т.к. их набор динамический и зависит от текущей геометрии геообъекта. Через метод редактора getView() можно получить доступ к объекту отображения. У него есть методы доступа к коллекциям вершин (http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/geometryEditor.view.MultiPath.xml#getVertexPlacemarks например ). Коллекции выстроены иерархически вплоть до самих вершин и можно задавать опции как коллекциям, так и отдельным вершинам. Набор опций стандартный для геообъекта.

3. При наведении на вершины редактора ставить точки нельзя - таков дизайн. Нужно или удалить вершину, чтобы поставить новую точку, либо приблизить карту, для более детального редактирования. Есть опция drawOver - она позволяет ставить точки поверх других геообъектов на карте, но не вершин редактора.

4. Для этого нужно чтобы у разных вершин была одна и та же геометрия, чего пока нельзя сделать. Когда-то мы отказались от такой возможности посчитав ее не сильно полезной и в пользу общего упрощения архитектуры. Но как показывает практика, это довольно востребовано и в будущем, скорее всего, такое будет возможно. А пока надо синхронизировать разные геометрии.

добрался до кастомизации вершин ломаной (п.2) и что-то не понимаю как это сделать

добюрался до Placemark, а дальше не пойму что делать

var myPolyline = new ymaps.Polyline(line.coord, {}, {

...

, editorVertexLayout: ymaps.templateLayoutFactory.createClass('')

...

пишу в консолиmyPolyline.editor.getView().getVertexPlacemarks().get(0).options.getAll()Object {overlayFactory: s, interactivityModel: Object, zIndex: 740, zIndexHover: 741, zIndexDrag: 742…}
  1. draggable: true
  2. interactivityModel: Object
  3. overlayFactory: s
  4. zIndex: 740
  5. zIndexActive: 746
  6. zIndexDrag: 742
  7. zIndexHover: 741
  8. __proto__: Object
myPolyline.editor.getView().getVertexPlacemarks().get(0).properties.getAll()Object {model: o, vertexModel: o}
  1. model: o
  2. vertexModel: o
и не понимаю как мне добраться до свойства линии editorVertexLayout