Офлайн карты
MapKit SDK осуществляет загрузку данных о карте по сети интернет для отображения на устройстве пользователя. С помощью механизма офлайн-кэшей, MapKit SDK позволяет осуществить предварительную загрузку офлайн-карт, чтобы затем использовать их при отсутствии подключения к интернету.
В офлайн-режиме MapKit SDK предоставляет следующий функционал для загруженных регионов:
- отображение тайлов карты;
- построение автомобильных маршрутов без учета пробок;
- геосаджест и поиск.
Важно
Функционал офлайн-карт доступен только при наличии платной лицензии.
Регионы
Карта в MapKit SDK делится на отдельные регионы, каждому из них соответствует набор данных, которые можно загрузить и использовать в качестве офлайн-кэшей.
Регионами могут быть:
- города: Москва, Минск, Казань и т.д.;
- областные регионы, которые включают в себя несколько городов: Московская область, Минская область и т.д.;
- отдельные страны: Сербия, Финляндия, Армения и т.д.
В MapKit SDK регион описывается классом Region и предоставляет следующие данные:
id
- уникальный идентификатор региона;name
- название региона;center
- координаты центра региона;size
- размер в байтах для скачивания данных этого региона;releaseTime
- временная метка, когда офлайн карты для данного региона были последний раз обновлены на сервере;parentId
- идентификатор родительского региона, например: Москва в качестве родительского региона содержит Московскую область.
Получение списка регионов
Точкой входа в API управления офлайн-кэшами является класс OfflineCacheManager. Экземпляр этого класса хранится в виде синглтона в MapKit SDK. Для его получения используется метод MapKit.getOfflineCacheManager.
val offlineCacheManager = MapKitFactory.getInstance().offlineCacheManager
Для получения списка всех доступных регионов используется подписка на событие обновления списка регионов с помощью интерфейса RegionListUpdatesListener.
val listener = RegionListUpdatesListener {
val regions = offlineCacheManager.regions()
// Handle regions update
}
offlineCacheManager.addRegionListUpdatesListener(listener)
C помощью метода OfflineCacheManager.regions можно получить список обновленных регионов.
Состояние региона
Состояние региона описывается перечислением RegionState:
available
- офлайн-карты данного региона доступны для загрузки;downloading
- офлайн-карты в процессе загрузки;paused
- процесс загрузки был приостановлен и может быть возобновлен;completed
- загрузка данных завершена успешно;outdated
- на сервере есть более новая версия офлайн-карт для данного региона;unsupported
- офлайн-карты данного региона загружены, но больше не поддерживаются, после их удаления с устройства регион пропадет из доступных для загрузки;need_update
- данные сильно устарели, требуется загрузить новую версию.
Для получения текущего состояния для отдельного региона используется метод OfflineCacheManager.getState.
MapKit SDK предоставляет возможность подписаться на события изменения состояния регионов с помощью интерфейса RegionListener. Он предоставляет два метода для переопределения:
- RegionListener.onRegionStateChanged - оповещает об изменении состояния отдельного региона.
- RegionListener.onRegionProgress - оповещает об изменении статуса загрузки офлайн-карты региона.
val regionListener = object : RegionListener {
override fun onRegionStateChanged(regionId: Int) {
val state = offlineCacheManager.getState(regionId)
// Handle region state changes
}
override fun onRegionProgress(regionId: Int) {
val progress = offlineCacheManager.getProgress(regionId)
// Handle region progress changes
}
}
offlineCacheManager.addRegionListener(regionListener)
Дополнительная информация о регионах
При помощи следующих методов можно получить дополнительную информацию о регионах:
- OfflineCacheManager.getCities - получение списка из названий городов, которые содержит регион.
- OfflineCacheManager.getDownloadedReleaseTime - дата релиза загруженного региона.
Загрузка офлайн-карт
Для управления статусом загрузки офлайн-карт отдельного региона MapKit SDK предоставляет следующий набор методов:
- OfflineCacheManager.startDownload - начинает загрузку офлайн-карт;
- OfflineCacheManager.stopDownload - если загрузка карт была начата, отменяет ее;
- OfflineCacheManager.pauseDownload - приостанавливает загрузку офлайн-карт;
- OfflineCacheManager.drop - удаляет все офлайн-кэши для отдельного региона.
Совет
Используйте метод OfflineCacheManager.mayBeOutOfAvailableSpace для проверки наличия свободного места на устройстве прежде чем начинать загрузку.
Все методы управления статусом загрузки офлайн-карт принимают единственный аргумент - id региона, для которого применяется указанное действие. В результате выполнения данных методов состояние регионов может измениться. Так, например, если регион доступен для скачивания, то после вызова метода OfflineCacheManager.startDownload начнется его загрузка, и состояние региона изменится на downloading
.
Свойства загрузки
При помощи данных методов можно настроить свойства загрузки офлайн-карт:
- OfflineCacheManager.allowUseCellularNetwork - позволяет включить возможность загрузки и обновления офлайн-карт по мобильной сети (3G, LTE и т.п.).
- OfflineCacheManager.enableAutoUpdate - активирует автоматическое обновление офлайн-кэшей для регионов, которые находятся в состоянии
need_update
.
Обработка ошибок
В ходе загрузки происходит скачивание данных офлайн-карт с сервера и сохранения офлайн-кэшей на диске устройства. Для обработки различных ошибок, которые могут произойти в ходе данного процесса, используется интерфейс OfflineCacheManager.ErrorListener.
val listener = object : ErrorListener {
override fun onError(error: Error) {
when (error) {
is LocalError -> {
// Handle local error
}
is RemoteError -> {
// Handle remote error
}
else -> { // Undefined error }
}
}
override fun onRegionError(error: Error, regionId: Int) {
// Handle error for region with regionId id
}
}
Данный интерфейс предоставляет методы для обработки ошибок, связанных с загрузкой определенных регионов и работой OfflineCacheManager.
Ошибки могут быть двух типов:
- LocalError - ошибки на устройстве пользователя, например, повреждение диска, недостаток свободного места для сохранения;
- RemoteError - ошибки со стороны сервера.
Хранение офлайн-кэшей
Данные офлайн-карт, которые были получены во время их загрузки, MapKit SDK сохраняет на диске устройства в специальном формате офлайн-кэшей.
Для получения пути, по которому хранятся офлайн-кэши в файловой системе, используется метод OfflineCacheManager.requestPath.
offlineCacheManager.requestPath { path ->
// Handle requested path
}
Данный метод принимает в качестве аргумента интерфейс OfflineCacheManager.PathGetterListener, с помощью которого можно подписаться на событие получения пути.
Существует возможность изменить место хранения офлайн-кэшей на устройстве. Для этого предусмотрено два метода:
- OfflineCacheManager.setCachePath - позволяет изменить место на устройстве пользователя, в котором хранятся данные офлайн-кэшей. Если по заданному пути уже есть офлайн-кэши, то они будут использоваться, иначе, будут инициализированы новые кэши.
- OfflineCacheManager.moveData - переносит текущие офлайн-кэши в новое место на устройстве.
С помощью метода OfflineCacheManager.computeCacheSize можно посчитать сколько памяти занимают все офлайн-кэши на устройстве пользователя.
Метод OfflineCacheManager.clear используется для удаления офлайн-кэшей.
Исходный код
Подробнее с примерами использования API офлайн карт из MapKit SDK можно ознакомиться в демо-приложении map-offline
в нашем репозитории на GitHub.