В предыдущей заметке, я рассказывал о том, как можно добавить Яндекс Панорамы на свой сайт.
В этой заметке я покажу интересный пример совместного использования API Яндекс.Карт и панорам.
Этот выпуск выходит в день открытия олимпиады в Сочи, поэтому для примера я использовал олимпийские объекты.
А также небольшую видео инструкцию.
В начале нужно провести сбор необходимых данных и сформировать из них файл в формате JSON.
Вот как выглядит фрагмент файла для одной метки:
{ "title": "Ледовый дворец Большой", "address": "Имеретинская низменность, Олимпийский парк", "panarama": "http://panoramas.api-maps.yandex.ru/embed/1.x/?lang=ru_RU&l=stv&ll=39.95093622%2C43.40308599&ost=dir%3A-38.30346628196356%2C0~spn%3A89.99999987427145%2C55.35115233836648", "lat": "43.404408", "lng": "39.950054" } |
Поясню значение переменных:
title — название объекта;
address — адрес;
lat и lng — координаты метки;
panarama — код панорамы.
Давайте рассмотрим как формировать ссылку для панорамы.
Мы заходим на сервис Яндекс.Карты http://maps.yandex.ru
Находим на карте нужное место, включаем отображение панорам.
Выбираем необходимый ракурс и получаем код панорамы.
Он имеет следующий вид:
<script src="http://panoramas.api-maps.yandex.ru/embed/1.x/?lang=ru_RU&l=stv&ll=39.721906%2C43.58674474&ost=dir%3A118.19604431016373%2C0~spn%3A89.99999987427145%2C55.35115233836648&size=685%2C370"></script> |
Для нашего файла мы берем только код аргумента src без размеров &size=685%2C370.
Т. е. для приведенного примера:
http://panoramas.api-maps.yandex.ru/embed/1.x/?lang=ru_RU&l=stv&ll=39.721906%2C43.58674474&ost=dir%3A118.19604431016373%2C0~spn%3A89.99999987427145%2C55.35115233836648 |
Когда мы создали файл с данными, пишем код вывода карту:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Олимпиада в Сочи 2014 - олимпийские объекты+виртуальная прогулка</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script> <script src="http://yandex.st/jquery/1.8.2/jquery.min.js" type="text/javascript"></script> <style> #shopconteyner{ width: 100%; } #markers{ float:left; width: 400px; } #map{ margin-left: 500px; width: 700px; height: 400px; } #panarama{ margin-left: 40%; width: 700px; height: 400px; } </style> <script type="text/javascript"> ymaps.ready(init); var myMap, myCollection; function init () { myMap = new ymaps.Map("map", { center: [43.585278, 39.720278], zoom: 10 }); myCollection = new ymaps.GeoObjectCollection(); myMap.controls .add("zoomControl") .add("mapTools") .add('typeSelector'); $.getJSON("data.json", function(json){ var src_res = ""; for (i = 0; i < json.places.length; i++) { var sch = i+1; //console.log(json.places[i].lat+" "+json.places[i].lng); var placemark = new ymaps.Placemark([json.places[i].lat,json.places[i].lng], { iconContent: sch, balloonContentHeader: '<div style="color:#ff0303;font-weight:bold">'+json.places[i].title+'</div>', balloonContentBody: '<div style="font-size:13px;"><div><strong>Адрес:</strong> '+json.places[i].address+'<br></div></div>' }, { // Опции preset: 'twirl#nightStretchyIcon' // иконка растягивается под контент }); myCollection.add(placemark); src_res=src_res+'<p>'+sch+'. '+'<a href="#" onClick="return go_to('+json.places[i].lat+', '+json.places[i].lng+", '"+json.places[i].title+"', '"+json.places[i].address+"', '"+json.places[i].panarama+"', "+sch+");"+'\">'+json.places[i].title+'</a>'; } $('#markers').html(src_res); myMap.geoObjects.add(myCollection); myMap.setBounds(myCollection.getBounds()); }); } function go_to(lat,lon,title,address,panarama,id){ myMap.setCenter([lat,lon], 16); var url = panarama+"&size=700%2C400"; $('#panarama').html(''); var s = document.createElement('script'); s.setAttribute('src', url); document.getElementById('panarama').appendChild(s); myMap.geoObjects.remove(myCollection); var placemark = new ymaps.Placemark([lat, lon], { iconContent: id, balloonContentHeader: '<div style="color:#ff0303;font-weight:bold">'+title+'</div>', balloonContentBody: '<div style="font-size:12px;"><strong>Адрес:</strong> '+address+'</div>' }, { // Опции preset: 'twirl#nightStretchyIcon' }); // Добавляем метку на карту myMap.geoObjects.add(placemark); placemark.balloon.open(); return false; } </script> </head> <body> <div id="shopconteyner"> <div id="markers"></div> <div id="map"></div> <div id="panarama"></div> </div> </body> </html> |
Разберем что здесь.
В начале определяем начальные параметры карты и добавляем элементы управления.
Далее загружаем данные из файла data.json.
Добавляем метки в коллекцию, а саму коллекцию на карту.
Формируем меню.
src_res=src_res+'<p>'+sch+'. '+'<a href="#" onClick="return go_to('+json.places[i].lat+', '+json.places[i].lng+", '"+json.places[i].title+"', '"+json.places[i].address+"', '"+json.places[i].panarama+"', "+sch+");"+'\">'+json.places[i].title+'</a>'; |
При клику по ссылке вызывается функция go_to в неё передаются параметры.
Карта центрируется по метке, балун открывается.
В область под картой мы добавляем javascript с панорамой.
var url = panarama+"&size=700%2C400"; $('#panarama').html(''); var s = document.createElement('script'); s.setAttribute('src', url); document.getElementById('panarama').appendChild(s); |
В этом коде мы добавляем размер области, в которую добавляем панораму.
А затем к div с id=”panarama” добавляем код.
При клике по другой ссылке, отображается новая панорама.
Загрузить архив с файлами примера.
Надеюсь, что данный пример пригодиться Вам!