Yandex maps api 2.1 prijelaz
U ovom članku želim započeti seriju članaka o radu s Yandex.Maps API-jem. Dokumentacija Yandex.Mapsa je prilično kompletna, ali je stepen fragmentiranosti informacija u njoj visok; kada prvi put uđete u dokumentaciju bez pola litre, ne možete to shvatiti, a da biste riješili problem, možete potrošiti puno vremena pretražujući dokumentaciju i tražilicu. Ova serija članaka govorit će o praktičnim rješenjima za najčešće slučajeve korištenja Yandex.Maps API-ja najnovije, u vrijeme pisanja ovog teksta, verzije 2.1.
Prilikom postavljanja stranice u kontakt informacije, često je potrebno umetnuti mapu na kojoj će biti označena lokacija organizacije za koju se stranica razvija. U najjednostavnijim slučajevima, ovo može biti samo snimak ekrana sa online mapa (ili ne na mreži):
Za umetak interaktivna karta Map builder se može koristiti
https://tech.yandex.ru/maps/tools/constructor/ :
Ako nam je potrebna naprednija upotreba karata (naše vlastite oznake, programsko kretanje karata itd.), onda za to trebamo koristiti Yandex.Maps API: https://tech.yandex.ru/maps/jsapi/ . Kao primjer korištenja mapa, ovaj članak će se osvrnuti na kreiranje karte s jednostavnim dodavanjem prilagođene oznake i balona.
Prvo, spojimo API komponente:
Ako se neka velika aplikacija razvija pomoću mapa, onda je bolje povezati API komponente određene verzije tako da se pri ažuriranju API-ja na strani Yandex-a ništa ne prekida u proizvodnji:
Mapa će se morati postaviti u neki blok, na primjer u div#map. Zatim se mapa mora kreirati u ovom bloku (nakon što se pokrene događaj spremnosti mape i DOM-a):
ymaps.ready(init) ; funkcija init() ( var myMap; myMap = new ymaps.Map ("mapa" , ( centar: [ 55.76 , 37.64 ] , zumiranje: 7 ) ) ;) |
Ovdje ukazujemo:
- identifikator bloka mapa, gdje ćemo kreirati mapu;
- centar— centar karte koji označava širinu i dužinu;
- zum— faktor razmere karte.
Podrazumevano, Yandex.Maps stvara mnogo nepotrebnih elemenata, koji u većini slučajeva nisu potrebni na web stranicama. U osnovi, dovoljno je primijeniti 2 uvjeta na kontrole i na ponašanje karte:
- od elemenata karte prisutan je samo klizač za zumiranje;
- mapu ne treba zumirati pomicanjem miša.
Da bismo ispunili ove zahtjeve, dopunjavamo kod:
ymaps.ready(init) ; funkcija init() ( var myMap; myMap = nova ymaps.Map ("mapa" , ( centar: [ 55.76 , 37.64 ] , zumiranje: 13 , kontrole: ) ) ; myMap.behaviors .disable ("scrollZoom." ) ; kontrole .add ("zoomControl" , ( pozicija: ( gore: 15 , lijevo: 15 ) ) ; ) |
Ovdje smo onemogućili scrollzoom i dodao "kontrola zuma" pozicioniran iz gornjeg lijevog ugla.
Sada moramo dodati oznaku na kartu, za članak ćemo preuzeti njenu sliku sa http://medialoot.com/item/free-vector-map-location-pins/ i postaviti je u kod na sljedeći način:
ymaps.ready(init) ; funkcija init() ( var myMap; myMap = new ymaps.Map ("map" , ( centar: [ 55.7652 , 37.63836 ] , zumiranje: 17 , kontrole: ) ) ; myMap.behaviors .disable ("scrollZoom; myMap" . kontrole .add ("zoomControl" , ( pozicija: ( gore: 15 , lijevo: 15 ) ) ) ; var myPlacemark = novi ymaps.Placemark ([ 55.7649 , 37.63836 ] , ( ) , ( iconLayout: "defa" : , iconImageSize: [ 40 , 51 ] , iconImageOffset: [ - 20 , - 47 ] ) ) ; myMap.geoObjects .add (myPlacemark) ;) |
Ovdje deklariramo varijablu myPlacemark, u koji upisujemo marker, u prvi parametar ymaps.Placemark navedite koordinate oznake, au trećem parametru:
- naznačiti u iconLayout da će se koristiti slika prilagođene oznake;
- iconImageHref- put do slike;
- iconImageSize- odredite veličinu slike;
- iconImageOffset- označavamo pomak od gornjeg lijevog ugla slike do tačke slike koju pokazujemo na predmet koji nam je potreban. Ovo je neophodno kako kada se mapa skalira, pozicija oznake ne bi zalutala. Zašto je pomak naznačen u negativnim vrijednostima - samo Bog zna tvorca API-ja.
I kroz myMap.geoObjects.add() dodajte marker na kartu.
A sada ćemo napraviti balon koji će se prikazati kada kliknemo na oznaku karte, preuzet ćemo izgled balona i njegov sadržaj sa http://designdeck.co.uk/a/1241
ymaps.ready(init) ; funkcija init() ( var myMap; myMap = new ymaps.Map ("map" , ( centar: [ 55.7652 , 37.63836 ] , zumiranje: 17 , kontrole: ) ) ; myMap.behaviors .disable ("scrollZoom; myMap" . kontrole .add ("zoomControl" , ( pozicija: ( gore: 15 , lijevo: 15 ) ) ) ; var html = " "; html += ""
; html +=" " ; var myPlacemark = novi 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 ] , balloonImage "http://site/files/APIYaMaps1/min_popup.png", balloonImageOffset: [ - 144 , - 147 ] , balloonImageSize: [ 289 , 151 ] , balloonShadow: false ) ) ; myMap.geoObjects .add (myPlacemark) ; )"; html += " " ; html += "Victoria Tower Gardens " ; html += "" ; html +="City of London " ; html += "" ; html += "ujedinjeno kraljevstvo " ; html += "020 7641 5264 " ; html += " |
Mi smo tu:
- in balloonContent odrediti sadržaj koji će biti prikazan kada se balon otvori;
- balloonLayout- navedite da će se prilagođena slika koristiti kao izgled balona;
- balloonContentSize i balloonImageSize— veličine sadržaja i slika;
- balloonImageHref- put do slike;
- balloonImageOffset- pomak u odnosu na gornji lijevi ugao;
- balloonShadow— onemogućavanje senke balona (ne utiče ni na šta sa prilagođenim slikama).
Kandidat za izdanje je verzija API-ja, koja je dostupna za javnu upotrebu, ali je još uvijek pod odobrenjem. Prije instaliranja kandidata za izdanje kao stabilne verzije, čim se objavi, testira se na greške koje mogu dovesti do degradacije API funkcionalnosti. Koristeći kandidate za izdanje u svojim projektima, možete nam pomoći da na vrijeme identificiramo potencijalne greške. Također možete unaprijed testirati rad svoje aplikacije s novom verzijom API-ja.
Kandidati za izdanje trebaju se koristiti u okruženju za razvoj i testiranje aplikacije. Ovo će vam pomoći da izbjegnete greške u proizvodnom okruženju. Kandidata za izdavanje možete omogućiti na sljedeći način:
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 samom početku povezujemo API mapa na http://api-maps.yandex.ru/
Pogledajmo opcije detaljnije:
lang - postavljen sa dva parametra language_region,
jezik - dvocifreni kod jezika. Specificirano u ISO 639-1 formatu.
region - dvocifreni kod zemlje. Specificirano u ISO 3166-1 formatu.
Na ovog trenutka podržane su sljedeće lokacije:
lang=ru_RU;
lang=en_US;
lang=ru_UA;
lang=uk_UA;
lang=tr_TR.
Mogu se koristiti i dodatne opcije:
coordorder - redosled kojim su geografske koordinate navedene u API funkcijama koje prihvataju parove geografske dužine i širine kao ulaz (na primer, oznaka mesta).
Moguće vrijednosti:
latlong - [latitude, longitude] - koristi se po defaultu;
longlat - [dužina, širina].
Zadana vrijednost: latlong.
load - Lista modula za učitavanje.
Zadana vrijednost: package.full.
mod - način učitavanja API-ja.
mode=release - API kod se može preuzeti u zapakovanom obliku kako bi se minimizirao promet i brzina izvršavanja u pretraživaču;
mode=debug - način preuzimanja kao izvorni kod.
Zadana vrijednost: release.
Pročitajte više o opcijama povezivanja
Za prikaz mape naveden je kontejner veličine koja nije nula, bilo koji HTML element tipa bloka može se koristiti kao kontejner, u primjeru je div.
Parametri karte su postavljeni u kodu:
myMap = new ymaps.Map('map', (
centar: , // centar karte Nižnjeg Novgoroda
zumiranje: 12 - nivo zumiranja
});
Mapu treba kreirati nakon što se učita cijela web stranica. Ovo će osigurati da je kontejner za mapu kreiran i da mu se može pristupiti putem id-a. Da biste inicijalizirali mapu nakon što se stranica učita, možete koristiti funkciju ready().
Ready funkcija će biti pozvana kada se API učita i DOM se generira.
ymaps.ready(init);
funkcija init()(
// Kreirajte instancu mape i povežite je sa kontejnerom sa
// dati id ("mapa").
myMap = new ymaps.Map('map', (
// Kada inicijalizirate mapu, morate specificirati
// njegov centar i faktor skale.
centar: , // Nižnji Novgorod
zumiranje: 12
});
Podrazumevano, mapa prikazuje sve dostupne kontrole.
Vrsta karte - shema.
API pruža pet ugrađenih tipova mapa:
Shema (yandex#map) - po defaultu;
Satelit (yandex#satellite);
Hibrid (yandex#hybrid);
Mapa ljudi (yandex#publicMap);
Hibrid nacionalne karte (yandex#publicMapHybrid).
Primjer sa određivanjem tipa karte Satelit
Primjer koda:
Kao što sam već rekao, podrazumevani skup kontrola 'mediumMapDefaultSet' se podrazumevano dodaje na mapu.
Da biste dodali potrebne kontrole na kartu, možete navesti listu odgovarajućih ključeva u parametru kontrola prilikom kreiranja karte.
Ovdje je primjer koda za kontrole razmjera i tipa karte.
Primjer koda:
|
Moguće je podesiti ponašanje karte pomoću parametra ponašanja.
Postavljanjem njegovih vrijednosti možemo omogućiti ili onemogućiti različite opcije za ponašanje mape:
skaliranje karte dvostrukim klikom na tipku miša;
prevlačenje karte mišem ili jednim dodirom;
skaliranje karte pri odabiru područja lijevom tipkom miša;
skaliranje karte pomoću višestrukog dodira;
skaliranje karte prilikom odabira područja desni klik miševi;
mjerenje udaljenosti;
zumiranje karte pomoću točkića miša.
Primjer koda sa onemogućenim zumiranjem kotačića miša.
|
Moguće je promijeniti parametre karte nakon što je kreirana.
Uključite zumiranje točkića miša
myMap.behaviors.enable("scrollZoom");
Ugasiti
myMap.behaviors.disable("scrollZoom");
Instalacija novog tipa mape Folk
myMap.setType('yandex#publicMap');
Postavljanje novog centra za mape
To je sve za sada.
Nastavlja se…