Tranzicioni i hartave Yandex api 2.1
Në këtë artikull, unë dua të filloj një seri artikujsh për të punuar me API Yandex.Maps. Dokumentacioni Yandex.Maps është mjaft i plotë, por shkalla e fragmentimit të informacionit në të është e lartë, kur futni dokumentacionin për herë të parë pa gjysmë litri, nuk mund ta kuptoni dhe për të zgjidhur një problem, mund të shpenzoni një shumë kohë duke kërkuar nëpër dokumentacion dhe në një motor kërkimi. Kjo seri artikujsh do të flasë për zgjidhje praktike për rastet më të zakonshme të përdorimit të API-së Yandex.Maps të versionit 2.1 më të fundit, në kohën e këtij shkrimi.
Kur vendosni një faqe në informacionin e kontaktit, shpesh është e nevojshme të futni një hartë në të cilën do të shënohet vendndodhja e organizatës për të cilën po zhvillohet siti. Në rastet më të thjeshta, kjo mund të jetë vetëm një pamje e ekranit nga hartat në internet (ose jo në internet):
Për futje harta interaktive mund të përdoret ndërtuesi i hartave
https://tech.yandex.ru/maps/tools/constructor/:
Nëse kemi nevojë për një përdorim më të avancuar të hartave (etiketat tona, lëvizja programore e hartave, etj.), Atëherë për këtë duhet të përdorim API-në Yandex.Maps: https://tech.yandex.ru/maps/jsapi/ . Si shembull se si të përdoren hartat, ky artikull do të shikojë krijimin e një harte me shtimin e thjeshtë të një etikete dhe tullumbace të personalizuar.
Së pari, le të lidhim komponentët e API:
Nëse një aplikacion i madh po zhvillohet duke përdorur harta, atëherë është më mirë të lidhni përbërësit API të një versioni të caktuar në mënyrë që kur përditësoni API në anën Yandex, asgjë të mos prishet në prodhim:
Harta do të duhet të vendoset në një bllok, për shembull në div# hartë. Më pas, harta duhet të krijohet në këtë bllok (pasi të aktivizohet ngjarja e gatishmërisë së hartës dhe DOM):
ymaps.ready(init) ; funksioni init() (var myMap; myMap = new ymaps.Map ("hartë" , ( qendër: [ 55.76 , 37.64 ] , zmadhimi: 7 ) ) ;) |
Këtu tregojmë:
- identifikues blloku harta, ku do të krijojmë një hartë;
- qendër- qendra e hartës që tregon gjerësinë dhe gjatësinë;
- zmadhimi— faktori i shkallës së hartës.
Si parazgjedhje, Yandex.Maps krijon shumë elementë të panevojshëm, të cilët në shumicën e rasteve nuk nevojiten në faqet e internetit. Në thelb, mjafton të aplikoni 2 kushte për kontrollet dhe për sjelljen e hartës:
- nga elementët e hartës, është i pranishëm vetëm rrëshqitësi i zmadhimit;
- harta nuk duhet të zmadhohet me lëvizjen e miut.
Për të përmbushur këto kërkesa, ne plotësojmë kodin:
ymaps.ready(init) ; funksioni init() ( var myMap; myMap = new ymaps.Map ("hartë" , ( qendër: [ 55.76 , 37.64 ] , zmadhimi: 13 , kontrollet: ) ) ; myMap.behaviors .çaktivizoj ("scrollZoom" ) ; myMap. kontrollet .add ("zoomControl" , ( pozicioni: ( lart: 15 , majtas: 15 ) ) ;) |
Këtu kemi paaftë zmadhimi lëviz dhe shtoi "kontrolli i zmadhimit" pozicionuar nga këndi i sipërm majtas.
Tani duhet të shtojmë një etiketë në hartë, për artikullin do të shkarkojmë imazhin e saj nga http://medialoot.com/item/free-vector-map-location-pins/ dhe do ta vendosim në kod si më poshtë:
ymaps.ready(init) ; funksioni init() (var myMap; myMap = new ymaps.Map ("harta" , ( qendër: [ 55.7652 , 37.63836 ] , zmadhimi: 17 , kontrollet: ) ) ; myMap.behaviors .çaktivizoj ("scrollZoom;) kontrollet .add ("zoomControl" , ( pozicioni: ( lart: 15 , majtas: 15 ) ) ) ; var myPlacemark = ymaps të reja.Placemark ([ 55.7649 , 37.63836 ] , ( ) , ( icon Layout: "iconImage"efault : , iconImageSize: [ 40 , 51 ] , iconImageOffset: [ - 20 , - 47 ] ) ); myMap.geoObjects .add (myPlacemark) ;) |
Këtu ne deklarojmë një ndryshore marka e vendit tim, në të cilën shkruajmë shënuesin, në parametrin e parë ymaps.Placemark specifikoni koordinatat e etiketës dhe në parametrin e tretë:
- tregoni në iconLayout që do të përdoret një imazh i etiketës me porosi;
- iconImageHref- rruga drejt imazhit;
- iconImageSize- specifikoni madhësinë e figurës;
- iconImageOffset- ne tregojmë zhvendosjen nga këndi i sipërm i majtë i figurës në pikën e figurës, të cilën e drejtojmë te objekti që na nevojitet. Kjo është e nevojshme në mënyrë që kur harta të shkallëzohet, pozicioni i etiketës të mos devijojë. Pse kompensimi tregohet në vlera negative - vetëm Zoti e di krijuesin e API.
Dhe përmes myMap.geoObjects.add() shtoni një shënues në hartë.
Dhe tani le të bëjmë një tullumbace që do të shfaqet kur të klikojmë në etiketën e hartës, do të marrim paraqitjen e balonës dhe përmbajtjen e saj nga http://designdeck.co.uk/a/1241
ymaps.ready(init) ; funksioni init() (var myMap; myMap = new ymaps.Map ("harta" , ( qendër: [ 55.7652 , 37.63836 ] , zmadhimi: 17 , kontrollet: ) ) ; myMap.behaviors .çaktivizoj ("scrollZoom;) kontrollet .add ("zoomControl" , ( pozicioni: ( lart: 15 , majtas: 15 ) ) ; var html = " "; html += ""
; html +=" " ; var myPlacemark = ymaps i ri.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 Imagon: refo H "http://site/files/APIYaMaps1/min_popup.png", balloonImageOffset: [ - 144 , - 147 ] , balloonImageSize: [ 289 , 151 ] , BalloonShadow: false ) ; myMap.geoObjects .add (myPlacemark) ; )"; html += " "; html +="Kopshtet e Kullës Victoria " ; html += "" ; html +="Qyteti i Londrës " ; html += "" ; html += "Mbretëria e Bashkuar "; html +="020 7641 5264 "; html +=" |
Ne jemi këtu:
- në Përmbajtja e balonës specifikoni përmbajtjen që do të shfaqet kur të hapet balona;
- Struktura e balonave- specifikoni që një imazh i personalizuar do të përdoret si plan urbanistik;
- Balona ContentSize dhe madhësia e imazhit të balonës— madhësitë e përmbajtjes dhe imazheve, përkatësisht;
- ballonImageHref- rruga drejt imazhit;
- ballonImageOffset- kompensimi në lidhje me këndin e sipërm të majtë;
- tullumbace Hije— çaktivizimi i hijes së balonës (nuk ndikon asgjë me imazhet e personalizuara).
Një kandidat për lëshim është një version i API, i cili është i disponueshëm për përdorim publik, por është ende nën miratim. Përpara se të instaloni kandidatin e lëshimit si një version të qëndrueshëm, sapo të lëshohet, ai testohet për gabime që mund të çojnë në degradimin e funksionalitetit të API. Duke përdorur kandidatët e lëshimit në projektet tuaja, ju mund të na ndihmoni të identifikojmë me kohë gabimet e mundshme. Ju gjithashtu mund të testoni paraprakisht funksionimin e aplikacionit tuaj me një version të ri të API-së.
Kandidatët e lëshimit duhet të përdoren në mjedisin e zhvillimit dhe testimit të aplikacionit. Kjo do t'ju ndihmojë të shmangni gabimet në mjedisin e prodhimit. Ju mund të aktivizoni një kandidat për lirim si më poshtë:
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.
Вот его код:
Në fillim, ne lidhim API-në e hartave në http://api-maps.yandex.ru/
Le të shohim opsionet në më shumë detaje:
lang - caktuar nga dy parametra language_region,
gjuha - kodi dyshifror i gjuhës. Specifikuar në formatin ISO 639-1.
rajoni - kodi dyshifror i shtetit. Specifikuar në formatin ISO 3166-1.
Në ky moment lokalet e mëposhtme mbështeten:
lang=ru_RU;
lang=en_SHBA;
lang=ru_UA;
gjuha=uk_UA;
lang=tr_TR.
Mund të përdoren opsione shtesë:
koordinatori - renditja në të cilën specifikohen koordinatat gjeografike në funksionet API që pranojnë çifte gjatësi-gjerësi gjeografike si hyrje (për shembull, Placemark).
Vlerat e mundshme:
latlong - [gjerësia, gjatësia] - përdoret si parazgjedhje;
longlat - [gjatësi, gjerësi gjeografike].
Vlera e parazgjedhur: latlong.
load - Lista e moduleve për t'u ngarkuar.
Vlera e paracaktuar: paketë.plotë.
modaliteti - modaliteti i ngarkimit të API.
mode=release - Kodi API mund të shkarkohet në formë të paketuar për të minimizuar trafikun dhe shpejtësinë e ekzekutimit në shfletues;
mode=debug - modaliteti i shkarkimit si kod burimor.
Vlera e parazgjedhur: lirim.
Lexoni më shumë rreth opsioneve të lidhjes
Për të shfaqur hartën, specifikohet një kontejner me madhësi jo zero, çdo element HTML i tipit bllok mund të përdoret si kontejner, në shembullin është div.
Parametrat e hartës janë vendosur në kod:
myMap = ymaps.Hartë e re ('hartë', (
qendra: , // qendra e hartës së Nizhny Novgorod
zmadhimi: 12 - niveli i zmadhimit
});
Harta duhet të krijohet pasi të jetë ngarkuar e gjithë faqja e internetit. Kjo do të sigurojë që kontejneri për hartën të jetë krijuar dhe të mund të aksesohet me ID. Për të inicializuar hartën pasi të jetë ngarkuar faqja, mund të përdorni funksionin gati().
Funksioni gati do të thirret kur API të jetë ngarkuar dhe DOM të jetë gjeneruar.
ymaps.ready(init);
funksioni init()(
// Krijoni një shembull të hartës dhe lidheni atë me kontejnerin me
// ID e dhënë ("hartë").
myMap = ymaps.Hartë e re ('hartë', (
// Gjatë inicializimit të hartës, duhet të specifikoni
// qendra e saj dhe faktori i shkallës.
qendër: , // Nizhny Novgorod
zmadhimi: 12
});
Si parazgjedhje, harta shfaq të gjitha kontrollet e disponueshme.
Lloji i hartës - skema.
API ofron pesë lloje hartash të integruara:
Skema (yandex#map) - si parazgjedhje;
Satelit (yandex#satellite);
Hibrid (yandex#hybrid);
Harta e njerëzve (yandex#publicMap);
Hibrid i hartës kombëtare (yandex#publicMapHybrid).
Shembull me përcaktimin e llojit të hartës Satelitore
Shembull i kodit:
Siç thashë më parë, grupi i parazgjedhur i kontrolleve 'mediumMapDefaultSet' shtohet në hartë si parazgjedhje.
Për të shtuar kontrollet e nevojshme në hartë, mund të specifikoni një listë të çelësave përkatës në parametrin e kontrolleve kur krijoni hartën.
Këtu është kodi shembull për kontrollet e shkallës dhe tipit të hartës.
Shembull i kodit:
|
Është e mundur të vendosni sjelljen e hartës duke përdorur parametrin e sjelljeve.
Duke vendosur vlerat e saj, ne mund të aktivizojmë ose çaktivizojmë opsione të ndryshme për sjelljen e hartës:
shkallëzimi i hartës duke klikuar dy herë butonin e miut;
zvarritja e hartës me miun ose me prekje të vetme;
shkallëzimi i hartës kur zgjidhni një zonë me butonin e majtë të miut;
shkallëzimi i hartës me një prekje me shumë prekje;
shkallëzimi i hartës kur zgjidhni një zonë klikoni me të djathtën minj;
matja e distancës;
zmadhimi i hartës me rrotën e miut.
Shembull kodi me zmadhimin e rrotave të miut të çaktivizuar.
|
Është e mundur të ndryshohen parametrat e një harte pasi të jetë krijuar.
Aktivizo zmadhimin e rrotave të miut
myMap.behaviors.enable("scrollZoom");
Fike
myMap.behaviors.disable("scrollZoom");
Instalimi i një lloji të ri të hartës Folk
myMap.setType('yandex#publicMap');
Vendosja e një qendre të re harte
Kjo është e gjitha për tani.
Vazhdon…