GIS-LAB

Географические информационные системы и дистанционное зондирование

Релиз OpenLayers 2.12: подробнее о новом

Denis Rykov, 01.07.2012

Вышел релиз 2.12 библиотеки OpenLayers (скачать). Публикуем перевод официального анонса.

Основные улучшения и дополнения

Zoom Control

Простой контрол для добавления кнопок zoom in/out на карту теперь может быть стилизован при помощи CSS.
Пример.

Соответствующие тикеты/пулл реквесты: 291, 292

Сборки

Текущая версия OpenLayers поставляется в виде трёх сборок:

  • OpenLayers.js
  • OpenLayers.light.js
  • OpenLayers.mobile.js

Соответствующие тикеты/пулл реквесты: 254, 261

style.mobile.css

Директория theme/default теперь включает CSS файл style.mobile.css специально для мобильных устройств. Подключается он следующим образом:

<link rel="stylesheet" href="openlayers/theme/default/style.mobile.css" type="text/css"> 

Значения по умолчанию в части проекций

При использовании карты в проекции EPSG:4326 и EPSG:900913 автоматически определяются значения maxExtent и units. Это значительно упрощает конструтор карты и слоя.

Например, карта, описанная следующим образом:

map = new OpenLayers.Map({ div: "map", projection: "EPSG:900913", units: "m", maxExtent: new OpenLayers.Bounds( -20037508.34, -20037508.34, 20037508.34, 20037508.34 ) }); 

теперь может быть сконфигурирована так:

map = new OpenLayers.Map({ div: "map", projection: "EPSG:900913" }); 

Соответствующие тикеты/пулл реквесты: 219

Оффлайновое хранилище тайлов

При помощи новых контролов OpenLayers.Control.CacheRead и OpenLayers.Control.CacheWrite приложение может кэшировать тайлы для оффлайнового использования или для использования при медленном коннекте.

Соответствующие тикеты/пулл реквесты: 301

Анимация

Отображение тайлов может быть анимировано при помощи свойства transitions CSS3. Transitions оперирует над свойством opacity. Пример соответствующего CSS правила, используемого в дефолтной теме OpenLayers:

.olLayerGrid .olTileImage { -webkit-transition: opacity 0.2s linear; -moz-transition: opacity 0.2s linear; -o-transition: opacity 0.2s linear; transition: opacity 0.2s linear; } 

Пользователь может переопределить это правило и использовать собственные настройки. Отключается анимация следующим образом:

.olLayerGrid .olTileImage { -webkit-transition: none; -moz-transition: none; -o-transition: all 0 none; transition: none; } 

По умолчанию анимация отключена для слоёв, состоящих из одного тайла.

Соответствующие тикеты/пулл реквесты: 127

Очередь тайлов

Загрузка тайлов осуществляется в виде очереди, что даёт больший контроль над запросами к серверу. Незавершённых запросов тайлов, которые больше не нужны (например, после изменения масштаба или сдвига) можно избежать, что ведёт к росту производительности и уменьшению нагрузки на сервер.

Соответствующие тикеты/пулл реквесты: 179

Tile Canvas

Теперь у тайлов есть метод getCanvasContext, который может быть использована для различных целей, например, для замены значений пикселов или сохранения изображения в файл и т.д.

Пример.

Соответствующие тикеты/пулл реквесты: 160

Улучшение взаимодействия событий в тайловых слоях

Событие слоя tileloaded возвращает ссылку на загруженный тайл. Новое событие tileloaderror делает то же самое и срабатывает в момент, когда невозможно загрузить тайл.

Соответствующие тикеты/пулл реквесты: 283

Полная переработка поддержки тайлов

Код, отвечающий за поддержку тайлов, был полностью переписан, что позволило достичь увеличиния производительности и упростить код.

Соответствующие тикеты/пулл реквесты: 16

Непрерывный зум

Тайловые слои наравне с однотайловыми могут отображаться с разрешением, отличным от разрешений, поддерживаемых предоставлющими их сервисами. Это достигается путём их растяжения и обеспечивается установкой свойства fractionalZoom в значение true.

Пример.

Соответствующие тикеты/пулл реквесты: 3531, 5

Поведение, изменившееся с момента выхода последнего релиза

Отмен поддержки слоя MultiMap

Класс OpenLayers.Layer.MultiMap полностью удалён, так как сервис MultiMap перестал функционировать.

Соответствующие тикеты/пулл реквесты: 328

?зменение GPX API

Свойство gpxns было удалено. Пространство имён GPX теперь определено в свойстве namespaces и не предназначено для переопределения.

GPX также поддерживает базовый функционал записи.

Соответствующие тикеты/пулл реквесты: 221

Функции, возвращающие значения

В предыдущих релизах некоторые функции отображали сообщение об ошибке и возвращали undefined, null или false в случае если были переданы некорректные аргументы. Теперь эти функции в подобных ситуациях возвращают исключения. Список изменённых функций:

  • OpenLayers.Bounds.add возвращает исключение TypeError если x или y равно null
  • OpenLayers.LonLat.add возвращает исключение TypeError если lon или lat равно null
  • OpenLayers.Pixel.add возвращает исключение TypeError если x или y равно null
  • OpenLayers.Filter.Comparison.value2regex возвращает исключение Error если wildcard равно "."
  • OpenLayers.Layer.PointTrack.addNodes возвращает исключение TypeError если endPoint не точка
  • OpenLayers.Layer.Vector.getFeatureFromEvent возвращает исключение Error если у слоя нет рендерера

Соответствующие тикеты/пулл реквесты: 3320

?зменения в форматах WMTSCapabilities и SOSCapabilities

Структура объекта, возвращаемого Format.WMTSCapabilities:read и Format.SOSCapabilities:read немного изменилась.

Свойство WMTSCapabilities operationsMetadata.GetCapabilities.dcp.http.get теперь представляет собой массив объектов с двумя свойствами: url и constrains. Если в вашем приложении используется вызов operationsMetadata.GetCapabilities.dcp.http.get, то он должен быть заменён на operationsMetadata.GetCapabilities.dcp.http.get[0].url.

Аналогично и для SOSCapabilities.

Примеры тестов, отражающих изменения: SOSCapabilities/v100.html и WMTSCapabilities/v100.html.

Соответствующие тикеты/пулл реквесты: 3568, 40

Отказ от использования Rico

Классы и объекты Rico объявлены устаревшими. Это имеет следующие последствия:

Вызов конструктора устаревшего класса Popup.AnchoredBubble теперь отображает сообщение об ошибке в консоле. Если вам необходимы попапы с закруглёнными углами – используйте Popup.FramedClould, или Popup.Anchored и CSS свойство border-radius.

Свойство roundedCorner контрола Control.LayerSwitcher объявлено устаревшим и по умолчанию выставлено в значение false. При попытке установки его в true в консоли появится сообщение об ошибке. Если вы всё же хотите установить свойство roundedCorner в значение true (не следует так делать!), то необходимо самостоятельно загружать Rico/Corner.js и Rico/Color.js. Это можно сделать в том числе и при самостоятельной сборке, путём включения в неё Rico/Corner.js. Скругление углов для Control.LayerSwitcher настраивается следующим образом:

.olControlLayerSwitcher .layersDiv { border-radius: 10px 0 0 10px; } 

В последующих релизах планируется перенести код Rico и AnchoredBubble в deprecated.js.

Соответствующие тикеты/пулл реквесты: 99

?зменения в классе Geometry

Класс OpenLayers.Geometry больше не зависит от OpenLayers.Format.WKT и OpenLayers.Feature.Vector. Если вам нужен метод OpenLayers.Geometry.fromWKT, то необходимо в явном виде включить файл OpenLayers/Format/WKT.js в сборку.

Без включения поддержки формата WKT метод OpenLayers.Geometry::toString возвращает “[object Object].” В предыдущих релизах он возвращал WKT-представление геометрии. Теперь же для этого необходимо в явном виде при сборке указывать файл OpenLayers/Format/WKT.js.

Соответствующие тикеты/пулл реквесты: 101

Слой Google v3

Данный релиз исправляет проблемы с кликабельными элементами, поставляемыми Google (типа всплывающих постоянно попапов). На сегодняшний день OpenLayers.Layer.Google.v3 совместим с текущей замороженной версией Google API (3.7), а также с текущим релизом и ночной сборкой (3.7 и 3.9), но будьте готовы, что Google может поменять поведение этих элементов в следующих версиях и потребуются дополнительные изменения в OpenLayers.

Рекомендуется в продакшене использовать только замороженную версию Google API.

Соответствующие тикеты/пулл реквесты: 472

OSM and Bing Layers

Класс Layer.OSM определён в отдельном файле OpenLayers/Layer/OSM.js. Поэтому тем, кто использует Layer.OSM, следует включить в сборку OpenLayers/Layer/OSM.js вместо OpenLayers/Layer/XYZ.js.

Соответствующие тикеты/пулл реквесты: 138, 144

У класса OpenLayers.Tile.Image появился метод, позволяющий получить контекст canvas для обработки тайлов. Так как и OSM и Bing устанавливают заголовки тайлов Access-Control-Allow-Origin, то можно непосредственно манипулировать canvas. При работе с кастомными OSM тайлами, загружаемыми с серверов, которые не устанавливают заголовки Access-Control-Allow-Origin, необходимо конфигурировать слой с опцией:

tileOptions: {crossOriginKeyword: null} 

OpenLayers.Layer.OSM и OpenLayers.Layer.Bing больше не имеют значений по умолчанию для свойств maxExtent, maxResolutions и units. Это может привести к поломке приложений, сконфигурированных с неверной опцией maxResolution равной 156543.0339 (так было показано в официальных примерах до версии 2.11), правильное значение – 156543.03390625. Однако сейчас нет необходимости вручную определять maxResolution (см. следующий раздел).

Projection и SphericalMercator

В предыдущих релизах при работе со слоями, находящимися в проекции Web Mercator (например, Google, Bing, OSM), необходимо было определять вручную значения projection, maxExtent, maxResolutions и units. Теперь OpenLayers предоставляет механизм управления этими значениями по умолчанию, то есть теперь достаточно просто указать проекцию. Данный функционал описан в классе OpenLayers.Projection.

Раньше:

new OpenLayers.Map({ div: "map", projection: "EPSG:900913", maxResolution: 156543.03390625, maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34), units: "m", layers: [ new OpenLayers.Layer.Google("Google Streets"), new OpenLayers.Layer.OSM(null, null, {isBaseLayer: false, opacity: 0.7}) ], zoom: 1 }); 

Сейчас:

new OpenLayers.Map({ div: "map", projection: "EPSG:900913", layers: [ new OpenLayers.Layer.Google("Google Streets"), new OpenLayers.Layer.OSM(null, null, {isBaseLayer: false, opacity: 0.7}) ], zoom: 1 }); 

В предыдущих релизах преобразование координат между EPSG:4326 и EPSG:900913 было определено в файле SphericalMercator.js. В 2.12 эти преобразования перенесены в Projection.js. Projection.js подключается как зависимость в сборках с поддержкой любого типа слоёв.

Соответствующие тикеты/пулл реквесты: 219

Если вы по прежнему хотите использовать методы OpenLayers.Layer.SphericalMercator.forwardMercator или inverseMercator, то должны явным образом подключить SphericalMercator.js в свою сборку. Сейчас только слой Google зависит от SphericalMercator.js.

Соответствующие тикеты/пулл реквесты: 153

QueryStringFilter

OpenLayers.Protocol.HTTP больше не зависит от OpenLayers.Format.QueryStringFilter. Если вам это необходимо – включите соответствующий файл в свою сборку.

Соответствующие тикеты/пулл реквесты: 147, 148

?зменения в getURLasync

Внутренняя функция OpenLayers.Layer.getURLasync теперь принимает на вход охват, callback и scope. Функция больше не нуждается в обновлении передаваемых аргументов, а просто возвращает URL.

?зменения при конфигурировании базового слоя с опцией wrapDateLine: true

Надёжная работа редактирования векторных объектов, пересекающих линию дат.

OpenLayers.Util.onImageLoadError больше не существует

Чтобы заменить тайл, который по каким-либо причинам не может быть загружен, неким статическим изображением, опишите его в css в селекторе для класса .olImageLoadError (например, указав свойство background-image).

Для более сложной обработки ошибок, связанных с загрузкой тайлов, используйте событие слоя tileerror.

Соответствующие тикеты/пулл реквесты: 283

Устаревшие компоненты

В последних релизах серии 2.x некоторые свойства, методы и конструкторы были объявлены устаревшими. В 2.12 весь устаревший функционал вынесен в отдельный файл deprecated.js. Если вы используете какой либо из конструкторов или методов, представленных ниже, то должны включить файл deprecated.js в свою сборку (или добавить его в отдельный тег <script> после OpenLayers.js).

  • OpenLayers.Class.isPrototype
  • OpenLayers.Class.create
  • OpenLayers.Class.inherit
  • OpenLayers.Util.clearArray
  • OpenLayers.Util.setOpacity
  • OpenLayers.Util.safeStopPropagation
  • OpenLayers.Util.getArgs
  • OpenLayers.nullHandler
  • OpenLayers.loadURL
  • OpenLayers.parseXMLString
  • OpenLayers.Ajax.* (all methods)
  • OpenLayers.Element.hide
  • OpenLayers.Element.show
  • OpenLayers.Element.getDimensions
  • OpenLayers.Tile.prototype.getBoundsFromBaseLayer
  • OpenLayers.Control.MouseDefaults
  • OpenLayers.Control.MouseToolbar
  • OpenLayers.Layer.Grid.prototype.getGridBounds
  • OpenLayers.Format.XML.prototype.concatChildValues
  • OpenLayers.Layer.WMS.Post
  • OpenLayers.Layer.WMS.Untiled
  • OpenLayers.Layer.MapServer.Untiled
  • OpenLayers.Tile.WFS
  • OpenLayers.Feature.WFS
  • OpenLayers.Layer.WFS
  • OpenLayers.Layer.VirtualEarth
  • OpenLayers.Protocol.SQL
  • OpenLayers.Protocol.SQL.Gears
  • OpenLayers.Layer.Yahoo
  • OpenLayers.Layer.GML
  • OpenLayers.Geometry.Rectangle
  • OpenLayers.Renderer.NG
  • OpenLayers.Renderer.SVG2

Кроме того, OpenLayers по умолчанию больше не модифицирует нативные объекты. Если вам необходимо что-либо из перечисленного ниже списка, то это находится в deprecated.js.

  • String.prototype.startsWith
  • String.prototype.contains
  • String.prototype.trim
  • String.prototype.camelize
  • Function.prototype.bind
  • Function.prototype.bindAsEventListener
  • Event.stop

Комментарии (7) к статье “Релиз OpenLayers 2.12: подробнее о новом”

  1. Константин Токар says:

    >Слой Google v3

    Основной вопрос не раскрыт – считается ли OpenLayers враппером над google maps? Если да, то его использование запрещается? Если нет – согласен ли гугл с этим? Пока такое ощущение, что гуглокарты придётся выводить из оборота полностью.

    • val says:

      Нет, не считается.
      Увлеченность слабоадаптируемыми схемами монетизации создает локальные проблемы.
      Поэтому да так нет. Но вы можете просто отдать ответственность корпорации. Если там народ адекватный, они поймут юмор ситуации. В конце концов, им надо ехать, а не шашечки считать. Так что, если враппер реализован, это поможет. Не захотят гуглеры портить карму из за своей неповоротливости.

      • Константин Токар says:

        >Нет, не считается.

        А можно ссылочку, где Гугл или команда OpenLayers это заявили?

        • val says:

          https://github.com/openlayers/openlayers/pull/472 – посмотрите обсуждение, особенно комменты Mano Marks.
          Мне известен пока один лицензированный полноценный сторонний сервис http://www.arc2earth.com/services/data-services/ – там есть взаимные договоренности.

          • Константин Токар says:

            По первой ссылке информации о проблеме я не нашёл, может быть плохо смотрел. Мой вопрос был вызван вот этим разделом :

            10.2 Restrictions on the Types of Applications that You are Permitted to Build with the Maps API(s). Except as explicitly permitted in Section 8 (Licenses from Google to You) or the Maps APIs Documentation, you must not (nor may you permit anyone else to) do any of the following:

            (a) No “Wrapping.” You must not create or offer a “wrapper” for the Service, unless you obtain Google’s written consent to do so. For example, you are not permitted to: (i) use or provide any part of the Service or Content (such as map imagery, geocoding, directions, places, or terrain data) in an API that you offer to others; or (ii) create a Maps API Implementation that reimplements or duplicates Google Maps/Google Earth. For clarity, you are not “re-implementing or duplicating” Google Maps/Google Earth if your Maps API Implementation provides substantial additional features or content beyond Google Maps/Google Earth, and those additional features or content constitute the primary defining characteristic of your Maps API Implementation.

        • val says:

          За весь гугль не отвечу.
          Попробуйте написать “Mano Marks” на майл. Он в курсе этого сервиса, так что никого не подведете. Там вполне могут быть неофициальные внутренние соглашения.
          Можете сослаться на обсуждение https://github.com/openlayers/openlayers/pull/472 – он там поучаствовал.

Оставьте комментарий


(Геокруг)

Если Вы обнаружили на сайте ошибку, выберите фрагмент текста и нажмите Ctrl+Enter