Клуб API Карт

Как сделать, чтобы координаты метки обновлялись?

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

Есть такой код:

 

 Код

 ВвеYMaps.Events.observe(map, map.Events.Click, function (map, mEvent) {
var geocoder = new YMaps.Geocoder(mEvent.getGeoPoint() // Преобразовываем координаты в адрес
YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
var adres = geocoder.get(0).text;
var geoPlacemark = new YMaps.Placemark(mEvent.getGeoPoint(), {style: "default#bluePoint"} // Задаем координаты и стиль метки
geoPlacemark.setIconContent("Метка"); // содержимое метки
geoPlacemark.name = "Заголовок объявления"; // Устанавливает содержимое балуна
geoPlacemark.description = "Краткое описание или картинка";
map.addOverlay(geoPlacemark);
map.openBalloon(mEvent.getGeoPoint(), adres);
}
}

 

 

Все работает, при каждом клике устанавливается новая метка, а старая остаётся.

Что нужно добавить в код, чтобы старая метка удалялась и устанавливалась новая (при каждом клике мышкой).

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

уберите код под врезку

Простите, я не понял, что вы имели ввиду...

 

нужно отредактировать пост

код надо вставлять с помощью кнопки "врезка"

 подробнее 

Готово!

Но все таки, что нужно добавить в код?

вынесите обЪявление geoplacemark из обработчика

а в обработчике сначала удаляйте его с карты

 

var geoPlacemark; // Это значит вынести объявление переменной из обработчика

YMaps.Events.observe(map, map.Events.Click, function (map, mEvent) {
            var geocoder = new YMaps.Geocoder(mEvent.getGeoPoint()); // Преобразовываем координаты в адрес
            YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
            var adres = geocoder.get(0).text;
            map.openBalloon(mEvent.getGeoPoint(), adres);
            map.removeOverlay(geoPlacemark);
            });

// Тут уже использовать без "var"

geoPlacemark && map.removeOverlay(geoPlacemark);

            geoPlacemark = new YMaps.Placemark(mEvent.getGeoPoint(), {style: "default#bluePoint"}); // Задаем координаты и стиль метки
            geoPlacemark.setIconContent("Метка"); // содержимое метки
            geoPlacemark.name = "Заголовок объявления"; // Устанавливает содержимое балуна
            geoPlacemark.description = "Краткое описание или картинка";
            map.addOverlay(geoPlacemark);
            });

 

var geoPlacemark;
            YMaps.Events.observe(map, map.Events.Click, function (map, mEvent) {
            var geocoder = new YMaps.Geocoder(mEvent.getGeoPoint()); // Преобразовываем координаты в адрес
            YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
            var adres = geocoder.get(0).text;
            map.openBalloon(mEvent.getGeoPoint(), adres);
            map.removeOverlay(geoPlacemark);
            });

            geoPlacemark && map.removeOverlay(geoPlacemark);
            geoPlacemark = new YMaps.Placemark(mEvent.getGeoPoint(), {style: "default#bluePoint"}); // Задаем координаты и стиль метки
            geoPlacemark.setIconContent("Метка"); // содержимое метки
            geoPlacemark.name = "Заголовок объявления"; // Устанавливает содержимое балуна
            geoPlacemark.description = "Краткое описание или картинка";
            map.addOverlay(geoPlacemark);
            });

 

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

Нужно чтобы последняя метка оставалась на карте и её координаты можно было передать серверу.

Дело в том, что мне бы хотелось реализовать следующую схему:

пользователь отмечает кликом мыши метку на карте при подаче объявления, а затем координаты этой метки передаются серверу и заносятся в базу данных к этому объявлению. Затем на странице просмотра его объявления эти координаты будут вставлены на карту (на странице просмотра объявления).

Вот так вроде работает:

 

var geoPlacemark;
            map.removeOverlay(geoPlacemark);
            YMaps.Events.observe(map, map.Events.Click, function (map, mEvent) {
            var geocoder = new YMaps.Geocoder(mEvent.getGeoPoint()); // Преобразовываем координаты в адрес
            YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
            var adres = geocoder.get(0).text;
            geoPlacemark = new YMaps.Placemark(mEvent.getGeoPoint(), {style: "default#bluePoint"}); // Задаем координаты и стиль метки
            geoPlacemark.setIconContent(adres); // содержимое метки
            geoPlacemark.name = "Заголовок объявления"; // Устанавливает содержимое балуна
            geoPlacemark.description = "Краткое описание или картинка";
            map.addOverlay(geoPlacemark);
            });

            geoPlacemark && map.removeOverlay(geoPlacemark);
            geoPlacemark = new YMaps.Placemark(mEvent.getGeoPoint(), {style: "default#bluePoint"}); // Задаем координаты и стиль метки
            geoPlacemark.setIconContent(adres); // содержимое метки
            geoPlacemark.name = "Заголовок объявления"; // Устанавливает содержимое балуна
            geoPlacemark.description = "Краткое описание или картинка";
            map.addOverlay(geoPlacemark);
            });

 

Только какую переменную передать (с координатами последней метки)?

Как сделать, чтобы карта смещалась для того, чтобы метка была всегда на виду?

 

Только какую переменную передать (с координатами последней метки)?

не понял вопроса

 

Как сделать, чтобы карта смещалась для того, чтобы метка была всегда на виду?

map.setCenter(mEvent.getGeoPoint())

Спасибо вам большое за помощь!

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

 

var geoPlacemark;
            map.removeOverlay(geoPlacemark);
            YMaps.Events.observe(map, map.Events.Click, function (map, mEvent) {
            var geocoder = new YMaps.Geocoder(mEvent.getGeoPoint()); // Преобразовываем координаты в адрес
            YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
            var adres = geocoder.get(0).text;
            });

            geoPlacemark && map.removeOverlay(geoPlacemark);
            geoPlacemark = new YMaps.Placemark(mEvent.getGeoPoint(), {style: "default#bluePoint"}); // Задаем координаты и стиль метки
            geoPlacemark.setIconContent(adres); // содержимое метки
            geoPlacemark.name = "Заголовок объявления"; // Устанавливает содержимое балуна
            geoPlacemark.description = "Краткое описание или картинка";
            map.addOverlay(geoPlacemark);
            });

 

Как это исправить?

кажется я вам уже говорил что обработчик ответа геокодера отработает позже чем код который идет непосредственно за ним

И что значит никак не решить данный вопрос?

можно перенести код создания метки в обработчик геокодера

Ну да, вот так вроде работает..

 

var geoPlacemark;
            map.removeOverlay(geoPlacemark);
            YMaps.Events.observe(map, map.Events.Click, function (map, mEvent) {
            var geocoder = new YMaps.Geocoder(mEvent.getGeoPoint()); // Преобразовываем координаты в адрес
            YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
            var adres = geocoder.get(0).text;
            map.openBalloon(mEvent.getGeoPoint(), "Эта метка с адресом будет указана на карте, при просмотре вашего объявления.
Чтобы переместить метку - кликните мышкой в новом месте на карте.");
            geoPlacemark && map.removeOverlay(geoPlacemark);
            geoPlacemark = new YMaps.Placemark(mEvent.getGeoPoint(), {style: "default#bluePoint"}); // Задаем координаты и стиль метки
            geoPlacemark.setIconContent(adres); // содержимое метки
            geoPlacemark.name = "Заголовок объявления"; // Устанавливает содержимое балуна
            geoPlacemark.description = "Краткое описание или картинка";
            map.addOverlay(geoPlacemark);
            });
            });