Как реализовать автономные карты с помощью osmdroid, сохранив изображения листов карты в базе данных sqlite? - PullRequest
8 голосов
/ 15 ноября 2011

У меня есть проект, который также требует отображения данных карты в автономном режиме. Я использовал карты OpenStreet для того же. Я сохранил изображения карты (тайлы), и на каждую плитку ссылается ключ тайла в базе данных. Я хочу получить доступ к этим плиткам карты из базы данных и использовать их соответственно.

Пожалуйста, предложите мне.

Заранее спасибо.

Ответы [ 2 ]

22 голосов
/ 27 ноября 2011

Плитки карты в Osmdroid предоставляются провайдерами листов карты.Поставщик плиток по умолчанию, используемый Osmdroid: MapTileProviderBasic .Этот провайдер расширяет MapTileProviderArray , что означает, что он является массивом нескольких других провайдеров плиток - при запросе плитки у этих провайдеров листов один за другим запрашивается изображение плитки, пока один из них не предоставит его.Взгляните на конструктор MapTileProviderBasic:

public MapTileProviderBasic(final IRegisterReceiver pRegisterReceiver,
              final INetworkAvailablityCheck aNetworkAvailablityCheck, 
                                        final ITileSource pTileSource) {

    super(pTileSource, pRegisterReceiver);    
    final TileWriter tileWriter = new TileWriter();

    final MapTileFilesystemProvider fileSystemProvider = 
        new MapTileFilesystemProvider(pRegisterReceiver, pTileSource);
    mTileProviderList.add(fileSystemProvider);

    final MapTileFileArchiveProvider archiveProvider = 
        new MapTileFileArchiveProvider(pRegisterReceiver, pTileSource);
    mTileProviderList.add(archiveProvider);

    final MapTileDownloader downloaderProvider = 
        new MapTileDownloader(pTileSource, tileWriter, aNetworkAvailablityCheck);
    mTileProviderList.add(downloaderProvider);
}

В массив провайдеров добавлено три провайдера листов карты в следующем порядке:

  • MapTileFilesystemProvider -предоставляет плитки из файловой системы (каталог SD-карты)
  • MapTileFileArchiveProvider - предоставляет плитки из архива в файловой системе
  • MapTileDownloader - предоставляет плитки путем загрузки их из Интернета (например, из OSM)серверы)

Таким образом, MapTileProviderBasic сначала ищет данную плитку в файловой системе, если плитка недоступна, она ищет ее в архивных файлах и снова, если она там недоступна,загружает плитку из Интернета.

Хорошо, это механизм по умолчанию.Если вы хотите изменить этот механизм для поиска плиток, хранящихся в БД, вы можете создать свой собственный класс, подобный MapTileProviderBasic.Таким образом, ваш класс может также расширить MapTileProviderArray и просто использовать других провайдеров в конструкторе.В Osmdroid есть класс DatabaseFileArchive , который, вероятно, может помочь вам в чтении плиток из БД.

После создания собственного провайдера плиток вы должны использовать его вместо стандартного.Поставщики листов карты прикреплены к MapView.Некоторые из конструкторов MapView принимают MapTileProviderBase в качестве аргумента - вы можете использовать один из них для присоединения вашего собственного провайдера.

1 голос
/ 15 декабря 2014

Самый простой способ заставить автономные карты работать с провайдером по умолчанию MapTileProviderBasic - это поместить архив (ы) вашей карты в OSMDROID_PATH.

Другими словами, загрузите файл .zip, .sqlite, .mbtiles или .gemf в каталог osmdroid/.

Если вы посмотрите на MapTileFileArchiveProvider, вы увидите, что он вызывает getArchiveFiles() в ArchiveFileFactory, который выбирает подходящего провайдера архива на основе расширений файлов.

...