В этой заметке я хочу продолжить изучение новой версии API Яндекс.Карт 2.1, начало смотрите здесь.
А здесь я рассажу о работе с метками и группами меток и геокодировании, на примере создания карты фотографий из сервиса Instagram.
Пример работает так, Вы заходите на страницу с картой и в поле поиска вводите любой адрес, для данного адреса в радиусе от 1 до 5 километров на карту загружаются фотографии из Интаграм.
Рядом с картой также отображаются, найденные фото.
Теперь давайте рассмотрим код.
Для своего примера я использовал библиотеку Bootstrap.
И в самом начале код станицы имел следующий вид:
<!DOCTYPE html> <html lang="ru" > <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Фото Instagram на Яндекс.Карте</title> <link rel="nofollow" href="http://yandex.st/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet"> <script src="http://yandex.st/jquery/1.8.0/jquery.min.js"></script> <script src="http://yandex.st/bootstrap/3.1.1/js/bootstrap.min.js"></script> <style> body, html { padding:0; margin: 0; width: 100%; height: 100%; } body { padding-top: 50px; } .custom-search-form{ margin-top:5px; } </style> </head> <body> <div class="navbar navbar-inverse navbar-fixed-top" role="navigation"> <div class="container"> <div class="navbar-header"> <a class="navbar-brand" href="#">Instagram на Яндекс.Карте</a> </div> <div class="collapse navbar-collapse"> <div class="col-lg-3"> <div class="input-group custom-search-form"> <input type="text" class="form-control" name="search_address"> <span class="input-group-btn"> <button id="searchmap" class="btn btn-default" type="button"> <span class="glyphicon glyphicon-search"></span> </button> </span> </div><!-- /input-group --> </div> </div> </div><!--/.nav-collapse --> </div> </div> <div class="container"> <div class="row"> <div class="col-xs-6"> </div> <div class="col-xs-6"> <div id="add_img" class="row"> </div> </div> </div> </div><!-- /.container --> </body> </html> |
Далее я добавил Яндекс.Карту в левую часть страницы.
Это код:
<script type="text/javascript"> var myMap; // Дождёмся загрузки API и готовности DOM. ymaps.ready(init); function init () { // Создание экземпляра карты и его привязка к контейнеру с // заданным id ("map"). myMap = new ymaps.Map('map', { // При инициализации карты обязательно нужно указать // её центр и коэффициент масштабирования. center: [56.326944, 44.0075], // Нижний Новгород zoom: 12, controls: ['zoomControl', 'typeSelector'] }); } </script> |
и код вывода div для карты
<div id="map" style="width: 100%; height: 800px;"></div> |
Также нужно подключить API Яндекс.Карт 2.1. строкой:
<script src="http://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script> |
Теперь нам нужно преобразовать адрес из формы поиска в географические координаты.
Это делает следующий код:
$("#searchmap").click(function () { var address = $('input[name="search_address"]').val(); ymaps.geocode(address, {results: 1 }).then(function (res) { var firstGeoObject = res.geoObjects.get(0), // Координаты геообъекта. coord_lat = firstGeoObject.geometry.getCoordinates()[0], coord_lon = firstGeoObject.geometry.getCoordinates()[1], // Область видимости геообъекта. bounds = firstGeoObject.properties.get('boundedBy'); alert(coord_lat+' '+coord_lon); myMap.setBounds(bounds, { checkZoomRange: true // проверяем наличие тайлов на данном масштабе. }); }); }); } |
Здесь по клику на кнопке в форме поиска, мы получаем значение адреса в строке:
var address = $('input[name="search_address"]').val(); |
А затем формируем запрос к геокодеру Яндекса, из ответа берем один самый первый результат.
ymaps.geocode(address, {results: 1 }) |
Получаем найденый объект
var firstGeoObject = res.geoObjects.get(0) |
Определяем значения координат:
coord_lat = firstGeoObject.geometry.getCoordinates()[0], coord_lon = firstGeoObject.geometry.getCoordinates()[1] |
Определяем область видимости геообъекта и масшабируем карту:
bounds = firstGeoObject.properties.get('boundedBy'); myMap.setBounds(bounds, {checkZoomRange: true }); |
Теперь, когда мы проверили, что все хорошо работает, нужно передать координаты в скрипт zapros.php, который используя API Instagram будет посылать запрос сервису и получать ответ от него.
Код файла zapros.php:
Рассмотрим код файла подробнее.
Первое, что нам понадобиться — это получить значение CLIENT_ID для нашего сайта.
Чтобы получить CLIENT ID нужно зайти на сайт разработчиков Instagram Developer Documentation.
Автроризоваться через Ваш аккаунт в Instagram.
Далее нажать на кнопку "Управлять программами".
В форме Developer SignUp ввести значения:
You website: url Вашего сайта;
Phone number: номер телефона;
What do you want to bulid with the API? Для чего Вы используете API Instagram.
Согласится с условиями использования и нажать кнопку "Регистрация"
Снова нажать на кнопку "Управлять программами".
Появилось сообщение, что Вы еще не зарегистрировали программы с API Instagram.
Нажимаем на кнопку "Регистрация новой программы".
В появившейся форме нужно в полях ввести название приложения латинскими буквами, описание и адрес сайта.
После нажатия на кнопку "Regisre", появятся данные для Вашего приложения, в том числе и CLIENT ID.
Далее все просто.
Мы формируем запрос к сервису и отправляем его, используя встроенную в php библиотеку Curl.
Полученный ответ в формате JSON, выводим с помощью оператора echo.
Теперь нам нужно получить данные из файла zapros.php, сформировать из них коллекцию меток и добавить ее на карту.
Коллекцию меток мы создаем в строке:
var myCollection = new ymaps.GeoObjectCollection({}, {preset: 'islands#redIcon'}); |
Часть кода preset: ‘islands#redIcon’ задает стиль для всех меток коллекции.
Вот код который, с использованием технологии AJAX, посылает значение координат файлу zapros.php и из ответа в формате JSON формируются метки, которые добавляются в коллекцию.
Перед тем, как добавлять метки, мы удаляем все из коллеекции
myCollection.removeAll(); |
Затем мы добавляем коллекцию на карту
myMap.geoObjects.add(myCollection); |
И устанавливаем отображение карты так, чтобы были видны все метки
myMap.setBounds(myCollection.getBounds()); |
В данном варианте я использовал стандартные метки.
Можно использовать свой значок для обозначения меток на карте.
Нужно изменить несколько строк кода:
var myCollection = new ymaps.GeoObjectCollection(); |
И код формирования меток:
myCollection.add(new ymaps.Placemark([json.data[i].location.latitude,json.data[i].location.longitude], { balloonContent: '<strong>'+json.data[i].location.name+'</strong><br /><a href="'+json.data[i].link+'" target="_blank"><img src="'+json.data[i].images.thumbnail.url+'" /></a>'}, { iconLayout: 'default#image', iconImageHref: 'instagram-icon-map.png', iconImageSize: [30, 30], iconImageOffset: [-15, -15] })); |
Здесь после задания содержимого балуна, мы задаем параметры отображения значка метки:
обозначение иконки — iconLayout;
файл с изображением — iconImageHref;
размер значка иконки в пикселях — iconImageSize;
смещение от точки привязки — iconImageOffset.
Как видите, у нас получился хороший рабочий пример, который можно дорабатывать и дополнять новым функционалом.