Yandex maps api 2.1 övergång
I den här artikeln vill jag starta en serie artiklar om att arbeta med Yandex.Maps API. Yandex.Maps-dokumentationen är ganska komplett, men graden av fragmentering av information i den är hög; när du först går in i dokumentationen utan en halv liter kan du inte räkna ut det, och för att lösa ett problem kan du spendera en mycket tid på att söka igenom dokumentationen och i sökmotorn. Den här artikelserien kommer att prata om praktiska lösningar på de vanligaste fallen av användning av Yandex.Maps API från den senaste versionen 2.1 när detta skrivs.
När man lägger ut en plats i kontaktinformation är det ofta nödvändigt att infoga en karta på vilken platsen för den organisation som sajten utvecklas för kommer att markeras. I de enklaste fallen kan detta bara vara en skärmdump från onlinekartor (eller inte online):
För insättning interaktiv karta kartbyggaren kan användas
https://tech.yandex.ru/maps/tools/constructor/ :
Om vi behöver en mer avancerad användning av kartor (våra egna etiketter, programmatisk rörelse av kartor, etc.), måste vi för detta använda Yandex.Maps API: https://tech.yandex.ru/maps/jsapi/ . Som ett exempel på hur man använder kartor kommer den här artikeln att titta på att skapa en karta med det enkla tillägget av en anpassad etikett och ballong.
Låt oss först ansluta API-komponenterna:
Om någon stor applikation utvecklas med hjälp av kartor, är det bättre att ansluta API-komponenter av en viss version så att ingenting går sönder i produktionen när du uppdaterar API:et på Yandex-sidan:
Kartan kommer att behöva placeras i något block, till exempel i div#karta. Därefter måste kartan skapas i detta block (efter att kart- och DOM-beredskapshändelsen har utlösts):
ymaps.ready(init) ; function init() ( var myMap; myMap = new ymaps.Map ("karta" , ( center: [ 55.76 , 37.64 ] , zoom: 7 ) ); ) |
Här anger vi:
- blockidentifierare Karta, där vi kommer att skapa en karta;
- Centrum— Kartans mitt som anger bredd och longitud.
- zoom— kartskalafaktor.
Som standard skapar Yandex.Maps många onödiga element, som i de flesta fall inte behövs på webbplatser. I grund och botten räcker det att tillämpa två villkor för kontrollerna och kartans beteende:
- av kartelementen är endast zoomreglaget närvarande;
- kartan ska inte zoomas med musen.
För att uppfylla dessa krav kompletterar vi koden:
ymaps.ready(init) ; function init() ( var myMap; myMap = new ymaps.Map ("karta" , ( mitten: [ 55.76 , 37.64 ] , zoom: 13 , kontroller: ) ); myMap.behaviors .disable ("scrollZoom" ); myMap. kontroller .add ("zoomControl" , ( position: ( övre: 15 , vänster: 15 ) ) ) ; ) |
Här har vi inaktiverat scrollzoom och tillagt "zoomkontroll" placerad från det övre vänstra hörnet.
Nu måste vi lägga till en etikett på kartan, för artikeln laddar vi ner dess bild från http://medialoot.com/item/free-vector-map-location-pins/ och placerar den i koden enligt följande:
ymaps.ready(init) ; function init() ( var myMap; myMap = new ymaps.Map ("karta" , ( mitten: [ 55.7652 , 37.63836 ] , zoom: 17 , kontroller: ) ); myMap.behaviors .disable ("scrollZoom") ; myMap. kontroller .add ("zoomControl" , ( position: ( överst: 15 , vänster: 15 ) ) ); var myPlacemark = new ymaps.Placemark ([ 55.7649 , 37.63836 ] , ( ) , ( iconLayout: "defaultImage" : , iconImageSize: [ 40 , 51 ] , iconImageOffset: [ - 20 , - 47 ] ) ); myMap.geoObjects .add (myPlacemark) ; ) |
Här deklarerar vi en variabel mittPlatsmärke, där vi skriver markören, i den första parametern ymaps.Placemark ange etikettkoordinaterna och i den tredje parametern:
- ange i ikonLayout att en anpassad etikettbild kommer att användas;
- iconImageHref- sökväg till bilden;
- iconImageSize- ange storleken på bilden;
- iconImageOffset- vi indikerar förskjutningen från bildens övre vänstra hörn till bildens punkt, som vi pekar på objektet vi behöver. Detta är nödvändigt så att etikettens position inte kommer på avvägar när kartan skalas. Varför förskjutningen anges i negativa värden - bara Gud vet skaparen av API.
Och igenom myMap.geoObjects.add() lägg till en markör på kartan.
Och låt oss nu göra en ballong som kommer att visas när vi klickar på kartetiketten, vi tar ballongens layout och dess innehåll från http://designdeck.co.uk/a/1241
ymaps.ready(init) ; function init() ( var myMap; myMap = new ymaps.Map ("karta" , ( mitten: [ 55.7652 , 37.63836 ] , zoom: 17 , kontroller: ) ); myMap.behaviors .disable ("scrollZoom") ; myMap. kontroller .add ("zoomControl" , ( position: ( topp: 15 , vänster: 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 += "Victoria Tower Gardens " ; html += "" ; html +="City of London " ; html += "" ; html += "Storbritannien " ; html += "020 7641 5264 " ; html += " |
Vi är här:
- i ballonginnehåll ange innehållet som kommer att visas när ballongen öppnas;
- ballonglayout- ange att en anpassad bild kommer att användas som ballonglayout;
- ballongContentSize och ballongBildstorlek— Storlek på innehåll respektive bilder.
- balloonImageHref- sökväg till bilden;
- balloonImageOffset- förskjutning i förhållande till det övre vänstra hörnet;
- ballongShadow— inaktivera ballongens skugga (det påverkar ingenting med anpassade bilder).
En releasekandidat är en version av API:et som är tillgänglig för allmänt bruk, men som fortfarande är under godkännande. Innan releasekandidaten installeras som en stabil version, så snart den släpps, testas den för buggar som kan leda till försämring av API-funktionalitet. Genom att använda releasekandidater i dina projekt kan du hjälpa oss att i tid identifiera potentiella fel. Du kan också förtesta din app funktion med en ny version av API:et.
Releasekandidater bör användas i apputvecklings- och testmiljön. Detta hjälper dig att undvika fel i produktionsmiljön. Du kan aktivera en releasekandidat enligt följande:
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.
Вот его код:
I början ansluter vi kartans API på http://api-maps.yandex.ru/
Låt oss titta på alternativen mer detaljerat:
lang - ställs in av två parametrar language_region,
språk - tvåsiffrig språkkod. Specificerad i ISO 639-1-format.
region - tvåsiffrig landskod. Specificerad i ISO 3166-1-format.
På det här ögonblicket följande lokaler stöds:
lang=ru_RU;
lang=en_US;
lang=ru_UA;
lang=uk_UA;
lang=tr_TR.
Ytterligare alternativ kan användas:
coordorder - ordningen i vilken geografiska koordinater anges i API-funktioner som accepterar longitud-latitudpar som indata (till exempel Platsmärke).
Möjliga värden:
latlong - [latitud, longitud] - används som standard;
longlat - [longitud, latitud].
Standardvärde: latlong.
ladda - Lista över moduler som ska laddas.
Standardvärde: package.full.
läge - API-laddningsläge.
mode=release - API-kod kan laddas ner i paketerad form för att minimera trafik och körhastighet i webbläsaren;
mode=debug - nedladdningsläge som källkod.
Standardvärde: release.
Läs mer om anslutningsmöjligheter
För att visa kartan anges en behållare med en storlek som inte är noll, vilket HTML-element av blocktyp som helst kan användas som en behållare, i exemplet är det div.
Kartparametrar ställs in i koden:
myMap = new ymaps.Map('map', (
centrum: , // mitten av Nizhny Novgorod-kartan
zoom: 12 - zoomnivå
});
Kartan ska skapas efter att hela webbsidan har laddats. Detta kommer att se till att behållaren för kartan har skapats och kan nås med id. För att initiera kartan efter att sidan har laddats kan du använda funktionen ready().
Ready-funktionen kommer att anropas när API:et har laddats och DOM har genererats.
ymaps.ready(init);
funktion init()(
// Skapa en instans av kartan och bind den till behållaren med
// givet id ("karta").
myMap = new ymaps.Map('map', (
// När du initierar kartan måste du ange
// dess centrum och skalfaktor.
centrum: , // Nizhny Novgorod
zoom: 12
});
Som standard visar kartan alla tillgängliga kontroller.
Karttyp - schema.
API:et tillhandahåller fem inbyggda karttyper:
Schema (yandex#map) - som standard;
Satellit (yandex#satellit);
Hybrid (yandex#hybrid);
Människors karta (yandex#publicMap);
Hybrid av den nationella kartan (yandex#publicMapHybrid).
Exempel med bestämning av karttyp Satellit
Exempelkod:
Som jag sa tidigare, läggs standarduppsättningen av 'mediumMapDefaultSet'-kontroller till på kartan som standard.
För att lägga till de nödvändiga kontrollerna på kartan kan du ange en lista med motsvarande nycklar i kontrollparametern när du skapar kartan.
Här är exempelkoden för kartskala och typkontroller.
Exempelkod:
|
Det är möjligt att ställa in kartans beteende med hjälp av parametern beteenden.
Genom att ställa in dess värden kan vi aktivera eller inaktivera olika alternativ för kartans beteende:
skala kartan genom att dubbelklicka på musknappen;
dra kartan med musen eller en enda touch;
skala kartan när du väljer ett område med vänster musknapp;
skala kartan med en multi-touch touch;
skala kartan när du väljer ett område Högerklicka möss;
avståndsmätning;
zooma kartan med mushjulet.
Kodexempel med mushjulszoom inaktiverad.
|
Det är möjligt att ändra parametrarna för en karta efter att den har skapats.
Aktivera mushjulets zoom
myMap.behaviors.enable("scrollZoom");
Stäng av
myMap.behaviors.disable("scrollZoom");
Installerar en ny typ av karta Folk
myMap.setType('yandex#publicMap');
Skapar ett nytt kartcenter
Det var allt tills vidare.
Fortsättning följer…