All pages
Powered by GitBook
1 of 3

Import/Export

FMTC allows stores (including all necessary tiles and metadata) to be exported to an 'archive'/a standalone file, then imported on the same or a different device!

Before using FMTC, especially to bulk download or import/export, ensure you comply with the appropriate restrictions and terms of service set by your tile server. Failure to do so may lead to any punishment, at the tile server's discretion.

This library and/or the creator(s) are not responsible for any violations you make using this package.

For example, OpenStreetMap's tile server forbids bulk downloading: https://operations.osmfoundation.org/policies/tiles. And Mapbox has restrictions on importing/exporting from outside of the user's own device.

For testing purposes, check out the testing tile server included in the FMTC project: Testing Tile Server.

FMTC does not support exporting tiles to a raw Z/X/Y directory structure with image files that can be read by other programs.

For example, this can be used to create backup systems to allow users to store maps for later off-device, sharing/distribution systems, or to distribute a preset package of tiles to all users without worrying about managing IO or managing assets, and still allowing users to update their cache afterward!


External functionality is accessed via FMTCRoot.external('~/path/to/file.fmtc').

The path should only point to a file. When used with export, the file does not have to exist. Otherwise, it should exist.

The path must be accessible to the application. For example, on Android devices, it should not be in external storage, unless the app has the appropriate (dangerous) permissions.

On mobile platforms (/those platforms which operate sandboxed storage), it is recommended to set this path to a path the application can definitely control (such as app support), using a path from 'package:path_provider', then share it somewhere else using the system flow (using 'package:share_plus').

Exporting

The export() method copies the stores, along with all necessary tiles, to an archive at the specified location (creating it if non-existent, overwriting it otherwise), in the FMTC (.fmtc) format.

The specified stores must contain at least one tile.

Archives are backend specific. They cannot necessarily be imported by a backend different to the one that exported it.

Logoexport method - RootExternal class - flutter_map_tile_caching library - Dart API
await FMTCRoot.external('~/path/to/file.fmtc').export(['storeName']);

Importing

The import() method copies the specified archive to a temporary location, then opens it and extracts the specified stores (or all stores if none are specified) & all necessary tiles, merging them into the in-use database. The specified archive must exist, must be valid, and should contain all the specified stores, if applicable.

Logoimport method - RootExternal class - flutter_map_tile_caching library - Dart API

There is no support for directly overwriting the in-use database with the archived database, but this may be performed manually while FMTC is uninitialised.

There must be enough storage space available on the device to duplicate the entire archive, and to potentially grow the in-use database.

This is done to preserve the original archive, as this operation writes to the temporary archive. The temporary archive is deleted after the import has completed.

final importResult =
    await FMTCRoot.external('~/path/to/file.fmtc').import(['storeName']);

The returned value is complex. See the API documentation for more details:

LogoImportResult typedef - flutter_map_tile_caching library - Dart API

Conflict Resolution Strategies

If an importing store has the same name as an existing store, a conflict has occurred, because stores must have unique names. FMTC provides 4 resolution strategies:

  • skip Skips importing the store

  • replace Deletes the existing store, replacing it entirely with the importing store

  • rename Appends the current date and time to the name of the importing store, to make it unique

  • merge Merges the two stores' tiles and metadata together

In any case, a conflict between tiles will result in the newer (most recently modified) tile winning (it is assumed it is more up-to-date).

LogoImportConflictStrategy enum - flutter_map_tile_caching library - Dart API

List Stores

If the user must be given a choice as to which stores to import (or it is helpful to know), and it is unknown what the stores within the archive are, the listStores getter will list the available store names without performing an import.

The same storage pitfalls as import exist. listStores must also duplicate the entire archive.

LogolistStores property - RootExternal class - flutter_map_tile_caching library - Dart API