Yandex mapuje przejście API 2.1
W tym artykule chcę rozpocząć serię artykułów na temat pracy z API Yandex.Maps. Dokumentacja Yandex.Maps jest dość kompletna, ale stopień fragmentacji zawartych w niej informacji jest wysoki, kiedy po raz pierwszy wchodzisz do dokumentacji bez pół litra, nie możesz tego rozgryźć, a aby rozwiązać problem, możesz wydać dużo czasu na przeszukiwanie dokumentacji i wyszukiwarki. W tej serii artykułów omówimy praktyczne rozwiązania najczęstszych przypadków korzystania z API Yandex.Maps najnowszej, w chwili pisania tego tekstu, wersji 2.1.
Podczas układania witryny w informacjach kontaktowych często konieczne jest wstawienie mapy, na której zostanie zaznaczona lokalizacja organizacji, dla której tworzona jest witryna. W najprostszych przypadkach może to być po prostu zrzut ekranu z map online (lub nie online):
Do wkładu interaktywna mapa można użyć konstruktora map
https://tech.yandex.ru/maps/tools/constructor/ :
Jeśli potrzebujemy bardziej zaawansowanego wykorzystania map (własne etykiety, programowe przesuwanie map itp.), to w tym celu musimy skorzystać z API Yandex.Maps: https://tech.yandex.ru/maps/jsapi/ . Jako przykład korzystania z map, w tym artykule przyjrzymy się tworzeniu mapy z prostym dodaniem niestandardowej etykiety i odnośnika.
Najpierw połączmy komponenty API:
Jeśli jakaś duża aplikacja jest opracowywana przy użyciu map, lepiej jest połączyć komponenty API określonej wersji, aby podczas aktualizacji API po stronie Yandex nic się nie zepsuło w produkcji:
Mapa będzie musiała zostać umieszczona w jakimś bloku, na przykład w div#mapa. Następnie mapa musi zostać utworzona w tym bloku (po wywołaniu zdarzenia gotowości mapy i DOM):
ymaps.ready(init) ; function init() ( var mojaMapa; mojaMapa = new ymaps.Map („mapa” , (środek: [55,76 , 37,64 ] , powiększenie: 7 ) ) ; ) |
Tutaj wskazujemy:
- identyfikator bloku mapa, gdzie utworzymy mapę;
- Centrum— środek mapy wskazujący szerokość i długość geograficzną;
- Powiększenie— współczynnik skali mapy.
Domyślnie Yandex.Maps tworzy wiele niepotrzebnych elementów, które w większości przypadków nie są potrzebne na stronach internetowych. Zasadniczo wystarczy zastosować 2 warunki do sterowania i zachowania mapy:
- spośród elementów mapy obecny jest tylko suwak powiększenia;
- mapy nie należy powiększać za pomocą przewijania myszy.
Aby spełnić te wymagania, uzupełniamy kod:
ymaps.ready(init) ; function init() ( var mojaMapa; mojaMapa = new ymaps.Map („mapa” , (środek: [ 55,76 , 37,64 ] , powiększenie: 13 , sterowanie: ) ); myMap.behaviors .disable („scrollZoom” ); mojaMapa. kontrole .add („zoomControl” , ( pozycja: ( góra: 15 , lewa: 15 ) ) ) ; ) |
Tutaj mamy wyłączone przewijanie i dodał "sterowanie zoomem" umieszczony od lewego górnego rogu.
Teraz musimy dodać etykietę do mapy, dla artykułu pobierzemy jej obraz z http://medialoot.com/item/free-vector-map-location-pins/ i umieścimy go w kodzie w następujący sposób:
ymaps.ready(init) ; function init() ( var mojaMapa; myMap = new ymaps.Map („mapa” , (środek: [ 55.7652 , 37.63836 ] , powiększenie: 17 , sterowanie: ) ); myMap.behaviors .disable („scrollZoom” ); myMap. kontrole .add („zoomControl” , ( pozycja: ( góra: 15 , lewa: 15 ) ) ) var myPlacemark = new ymaps.Placemark ([ 55.7649 , 37.63836 ] , ( ) , ( iconLayout: „default#image” , iconImageHref : , iconImageSize: [ 40 , 51 ] , iconImage Offset: [ - 20 , - 47 ] ) ); myMap.geoObjects .add (myPlacemark) ; ) |
Tutaj deklarujemy zmienną mojeOznaczenie miejsca, w którym wpisujemy znacznik, w pierwszym parametrze ymaps.Oznaczenie miejsca podaj współrzędne etykiety, a w trzecim parametrze:
- wskazać w ikonaUkładże zostanie użyty niestandardowy obraz etykiety;
- ikonaObrazHref- ścieżka do obrazu;
- ikonaRozmiar obrazu- określ rozmiar obrazu;
- ikonaObrazPrzesunięcie- wskazujemy przesunięcie od lewego górnego rogu obrazu do punktu obrazu, którym wskazujemy na potrzebny nam obiekt. Jest to konieczne, aby podczas skalowania mapy pozycja etykiety nie zbłądziła. Dlaczego offset jest wskazany w wartościach ujemnych - tylko Bóg zna twórcę API.
I przez mojaMapa.geoObjects.add() dodaj znacznik do mapy.
A teraz zróbmy balon, który pokaże się po kliknięciu etykiety mapy, weźmiemy układ balonu i jego zawartość z http://designdeck.co.uk/a/1241
ymaps.ready(init) ; function init() ( var mojaMapa; myMap = new ymaps.Map („mapa” , (środek: [ 55.7652 , 37.63836 ] , powiększenie: 17 , sterowanie: ) ); myMap.behaviors .disable („scrollZoom” ); myMap. kontrole .add („zoomControl” , ( pozycja: ( góra: 15 , lewa: 15 ) ) ); var html = „ "; html += ""
; html +=" "; var myPlacemark = new ymaps.Placemark ([ 55.7649 , 37.63836 ] , (ballonContent: html ) , ( iconLayout: "default#image" , iconImageHref: "http://site/files/APIYaMaps1/min_marker.png", iconImageSize: [ 40 , 51 ] , iconImage Offset: [ - 20 , - 47 ] , balloonLayout: "default#imageWithContent" , balloonContentSize: [ 289 , 151 ] , balonImageHref: "http://site/files/APIYaMaps1/min_popup.png", balonImageOffset: [ - 144 , - 147 ] , balonImageSize: [ 289 , 151 ] , balon Cień: false ) ) ; myMap.geoObjects .add (myPlacemark) ; )"; html += " " ; html += "Ogrody Victoria Tower " ; html += ""; html +="Londyn " ; html += "" ; html += "Zjednoczone Królestwo " ; html += "020 7641 5264 " ; html += " |
Tutaj my:
- w BalonZawartość określ treść, która będzie wyświetlana po otwarciu balonu;
- balonUkład- określ, że jako układ dymków zostanie użyty niestandardowy obraz;
- balonZawartośćRozmiar oraz rozmiar obrazu balonu— odpowiednio rozmiary treści i obrazów;
- balonObrazHref- ścieżka do obrazu;
- przesunięcie obrazu balonu- przesunięcie względem lewego górnego rogu;
- balonCień— wyłączenie cienia balonu (nie wpływa na nic z niestandardowymi obrazami).
Wersja Release Candidate to wersja API, która jest dostępna do użytku publicznego, ale wciąż jest w trakcie zatwierdzania. Przed zainstalowaniem Release Candidate jako wersji stabilnej, zaraz po jej wydaniu, jest ona testowana pod kątem błędów, które mogą prowadzić do degradacji funkcjonalności API. Używając kandydatów do wydania w swoich projektach, możesz pomóc nam w odpowiednim czasie zidentyfikować potencjalne błędy. Możesz także wstępnie przetestować działanie aplikacji z nową wersją interfejsu API.
Kandydatów do wydania należy używać w środowisku programistycznym i testowym aplikacji. Pomoże to uniknąć błędów w środowisku produkcyjnym. Możesz włączyć kandydata do wydania w następujący sposób:
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 samym początku łączymy API map pod adresem http://api-maps.yandex.ru/
Przyjrzyjmy się opcjom bardziej szczegółowo:
lang - ustawiany dwoma parametrami region_języka,
język - dwucyfrowy kod języka. Określone w formacie ISO 639-1.
region - dwucyfrowy kod kraju. Określone w formacie ISO 3166-1.
Na ten moment obsługiwane są następujące ustawienia regionalne:
lang=ru_RU;
lang=en_US;
lang=ru_UA;
lang=uk_UA;
język=tr_TR.
Można zastosować dodatkowe opcje:
coordorder — kolejność, w jakiej współrzędne geograficzne są określane w funkcjach API, które akceptują pary długość-szerokość geograficzna jako dane wejściowe (na przykład oznaczenie miejsca).
Możliwa wartość:
latlong - [szerokość, długość geograficzna] - używany domyślnie;
longlat - [długość, szerokość geograficzna].
Wartość domyślna: latlong.
load - Lista modułów do załadowania.
Wartość domyślna: pakiet.pełny.
tryb - tryb ładowania interfejsu API.
mode=release - kod API można pobrać w formie spakowanej, aby zminimalizować ruch i szybkość wykonywania w przeglądarce;
mode=debug - tryb pobierania jako kod źródłowy.
Wartość domyślna: zwolnij.
Przeczytaj więcej o opcjach połączenia
Aby wyświetlić mapę, określa się kontener o niezerowym rozmiarze, jako kontener można użyć dowolnego elementu HTML typu blokowego, w przykładzie jest to div.
Parametry mapy są ustawione w kodzie:
mojaMapa = new ymaps.Map('mapa', (
centrum: , // centrum mapy Niżny Nowogród
zoom: 12 - poziom powiększenia
});
Mapa powinna zostać utworzona po załadowaniu całej strony internetowej. Zapewni to, że kontener mapy został utworzony i można uzyskać do niego dostęp za pomocą identyfikatora. Aby zainicjować mapę po załadowaniu strony, możesz użyć funkcji ready().
Gotowa funkcja zostanie wywołana po załadowaniu API i wygenerowaniu DOM.
ymaps.ready(init);
funkcja init()(
// Utwórz instancję mapy i powiąż ją z kontenerem za pomocą
// podany identyfikator ("mapa").
mojaMapa = new ymaps.Map('mapa', (
// Podczas inicjalizacji mapy musisz określić
// jego środek i współczynnik skali.
centrum: , // Niżny Nowogród
powiększenie: 12
});
Domyślnie na mapie wyświetlane są wszystkie dostępne kontrolki.
Typ mapy - schemat.
Interfejs API udostępnia pięć wbudowanych typów map:
Schemat (yandex#map) - domyślnie;
Satelita (yandex#satelita);
Hybrydowy (yandex#hybrydowy);
Mapa ludzi (yandex#publicMap);
Hybryda mapy narodowej (yandex#publicMapHybrid).
Przykład z określeniem typu mapy Satelita
Przykładowy kod:
Jak powiedziałem wcześniej, domyślny zestaw kontrolek „mediumMapDefaultSet” jest domyślnie dodawany do mapy.
Aby dodać niezbędne kontrolki do mapy, możesz określić listę odpowiednich kluczy w parametrze kontrolek podczas tworzenia mapy.
Oto przykładowy kod kontrolek skali i typu mapy.
Przykładowy kod:
|
Istnieje możliwość ustawienia zachowania mapy za pomocą parametru „behaviors”.
Ustawiając jego wartości, możemy włączyć lub wyłączyć różne opcje zachowania mapy:
skalowanie mapy poprzez dwukrotne kliknięcie myszką;
przeciąganie mapy myszką lub jednym dotknięciem;
skalowanie mapy przy zaznaczaniu obszaru lewym przyciskiem myszy;
skalowanie mapy za pomocą dotyku wielodotykowego;
skalowanie mapy podczas wybierania obszaru kliknij prawym przyciskiem myszy myszy;
pomiar odległości;
powiększanie mapy kółkiem myszy.
Przykład kodu z wyłączonym zoomem kółkiem myszy.
|
Istnieje możliwość zmiany parametrów mapy po jej utworzeniu.
Włącz powiększenie kółkiem myszy
myMap.behaviors.enable("scrollZoom");
Wyłączyć
myMap.behaviors.disable("scrollZoom");
Instalacja nowego typu mapy Folk
myMap.setType('yandex#publicMap');
Konfigurowanie nowego centrum mapy
To wszystko na teraz.
Ciąg dalszy nastąpi…