„Yandex“ žemėlapių api 2.1 perėjimas
Šiame straipsnyje noriu pradėti straipsnių seriją apie darbą su Yandex.Maps API. „Yandex.Maps“ dokumentacija yra gana išsami, tačiau joje esančios informacijos suskaidymo laipsnis yra didelis, kai pirmą kartą įvedate dokumentaciją be pusės litro, negalite to suprasti, o norėdami išspręsti problemą, galite išleisti daug laiko ieškant dokumentuose ir paieškos sistemoje. Šioje straipsnių serijoje bus kalbama apie praktinius sprendimus, susijusius su dažniausiai pasitaikančiais naujausios, šio rašymo metu, 2.1 versijos Yandex.Maps API naudojimo atvejais.
Dėl svetainės išdėstymo kontaktinėje informacijoje dažnai reikia įterpti žemėlapį, kuriame bus pažymėta organizacijos, kuriai svetainė kuriama, vieta. Paprasčiausiais atvejais tai gali būti tik ekrano kopija iš internetinių žemėlapių (arba ne internete):
Dėl įdėklo interaktyvus žemėlapis Galima naudoti žemėlapių kūrimo priemonę
https://tech.yandex.ru/maps/tools/constructor/ :
Jei mums reikia pažangesnio žemėlapių naudojimo (savo etiketės, programinio žemėlapių judėjimo ir kt.), tada tam turime naudoti Yandex.Maps API: https://tech.yandex.ru/maps/jsapi/ . Kaip žemėlapių naudojimo pavyzdį, šiame straipsnyje bus nagrinėjamas žemėlapio kūrimas, paprastai pridedant pasirinktinę etiketę ir balioną.
Pirmiausia sujunkite API komponentus:
Jei naudojant žemėlapius kuriama didelė programa, geriau prijungti tam tikros versijos API komponentus, kad atnaujinant API „Yandex“ pusėje gamyboje niekas nenutrūktų:
Žemėlapį reikės įdėti į kokį nors bloką, pavyzdžiui, į div#žemėlapis. Toliau šiame bloke turi būti sukurtas žemėlapis (suaktyvinus žemėlapio ir DOM parengties įvykį):
ymaps.ready(init) ; function init() ( var myMap; myMap = new ymaps.Map ("žemėlapis" , ( centras: [ 55.76 , 37.64 ] , mastelio keitimas: 7 ) ) ; ) |
Čia nurodome:
- bloko identifikatorius žemėlapį, kur kursime žemėlapį;
- centras— žemėlapio centras, nurodantis plotį ir ilgumą;
- priartinti— žemėlapio mastelio koeficientas.
Pagal numatytuosius nustatymus „Yandex.Maps“ sukuria daug nereikalingų elementų, kurių daugeliu atvejų svetainėse nereikia. Iš esmės valdikliams ir žemėlapio veikimui pakanka taikyti 2 sąlygas:
- iš žemėlapio elementų yra tik mastelio keitimo slankiklis;
- žemėlapis neturėtų būti padidintas naudojant pelės slinktį.
Norėdami įvykdyti šiuos reikalavimus, papildome kodą:
ymaps.ready(init) ; function init() ( var myMap; myMap = new ymaps.Map ("žemėlapis" , ( centras: [ 55.76 , 37.64 ] , mastelio keitimas: 13 , valdikliai: ) ) ; myMap.behaviors .disable ("scrollZoom") ; myMap. valdikliai .add ("zoomControl" , ( padėtis: ( viršuje: 15 , kairėje: 15 ) ) ; ) |
Čia mes esame neįgalūs slinkties mastelio keitimas ir pridėjo "Mastelio keitimas" pastatytas iš viršutinio kairiojo kampo.
Dabar prie žemėlapio turime pridėti etiketę, nes straipsniui atsisiųsime jo vaizdą iš http://medialoot.com/item/free-vector-map-location-pins/ ir įdėsime į kodą taip:
ymaps.ready(init) ; function init() ( var myMap; myMap = new ymaps.Map ("žemėlapis" , ( centras: [ 55.7652 , 37.63836 ] , mastelio keitimas: 17 , valdikliai: ) ) ; myMap.behaviors .disable ("scrollZoom" ) valdikliai .add ("zoomControl" , ( padėtis: ( viršuje: 15 , kairėje: 15 ) ) ) ; var myPlacemark = new ymaps.Placemark ([ 55.7649 , 37.63836 ] , ( ) , ( iconLayout: "default,#imamage" : , iconImageSize: [ 40 , 51 ] , iconImageOffset: [ - 20 , - 47 ] ) ) ; myMap.geoObjects .add (myPlacemark) ; ) |
Čia deklaruojame kintamąjį myPlacemark, kuriame įrašome žymeklį, pirmame parametre ymaps.Vietos žymeklis nurodykite etiketės koordinates, o trečiajame parametre:
- nurodyti piktogramos išdėstymas kad bus naudojamas tinkintos etiketės vaizdas;
- iconImageHref- kelias į vaizdą;
- piktogramaVaizdo dydis- nurodyti vaizdo dydį;
- iconImageOffset- nurodome poslinkį iš viršutinio kairiojo paveikslo kampo į vaizdo tašką, kurį nukreipiame į mums reikalingą objektą. Tai būtina, kad padidinus žemėlapio mastelį etiketės padėtis nenuklystų. Kodėl poslinkis nurodomas neigiamomis reikšmėmis - API kūrėją žino tik Dievas.
Ir per myMap.geoObjects.add() pridėti žymeklį prie žemėlapio.
O dabar padarykime balioną, kuris bus rodomas paspaudus žemėlapio etiketę, baliono maketą ir jo turinį paimsime iš http://designdeck.co.uk/a/1241
ymaps.ready(init) ; function init() ( var myMap; myMap = new ymaps.Map ("žemėlapis" , ( centras: [ 55.7652 , 37.63836 ] , mastelio keitimas: 17 , valdikliai: ) ) ; myMap.behaviors .disable ("scrollZoom" ) valdikliai .add ("zoomControl" , ( padėtis: ( viršuje: 15 , kairėje: 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 ] , balionas:VaizdasHref "http://site/files/APIYaMaps1/min_popup.png", balionasImageOffset: [ - 144 , - 147 ] , balloonImageSize: [ 289 , 151 ] , balionasShadow: false ) ) ; myMap.geoObjects .add (myPlacemark) ; )"; html += " " ; html += "Viktorijos bokšto sodai " ; html += "" ; html +="Londono miestas " ; html += "" ; html += "Jungtinė Karalystė " ; html += "020 7641 5264 " ; html += " |
Mes esame čia:
- in balionasTurinys nurodyti turinį, kuris bus rodomas atidarius balioną;
- baliono išdėstymas- nurodykite, kad pasirinktinis vaizdas bus naudojamas kaip baliono maketas;
- balionasContentSize ir balionasImageSize— atitinkamai turinio ir vaizdų dydžiai;
- balionasImageHref- kelias į vaizdą;
- balionasImageOffset- poslinkis viršutinio kairiojo kampo atžvilgiu;
- balionasŠešėlis— išjungti baliono šešėlį (tai neturi įtakos pasirinktiniams vaizdams).
Galimybė išleisti yra API versija, kurią galima naudoti viešai, tačiau ji vis dar tvirtinama. Prieš įdiegiant leidimo kandidatą kaip stabilią versiją, kai tik ji išleidžiama, ji patikrinama, ar nėra klaidų, dėl kurių gali pablogėti API funkcijos. Savo projektuose naudodami kandidatus į leidimą galite padėti mums laiku nustatyti galimas klaidas. Taip pat galite iš anksto išbandyti savo programos veikimą naudodami naują API versiją.
Kandidatai į leidimą turėtų būti naudojami programų kūrimo ir testavimo aplinkoje. Tai padės išvengti klaidų gamybos aplinkoje. Galite įgalinti leidimo kandidatą taip:
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.
Вот его код:
Pačioje pradžioje sujungiame žemėlapių API adresu http://api-maps.yandex.ru/
Pažvelkime į parinktis išsamiau:
lang – nustatoma dviem parametrais language_region,
kalba – dviženklis kalbos kodas. Nurodyta ISO 639-1 formatu.
regionas – dviženklis šalies kodas. Nurodyta ISO 3166-1 formatu.
Įjungta Šis momentas palaikomos šios lokalės:
lang=ru_RU;
lang=en_US;
lang=ru_UA;
lang=uk_UA;
lang=tr_TR.
Galima naudoti papildomas parinktis:
koordinatorius – tvarka, kuria geografinės koordinatės nurodomos API funkcijose, kurios priima ilgumos ir platumos poras kaip įvestį (pavyzdžiui, vietos žymeklis).
Galimos reikšmės:
latlong – [platuma, ilguma] – naudojamas pagal numatytuosius nustatymus;
longlat – [ilguma, platuma].
Numatytoji vertė: latlong.
įkelti – įkeliamų modulių sąrašas.
Numatytoji reikšmė: package.full.
režimas – API įkėlimo režimas.
mode=release – API kodą galima atsisiųsti supakuotą, kad būtų sumažintas srautas ir vykdymo greitis naršyklėje;
mode=debug – atsisiuntimo režimas kaip šaltinio kodas.
Numatytoji reikšmė: paleidimas.
Skaitykite daugiau apie ryšio parinktis
Žemėlapiui rodyti nurodomas ne nulinio dydžio konteineris, bet koks bloko tipo HTML elementas gali būti naudojamas kaip konteineris, pavyzdyje tai div.
Žemėlapio parametrai nustatomi kode:
myMap = naujas ymaps.Map('žemėlapis', (
centras: , // Nižnij Novgorodo žemėlapio centras
priartinimas: 12 – priartinimo lygis
});
Žemėlapis turėtų būti sukurtas įkėlus visą tinklalapį. Taip įsitikinsite, kad žemėlapio konteineris buvo sukurtas ir jį galima pasiekti naudojant ID. Norėdami inicijuoti žemėlapį po puslapio įkėlimo, galite naudoti funkciją ready().
Paruošta funkcija bus iškviesta, kai bus įkelta API ir sugeneruotas DOM.
ymaps.ready(init);
funkcija init()(
// Sukurkite žemėlapio egzempliorių ir susiekite jį su konteineriu
// suteiktas ID („žemėlapis“).
myMap = naujas ymaps.Map('žemėlapis', (
// Pradėdami žemėlapį, turite nurodyti
// jo centras ir mastelio koeficientas.
centras: , // Nižnij Novgorodas
priartinimas: 12
});
Pagal numatytuosius nustatymus žemėlapyje rodomi visi galimi valdikliai.
Žemėlapio tipas – schema.
API pateikia penkis integruotus žemėlapių tipus:
Schema (yandex#map) – pagal numatytuosius nustatymus;
Palydovas (yandex#satellite);
Hibridas (yandex#hibridas);
Žmonių žemėlapis (yandex#publicMap);
Nacionalinio žemėlapio hibridas (yandex#publicMapHybrid).
Pavyzdys, kaip nustatyti žemėlapio tipą Palydovas
Kodo pavyzdys:
Kaip jau sakiau anksčiau, numatytasis „mediumMapDefaultSet“ valdiklių rinkinys pridedamas prie žemėlapio pagal numatytuosius nustatymus.
Norėdami į žemėlapį įtraukti reikiamus valdiklius, kurdami žemėlapį valdymo elementų parametre galite nurodyti atitinkamų klavišų sąrašą.
Čia yra žemėlapio mastelio ir tipo valdiklių kodo pavyzdys.
Kodo pavyzdys:
|
Galima nustatyti žemėlapio elgseną naudojant elgesio parametrą.
Nustatydami jo reikšmes, galime įjungti arba išjungti įvairias žemėlapio veikimo parinktis:
žemėlapio mastelio keitimas dukart spustelėjus pelės mygtuką;
žemėlapio vilkimas pele arba vienu prisilietimu;
žemėlapio mastelio keitimas renkantis sritį kairiuoju pelės mygtuku;
žemėlapio mastelio keitimas kelių palietimų paspaudimu;
žemėlapio mastelio keitimas renkantis sritį dešiniuoju pelės mygtuku spustelėkite pelėms;
atstumo matavimas;
žemėlapio mastelio keitimas pelės ratuku.
Kodo pavyzdys, kai išjungtas pelės ratuko priartinimas.
|
Sukūrus žemėlapio parametrus galima keisti.
Įjunkite pelės ratuko priartinimą
myMap.behaviors.enable("scrollZoom");
Išjunk
myMap.behaviors.disable("scrollZoom");
Diegiame naujo tipo žemėlapį Folk
myMap.setType('yandex#publicMap');
Naujo žemėlapių centro nustatymas
Tai kol kas viskas.
Tęsinys…