Клуб API Карт

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

Диман Миронов
29 мая 2013, 10:32

На карте есть кнопка "Добавить метку". При клике на карту, если кнопка нажата, в этом месте добавляется Маркер, координаты беру так event.get('coords').

Проблема в том, что при перемещение карты начинает сдвигаться иконка маркера. Если масштаб большой, то Маркер добавляется не в то место.

 

Подскажите как правильно взять координаты на карте!

 

15 комментариев
Подписаться на комментарии к посту
Вообще говоря, не надо ставить метки на карту, если карта в этот момент движется. Зачем вам такой функционал?
Диман Миронов
29 мая 2013, 10:39

Наверное, я не совсем понятно объяснил. Карта в этот момент не движется.

 

Проблема 1. Создаем метку по клику на карте, центр определяем как event.get('coords'), метка ставтся не в то место, куда мы нажали. (Чем больше масштаб, тем больше разница).

Проблема 2. Создаем метку как в 1 проблеме, немного перетаскиваем карту. При этом метка движется вместе с картой.

 

Все эти проблемы изчезают при обновление страницы (координаты добавляются в базу, при обновление происходит НЕ динамическое добавление Маркеров)

Вы описываете что-то очень странное. Покажите, пожалуйста, страницу с примером.
Диман Миронов
29 мая 2013, 10:47

Надеюсь не будет рекламой https://vk.com/app3654648

Нужно нажать кнопку "Добавить площадку", кликнуть по карте, заполнить форму и попробовать дальше работать с картой.

Кажется, это артефакт вставки карты в iframe, если открыть отдельно URL iframe-а, то метки стоят правильно.
Попробуем что-нибудь сделать в следующем релизе.
Диман Миронов
29 мая 2013, 10:52

Очень жаль, спасибо!

Диман Миронов
29 мая 2013, 11:05

За правкой этого артефакта можно как-то проследить? Что бы знать, когда это поправится.

 

Пока ничего не могу сказать.
Всеволод Шмыров
29 мая 2013, 13:23

Ошибка актуальная? Я подебажил ваш код - в e.get('coords') нормальные данные, далее они сохраняются в два скрытых input. От туда видимо раньше попадали непосредственно в геообъект, но сейчас создается массив position из значений этих input и вызывается обновление страницы. Данные в position тоже корректные. Можете скинуть код, который был вместо обновления страницы - непосредственно создание геообъекта.

Диман Миронов
29 мая 2013, 22:51

Данные нормальные, это было понятно. Пришлось делать через обновление, для устранения катаклизмов.

 

Код был следующий, это функция добавления новой метки

getMarkForNotValidPlayground: function(playground) {

    return new ymaps.Placemark(

        [playground.latitude, playground.longitude], {

            balloonContent: 'Площадка №' + playground.id + ' ожидает проверки'

         }, {

             preset: 'twirl#orangeDotIcon'

         });

 

параметр playground приходил из базы, после сохранения данных

Что то больше сейчас уже сложно будет раскопать.


P.S. Эта функция так же используется для создания меток (желтых) при обновление страницы.

Всеволод Шмыров
30 мая 2013, 00:03
>> параметр playground приходил из базы, после сохранения данных
А данные корректно возвращаются ? Ну просто я проследил координаты по сути до отправки на сервер.
Диман Миронов
30 мая 2013, 08:15

Уверен, что нормально, потому что при обновление страницы (тут он уже берется из базы) маркер ставился на свое место, туда, куда нажали. Постараюсь сегодня воиспроизвести и написать результат.

Аналогичная проблема. Создаю приложение для такси, где на карте должны быть видны метки(заказы). В режиме реального времени заказы, то есть метки, некоторые пропадают(заказ взят или удален), и могут появляться новые - новый заказ. Работает через ajax. Если писать код:

myPlacemark[arr[i]] = new ymaps.Placemark([arr3[i]], {balloonContentBody: arr2[i]});

myMap.geoObjects.add(myPlacemark[arr[i]]);

то точка создается ровно в середине экрана, а не по тем координатам что передаются, и при смещении карты точка смещается в середину экрана. А вот интересный момент: Узнаю содержимое arr[i], допустим оно равно 55.696352,37.800631

Меняю чуток код:

myPlacemark[arr[i]] = new ymaps.Placemark([55.696352,37.800631], {balloonContentBody: arr2[i]});

myMap.geoObjects.add(myPlacemark[arr[i]]);

И вот оно - все работает как надо. То есть получается - если координаты писать статические - все норм, если передавать в переменной - то эта проблема выскакивает. Второй день уже мучаюсь.... :(

Помогите плиз, если кто сталкивался с данной проблемой и решил ее....

а есть ссылка на ваш проект с этим кодом?

Решил проблему))))

Дело вот в чем.... Код был приблизительно такой:

coords = "11.11, 22.22";

myPlacemark = new ymaps.Placemark([coords], {balloonContentBody: "Коммент"});

И не работало..... Стало работать когда переписал код таким образом:

coords = [11.11, 22.22];

myPlacemark = new ymaps.Placemark(coords, {balloonContentBody: "Коммент"});

Но как только вписал весто 11.11, 22.22 координаты, полученные ajaxom - опятьперестало работать.

Проблему решил так: Полученные ajaxом коры разбил, разделив широту от долготы, оба значения умножил на 1, чтоб стали float, и уже потом собрал переменную coords = [x, y];

И все заработало.

Спасибо за попытку помочь :)