Вышел релиз 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
>Слой Google v3
Основной вопрос не раскрыт – считается ли OpenLayers враппером над google maps? Если да, то его использование запрещается? Если нет – согласен ли гугл с этим? Пока такое ощущение, что гуглокарты придётся выводить из оборота полностью.
Нет, не считается.
Увлеченность слабоадаптируемыми схемами монетизации создает локальные проблемы.
Поэтому да так нет. Но вы можете просто отдать ответственность корпорации. Если там народ адекватный, они поймут юмор ситуации. В конце концов, им надо ехать, а не шашечки считать. Так что, если враппер реализован, это поможет. Не захотят гуглеры портить карму из за своей неповоротливости.
>Нет, не считается.
А можно ссылочку, где Гугл или команда OpenLayers это заявили?
https://github.com/openlayers/openlayers/pull/472 – посмотрите обсуждение, особенно комменты Mano Marks.
Мне известен пока один лицензированный полноценный сторонний сервис http://www.arc2earth.com/services/data-services/ – там есть взаимные договоренности.
По первой ссылке информации о проблеме я не нашёл, может быть плохо смотрел. Мой вопрос был вызван вот этим разделом :
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.
За весь гугль не отвечу.
Попробуйте написать “Mano Marks” на майл. Он в курсе этого сервиса, так что никого не подведете. Там вполне могут быть неофициальные внутренние соглашения.
Можете сослаться на обсуждение https://github.com/openlayers/openlayers/pull/472 – он там поучаствовал.
Обнадёживающие и разъясняющие сведения:
http://www.mail-archive.com/openlayers-dev@lists.osgeo.org/msg02148.html