Страницы

Поиск по вопросам

четверг, 13 июня 2019 г.

Переключение адресов на яндекс карте

Нашел такой пример кода из комментариев к вопросу - Плавное перемещение карты яндекс по клику
Подставил свои значения в data-goto = "Киев" и все перестало работать.
Вопрос как можно настроить переключение карты по клику на ссылку (адрес через data-goto) и как разместить кастомный маркер на карте с этим самым адресом?
Подозреваю что вывод маркера можно сделать как-то так
myPlacemark2 = new ymaps.Placemark(destinations['Киев'], { balloonContent: ...
Но что-то с destinations[data-goto] что-то никак не свяжу.
//Дождёмся загрузки API и готовности DOM. ymaps.ready(init); function init() { var result = document.getElementById('result'), // для отладки // в этой версии координаты просто элементы массива (и они поменяны местами) destinations = { 'Москва': [55.753559, 37.609218], 'Санкт-Петербург': [59.938531, 30.313497], 'Екатеринбург': [56.829748, 60.617435], 'Одесса': [46.466444, 30.7058] }, // Создание экземпляра карты и его привязка к контейнеру с // заданным id ("map"). myMap = new ymaps.Map('map', { // При инициализации карты обязательно нужно указать // её центр и коэффициент масштабирования. center: destinations['Москва'], // Москва zoom: 10 }); // все ок result.textContent = 'map init'; // куда скакать function clickGoto() { // город var pos = this.getAttribute('data-goto'); // или this.getAttribute('title') result.textContent = pos; // переходим по координатам myMap.panTo(destinations[pos], { flying: 1 }); return false; } // навешиваем обработчики var col = document.getElementsByClassName('goto'); for (var i = 0, n = col.length; i < n; ++i) { col[i].onclick = clickGoto; result.textContent = result.textContent + ' ' + i; } }

Перейти
Перейти
Перейти
Перейти

Так вообще не работает не кастомный значок не клик:
//Дождёмся загрузки API и готовности DOM. ymaps.ready(init); function init() { // в этой версии координаты просто элементы массива (и они поменяны местами) destinations = { 'Москва': [55.753559, 37.609218], 'Санкт-Петербург': [59.938531, 30.313497], 'Екатеринбург': [56.829748, 60.617435], 'Одесса': [46.466444, 30.7058] }, // Создание экземпляра карты и его привязка к контейнеру с // заданным id ("map"). myMap = new ymaps.Map('map', { center: destinations['Москва'], zoom: 10, controls: [] }); // куда скакать function clickGoto() { // город var pos = this.getAttribute('data-goto'); // или this.getAttribute('title') result.textContent = pos; // переходим по координатам myMap.panTo(destinations[pos], { flying: 1 }); return false; } // навешиваем обработчики var col = document.getElementsByClassName('goto'); for (var i = 0, n = col.length; i < n; ++i) { col[i].onclick = clickGoto; result.textContent = result.textContent + ' ' + i; } var myPlacemark = new ymaps.Placemark(destinations['Москва'], { }, { iconImageHref: 'map-icon.png', iconImageSize: [79, 96], iconImageOffset: [0, -50], }); /* Добавляем */ myMap.geoObjects .add(myPlacemark); }
Перейти
Перейти
Перейти
Перейти

Помогите пожалуйста в решении проблемы!!!
Заранее не известны все адреса, редактироваться будут только через data атрибут а не через скрипт, поэтому прописывать вручную все адреса в destinations нет смысла.
Вообщем есть ссылки с адресами типа строки, карта. Как осуществить отображение нужного адреса на карте по клику на ссылку с этим самым адресом?


Ответ

Необходимо добавить Киев с массив destination, чтобы иметь возможность переходить на него В API 2.0 несколько другой способ добавления маркеров Привести в порядок атрибуты href для ссылок не помешает.
Минимально модифицировав ваш код, получилось так:
//Дождёмся загрузки API и готовности DOM. ymaps.ready(init); function init() { var result = document.getElementById('result'), myMap = new ymaps.Map('map', { center: [55.753559, 37.609218], // Москва zoom: 12 }); // все ок result.textContent = 'map init'; // куда скакать function clickGoto() { // город var city = this.getAttribute('data-goto'); // или this.getAttribute('title') result.textContent = city; // получение координат по адресу - асинхронная функция var myGeocoder = ymaps.geocode(city); myGeocoder.then( function(res) { coords = res.geoObjects.get(0).geometry.getCoordinates(); // переходим по координатам myMap.panTo(coords, { flying: 1 }); // добавляем маркер var placeMark = new ymaps.Placemark(coords, { balloonContent: city }); myMap.geoObjects.add(placeMark); }, function(err) { alert('Ошибка'); } ); return false; } // навешиваем обработчики var col = document.getElementsByClassName('goto'); for (var i = 0, n = col.length; i < n; ++i) { col[i].onclick = clickGoto; result.textContent = result.textContent + ' ' + i; } }

Россия, Москва, Красная площадь, 1
Украина, Киев, улица Крещатик, 1/2
Россия, Свердловская область, Екатеринбург, проспект Ленина, 1
Украина, Одесса, Приморский бульвар, 1

В идеале - хранить инфо о том, какие маркеры уже созданы, чтобы не создавать их снова, но вроде бы yandex их не дублирует.

Комментариев нет:

Отправить комментарий