Prechod rozhrania API máp Yandex 2.1
V tomto článku chcem začať sériu článkov o práci s rozhraním API Yandex.Maps. Dokumentácia Yandex.Maps je celkom úplná, ale stupeň fragmentácie informácií v nej je vysoký; keď prvýkrát zadáte dokumentáciu bez pol litra, nemôžete na to prísť a na vyriešenie problému môžete minúť veľa času hľadaním v dokumentácii a vo vyhľadávači. Táto séria článkov bude hovoriť o praktických riešeniach najbežnejších prípadov používania rozhrania API Yandex.Maps najnovšej verzie 2.1 v čase písania tohto článku.
Pri rozvrhnutí stránky do kontaktných informácií je často potrebné vložiť mapu, na ktorej bude vyznačená lokalita organizácie, pre ktorú je stránka vyvíjaná. V najjednoduchších prípadoch to môže byť len snímka obrazovky z online máp (alebo nie online):
Pre vložku interaktívna mapa možno použiť nástroj na tvorbu máp
https://tech.yandex.ru/maps/tools/constructor/ :
Ak potrebujeme pokročilejšie používanie máp (naše vlastné štítky, programový pohyb máp atď.), Potom na to musíme použiť rozhranie Yandex.Maps API: https://tech.yandex.ru/maps/jsapi/ . Ako príklad použitia máp sa tento článok bude zaoberať vytvorením mapy jednoduchým pridaním vlastného štítku a balónika.
Najprv prepojme komponenty API:
Ak sa pomocou máp vyvíja nejaká veľká aplikácia, je lepšie pripojiť komponenty API určitej verzie, aby sa pri aktualizácii API na strane Yandex vo výrobe nič neprerušilo:
Mapu bude potrebné umiestniť do nejakého bloku, napr div#mapa. Ďalej musí byť mapa vytvorená v tomto bloku (po spustení udalosti pripravenosti mapy a DOM):
ymaps.ready(init) ; function init() ( var myMap; myMap = new ymaps.Map ("mapa" , ( stred: [ 55,76 , 37,64 ] , priblíženie: 7 ) ) ); ) |
Tu uvádzame:
- identifikátor bloku mapa, kde vytvoríme mapu;
- stred— stred mapy označujúci šírku a zemepisnú dĺžku;
- priblížiť— faktor mierky mapy.
V predvolenom nastavení Yandex.Maps vytvára veľa nepotrebných prvkov, ktoré vo väčšine prípadov na webových stránkach nie sú potrebné. V podstate stačí na ovládanie a na správanie mapy použiť 2 podmienky:
- z prvkov mapy je prítomný iba posúvač priblíženia;
- mapa by sa nemala približovať posúvaním myši.
Aby sme splnili tieto požiadavky, dopĺňame kód:
ymaps.ready(init) ; function init() ( var myMap; myMap = new ymaps.Map ("mapa" , ( center: [ 55,76 , 37,64 ] , zoom: 13 , controls: ) ) ; myMap.behaviors .disable ("scrollZoom" ) ; myMap. ovládacie prvky .add ("zoomControl" , ( pozícia: ( hore: 15 , vľavo: 15 ) ) ) ; ) |
Tu máme zakázané scrollzoom a dodal "ovládanie zoomu" umiestnené z ľavého horného rohu.
Teraz musíme pridať štítok na mapu, pre článok stiahneme jeho obrázok z http://medialoot.com/item/free-vector-map-location-pins/ a umiestnime ho do kódu takto:
ymaps.ready(init) ; function init() ( var myMap; myMap = new ymaps.Map ("mapa" , ( center: [ 55.7652 , 37.63836 ] , zoom: 17 , controls: ) ) ; myMap.behaviors .disable ("scrollZoom" ) ); ovládacie prvky .add ("zoomControl" , (pozícia: ( hore: 15 , vľavo: 15) ) ); var myPlacemark = new ymaps.Placemark ([ 55.7649 , 37.63836 ] , ( ) , ( iconLayout: "default#image" , : , iconImageSize: [ 40 , 51 ] , iconImageOffset: [ - 20 , - 47 ] ) ); myMap.geoObjects .add (myPlacemark) ; ) |
Tu deklarujeme premennú myPlacemark, do ktorého zapíšeme značku, v prvom parametri ymaps.Značka miesta zadajte súradnice štítku a v treťom parametri:
- uviesť v iconLayoutže sa použije vlastný obrázok štítku;
- iconImageHref- cesta k obrázku;
- iconImageSize- určiť veľkosť obrázka;
- iconImageOffset- naznačíme posun z ľavého horného rohu obrázku do bodu obrázku, ktorým ukážeme na objekt, ktorý potrebujeme. Je to potrebné, aby sa pri zmene mierky mapy nezchýlila poloha štítku. Prečo je posun uvedený v záporných hodnotách - iba Boh pozná tvorcu API.
A cez myMap.geoObjects.add() pridať značku na mapu.
A teraz si vyrobíme balón, ktorý sa nám zobrazí po kliknutí na štítok mapy, rozloženie balóna a jeho obsah prevezmeme z http://designdeck.co.uk/a/1241
ymaps.ready(init) ; function init() ( var myMap; myMap = new ymaps.Map ("mapa" , ( center: [ 55.7652 , 37.63836 ] , zoom: 17 , controls: ) ) ; myMap.behaviors .disable ("scrollZoom" ) ); ovládacie prvky .add ("zoomControl" , (pozícia: (hore: 15, vľavo: 15) ) ) ; var html = " "; html += ""
; html +=" " ; var myPlacemark = new ymaps.Placemark ([ 55.7649 , 37.63836 ] , ( balloonContent: html ) , ( iconLayout: "default#image" , iconImageHref: "http://site/files/APIYaMaps1/min_marker.png", iconImageSize: [ 40 , 51 ] , iconImageOffset: [ - 20 , - 47 ] , balloonLayout: "default#imageWithContent" , balloonContentSize: [ 289 , 151 ] , balloonImageHref: "http://site/files/APIYaMaps1/min_popup.png", balloonImageOffset: [ - 144 , - 147 ] , balloonImageSize: [ 289 , 151 ] , balloonShadow: false ) ); myMap.geoObjects .add (myPlacemark) ; )"; html += " " ; html +="Záhrady Victoria Tower Gardens " ; html += "" ; html +="City of London " ; html += "" ; html += "Spojene kralovstvo " ; html +="020 7641 5264 " ; html +=" |
Sme tu:
- v balónObsah určiť obsah, ktorý sa zobrazí pri otvorení balónika;
- rozloženie balóna- určiť, že ako rozloženie balóna sa použije vlastný obrázok;
- balloonContentSize a balloonImageSize— veľkosti obsahu a obrázkov;
- balloonImageHref- cesta k obrázku;
- balloonImageOffset- odsadenie vzhľadom na ľavý horný roh;
- balón Tieň— vypnutie tieňa balóna (neovplyvní to nič s vlastnými obrázkami).
Kandidát na vydanie je verzia rozhrania API, ktorá je k dispozícii na verejné použitie, ale stále sa schvaľuje. Pred inštaláciou kandidáta na vydanie ako stabilnej verzie sa hneď po vydaní testuje na chyby, ktoré môžu viesť k degradácii funkčnosti API. Použitím kandidátov na vydanie vo svojich projektoch nám môžete pomôcť včas identifikovať potenciálne chyby. Fungovanie aplikácie môžete tiež vopred otestovať pomocou novej verzie rozhrania API.
Kandidáti na vydanie by sa mali používať v prostredí vývoja a testovania aplikácií. To vám pomôže vyhnúť sa chybám v produkčnom prostredí. Kandidáta na vydanie môžete povoliť takto:
If some time after publishing a release candidate no errors that lead to functionality degradation are found, the release candidate is installed as a stable version of the API and can be accessed via the link api-maps.yandex.ru/2.1.
Enabling the current version
When using your application, we recommend specifying the major version (i.e., do not specify the third number of the version). This guarantees that the current version, that is, the latest stable version of the corresponding major version, will be automatically enabled. For example, if you specify version 2.1, the latest available stable version 2.1.x will be enabled (for example, 2.1.47):
Enabling a set version
Although full compatibility is guaranteed between minor versions, in rare cases you may find that your client application does not work as intended when you enable the latest API version. To avoid these situations, in particularly crucial cases you may need to enable a specific API version. For that, specify its number in its entirety:
Note. If you use a set version, try regularly switching it to a newer version (for example, once every few months). The matter is that over time we can disable the minor version you are using in your project, and then the current version of the API will be enabled automatically. However, the version update might cause your app to stop working correctly. For this reason, we recommend that you keep track of API updates and switch to newer versions as soon as possible.
Summary table
The table below provides recommendations for enabling different versions of the API, depending on the type and complexity of your project.
Project type | ||
---|---|---|
Project type | Recommended version for running applications | Recommended version under development |
---|---|---|
Medium and large projects with a basic map | Latest version of to test the functionality. |
|
Medium and large projects with complex map features | Set version to test the functionality. |
|
Projects using the commercial version of the API | Set version (see the note below) |
Note. If you use a set version, try regularly switching it to a newer version. The matter is that over time we can disable the minor version you are using in your app, and then the current version of the API will be enabled automatically. However, the version update might cause your app to stop working correctly. For this reason, we recommend that you keep track of API updates and switch to newer versions as soon as possible.
Мы выпустили бета-версию API Яндекс.Карт 2.1 . Главная ее особенность - полный редизайн интерфейса карты. Причем изменения затронули не только внешний вид, но и поведение элементов управления картой. Поскольку изначально было понятно, что поломки обратной совместимости не избежать, мы также внесли архитектурные изменения, которые были необходимы для улучшения работы API (о них ближе к концу поста).
Что касается дизайна, нам было важно, чтобы интерфейс одинаково хорошо выглядел на устройствах и экранах разных размеров. Одна из основных сложностей заключается в том, что мы никогда не знаем заранее, как будет выглядеть сервис или сайт со встроенными картами. Поэтому при разработке редизайна нам нужно было постараться предусмотреть максимум вариантов.
Для решения наших задач мы решили в новой версии реализовать адаптивный дизайн интерфейса. На Yet another Conference дизайнер madhare и разработчик zloylos выступили с докладом о том, зачем нам понадобилась адаптивность и как именно мы ее реализовали в API . В этом посте я опишу предысторию и концепцию наших решений, расскажу о том, что еще нового появилось в версии 2.1-beta, а также о том, что еще изменится к релизу 2.1.
Зачем мы думаем о дизайне?
После релиза версии 2.0 мы уже писали пост , в котором рассказывали о нашем подходе к разработке API. Суть концепции заключается в том, что мы делаем продукт не только для разработчиков, но и для тех, кто будет пользоваться результатами их работы. Если человеку будет удобно и приятно пользоваться нашими картами, и он будет требовать от любимых сервисов именно их - это будет настоящий успех. При этом разработчикам тоже должно быть легко и приятно удовлетворять желания пользователей, а значит мы должны по-максимуму упростить их работу с API. С такими мыслями мы начали работу над версией 2.0, а новая 2.1-бета стала логичным продолжением этой же концепции.Исследование
Наблюдая за инсталляциями нашего API и анализируя кейсы использования карт, мы выделили два основных типа разработчиков:- Решают типовые задачи, не хотят тратить много времени, предпочитают готовые интерфейсы Яндекса. Таких примерно 90%.
- Решают нестандартные задачи или предпочитают даже типовые задачи решать по-своему. Им не подходят стандартные элементы управления. Нужна серьезная кастомизация карт. Логично, что это оставшиеся 10%.
Определившись с аудиториями, мы начали изучать кейсы использования. Оказалось, что в нашем случае основное значение имеет, как ни странно, размер. У нас получилось 3+1 варианта: маленькая, средняя, большая карта и мобильные сайты.
Рисуем дизайн для карт разных размеров
Самый тяжелый случай - маленькие карты. Кажется, что из-за маленького размера стоит убирать все элементы управления картой, но и терять функциональность тоже не хочется. Поэтому специально для маленьких карт мы сделали новый набор контролов:Также был добавлен новый элемент управления - «развернуть карту на весь экран». Он экономит место на сайте за счет размещения небольшой карты, а у конечного пользователя остается возможность посмотреть большую карту. Все нужное поведение карты запрограммировано уже на стороне API. Вообще идея этой кнопки родилась, когда мы думали о решении для мобильных устройств. Карта приемлемого размера на десктопе может стать совершенно бесполезной на мобильном. Фулскрин решает эту проблему:
Помимо этого изменился дизайн балунов для небольших размеров карт. Теперь на маленьких картах и экранах мобильных устройств стандартный балун заменяется на плашку внизу экрана. Это позволяет сохранить большую информативность карты для пользователей. При желании эту опцию можно отключить.
Со средними картами все гораздо проще. Поскольку есть, где развернуться:
Как и с большими картами:
Чтобы максимально упростить работу разработчиков при выборе элементов управления картой, мы сделали три готовых набора для разных размеров карты.
map.controls.add("default");
Список доступных ключей:
smallMapDefaultSet // для маленькой
mediumMapDefaultSet // для обычной
largeMapDefaultSet // для большой
Разумеется, по-прежнему можно самостоятельно указывать нужные контролы.
myMap.controls
.add("trafficControl") // пробки.add("searchControl") // поиск.add("zoomControl") // зум-контрол.add("typeSelector") // слои.add("geolocationControl") // геолокация.add("fullscreenControl") // фуллскрин
…
Адаптивность
Недостаточно просто отрисовать дизайн интерфейса для разных размеров карт. Ведь страницу с картой могут открывать на разных экранах. Именно поэтому решено было реализовывать адаптивное поведение интерфейсов карты. Различные элементы интерфейса перестраиваются и меняют свой размер в зависимости от фактического размера контейнера карты.Адаптивное поведение мы реализовали через control.Manager . Также его можно задавать и для тех кнопок и списков, которые вы создаете сами:
Работы по ускорению и оптимизации
Геообъект - это главная сущность на карте. За такой титул ему приходится расплачиваться довольно сложной и громоздкой структурой. Первая итерация работ над геообъектами заключалась в распределении нагрузки при их создании. Мы постарались вынести все подготовительные операции из конструктора геообъекта в места, где они действительно становятся нужны. Это дало очень хорошие результаты. Также в некоторых местах мы сделали ленивую инициализацию сущностей с помощью _defineGetter_ и defineProperty (_defineGetter_, кстати, немного быстрее). Мы сократили количество подписок на события геообъектов внутри нашей системы событий. Частично помог прием подписки сразу на группу геообъектов с последующим определением в обработчике целевого объекта. Здесь нужно признаться, что ускорение можно пощупать только на dom и canvas метках, новые svg метки нам предстоит дорабатывать (why we call it beta? Because it beta then nothing… ;)Во время работы у нас было время на небольшую уборку в коде, по ее результатам приведем микровыводы:
Микровывод 1. При передаче функции-обработчика намного выгоднее передавать отдельно функцию, отдельно контекст. Если у вас чешутся руки сделать bind сразу, подумайте, можете ли вы это себе позволить.
Микровывод 2. Сокращайте количество промежуточных массивов, объектов и анонимных функций. Они не всегда хорошо чистятся garbage collector-ом.
Прочие изменения
- В версии API 2.0 для определения местоположения по IP или с помощью Geolocation API разработчикам приходится самостоятельно использовать необходимые методы и обрабатывать полученный результат. В версии 2.1 достаточно просто добавить новый стандартный элемент управления:
control.GeolocationControl(parameters) Также был улучшен механизм определения местоположения пользователя, используемый в API. Теперь автоматически выбирается наиболее точный результат из браузерной геолокации и геолокации по IP-адресу. - Стандартные метки в API были перерисованы в SVG, а это значит, что им можно задавать произвольные цвета.
- Система пакетов в версии 2.1 будет ликвидирована. Интерфейсы API изменены таким образом, чтобы максимально вынести загрузку компонент API по требованию, для чего большинство отображений были переведены в асинхронный режим. Работы еще ведутся.
- Для такого масштабного обновления нам пришлось пожертвовать обратной совместимостью с версией 2.0. Также к официальному релизу версии 2.1 может сломаться обратная совместимость для некоторых частей бета-версии:
- Существенно изменится кластеризатор.
- Будет переписан map.action.Manager.
- Promises будут реализованы по
29 апреля 2014 года было объявлено, что новая версия API Яндекс.Карт 2.1 выходит из статуса беты и теперь Вы можете на неё безопасно переходить.
В нескольких ближайших заметках я планирую познакомить Вас с данной версией API.
Основные отличительные особенности JavaScript API Яндекс.Карт версии 2.1:
— новый адаптивный дизайн интерфейсов карты;
— мультимаршрутизатор — возможность построения всех возможных маршрутов вместо одного;
— модульная система API. Список всех модулей API приведен в справочнике.
— новый способ отображения объектов на карте, который позволяет создавать больше меток, чем в версии 2.0.
Подробную документацию по новой версии API Яндекс.Карт 2.1 можно прочитать .
Давайте рассмотрим простейший пример создания карты с использованием API Яндекс.Карт 2.1.
Вот его код:
Na úplnom začiatku pripájame API pre mapy na http://api-maps.yandex.ru/
Pozrime sa na možnosti podrobnejšie:
lang - nastavený dvoma parametrami language_region,
jazyk - dvojmiestny kód jazyka. Špecifikované vo formáte ISO 639-1.
región – dvojmiestny kód krajiny. Špecifikované vo formáte ISO 3166-1.
Na tento moment sú podporované nasledujúce miestne nastavenia:
lang=ru_RU;
lang=en_US;
lang=ru_UA;
lang=uk_UA;
lang=tr_TR.
Môžu sa použiť ďalšie možnosti:
coordorder – poradie, v ktorom sú geografické súradnice špecifikované vo funkciách API, ktoré akceptujú páry zemepisnej dĺžky a šírky ako vstup (napríklad značka miesta).
Možné hodnoty:
latlong - [zemepisná šírka, dĺžka] - používa sa predvolene;
longlat - [zemepisná dĺžka, šírka].
Predvolená hodnota: latlong.
load – zoznam modulov na načítanie.
Predvolená hodnota: package.full.
režim - režim načítania API.
mode=release – kód API je možné stiahnuť v zabalenej forme, aby sa minimalizovala návštevnosť a rýchlosť vykonávania v prehliadači;
mode=debug - režim sťahovania ako zdrojového kódu.
Predvolená hodnota: uvoľnenie.
Prečítajte si viac o možnostiach pripojenia
Pre zobrazenie mapy je určený kontajner nenulovej veľkosti, ako kontajner môže byť použitý ľubovoľný HTML element blokového typu, v príklade je to div.
Parametre mapy sa nastavujú v kóde:
myMap = new ymaps.Map('map', (
stred: , // stred mapy Nižný Novgorod
zoom: 12 - úroveň priblíženia
});
Mapa by mala byť vytvorená po načítaní celej webovej stránky. Tým sa zabezpečí, že kontajner pre mapu bol vytvorený a je možné k nemu pristupovať pomocou ID. Na inicializáciu mapy po načítaní stránky môžete použiť funkciu ready().
Funkcia ready sa zavolá po načítaní API a vygenerovaní DOM.
ymaps.ready(init);
funkcia init()(
// Vytvorte inštanciu mapy a naviažte ju na kontajner s
// dané id ("mapa").
myMap = new ymaps.Map('map', (
// Pri inicializácii mapy musíte zadať
// jeho stred a mierkový faktor.
centrum: , // Nižný Novgorod
priblíženie: 12
});
V predvolenom nastavení sa na mape zobrazujú všetky dostupné ovládacie prvky.
Typ mapy - schéma.
Rozhranie API poskytuje päť vstavaných typov máp:
Schéma (yandex#map) - predvolene;
satelit (yandex#satellite);
hybridný (yandex#hybrid);
Mapa ľudí (yandex#publicMap);
Hybrid národnej mapy (yandex#publicMapHybrid).
Príklad s určením typu mapy Satelit
Príklad kódu:
Ako som už povedal, predvolená sada ovládacích prvkov „mediumMapDefaultSet“ sa predvolene pridáva do mapy.
Aby ste do mapy pridali potrebné ovládacie prvky, môžete pri vytváraní mapy zadať zoznam zodpovedajúcich kľúčov v parametri ovládacích prvkov.
Tu je príklad kódu pre ovládacie prvky mierky a typu mapy.
Príklad kódu:
|
Správanie mapy je možné nastaviť pomocou parametra behaviors.
Nastavením jej hodnôt môžeme povoliť alebo zakázať rôzne možnosti správania mapy:
zmena mierky mapy dvojitým kliknutím na tlačidlo myši;
ťahanie mapy myšou alebo jedným dotykom;
zmena mierky mapy pri výbere oblasti ľavým tlačidlom myši;
zmena mierky mapy pomocou viacdotykového dotyku;
zmena mierky mapy pri výbere oblasti kliknite pravým tlačidlom myši myši;
meranie vzdialenosti;
priblíženie mapy kolieskom myši.
Príklad kódu so zakázaným priblížením kolieska myši.
|
Po vytvorení mapy je možné meniť jej parametre.
Zapnite priblíženie kolieskom myši
myMap.behaviors.enable("scrollZoom");
Vypnúť
myMap.behaviors.disable("scrollZoom");
Inštalácia nového typu máp Folk
myMap.setType('yandex#publicMap');
Nastavenie nového centra mapy
To je zatiaľ všetko.
Pokračovanie nabudúce…