Skip to main content

Convert TMS tile folders to MBTiles/PMTiles and serve them as TMS/WMTS endpoints

Project description

tilepack

CI Docs PyPI Python License: MIT

Pack raster tile folders (TMS or XYZ) into single-file archives (MBTiles / PMTiles) and serve them as TMS and WMTS endpoints over HTTP.

Why

Raster tile folders contain thousands of small PNG files in deeply nested z/x/y directories. This makes them slow to copy, hard to manage, and fragile to transfer. Tilepack solves this by packing tiles into a single archive file while still exposing standard TMS and WMTS HTTP endpoints that clients like QGIS and CesiumForUnreal can consume directly.

Install

Requires Python 3.11+.

pip install tilepack

For development:

git clone https://github.com/ashnair1/tilepack.git
cd tilepack
uv sync --group dev

Usage

Verify tiles

Scan a tile folder or archive and report zoom levels, tile counts, format, and bounds.

tilepack verify ./path/to/tiles      # TMS/XYZ folder
tilepack verify output.mbtiles       # MBTiles archive
tilepack verify output.pmtiles       # PMTiles archive

Convert to archive

The output format is inferred from the file extension. The input tile scheme (TMS or XYZ) is auto-detected, or can be specified explicitly.

# Auto-detect input scheme
tilepack convert ./path/to/tiles output.mbtiles
tilepack convert ./path/to/tiles output.pmtiles

# Specify input scheme explicitly
tilepack convert ./path/to/tiles output.mbtiles --scheme xyz

Serve as TMS + WMTS endpoint

Start a local HTTP server exposing both TMS and OGC WMTS 1.0.0 endpoints from an archive file.

tilepack serve output.mbtiles --port 8000
tilepack serve output.pmtiles --port 8000

TMS endpoints:

  • http://localhost:8000/tilemapresource.xml
  • http://localhost:8000/{z}/{x}/{y}.png

WMTS endpoints:

  • http://localhost:8000/WMTSCapabilities.xml — GetCapabilities
  • http://localhost:8000/wmts/{Layer}/{TileMatrixSet}/{z}/{row}/{col}.png — RESTful tiles
  • http://localhost:8000/wmts?Service=WMTS&Request=GetTile&... — KVP tiles

To load in QGIS: Layer > Add WMS/WMTS Layer > New, set URL to http://localhost:8000/WMTSCapabilities.xml, then Connect and Add.

Validate correctness

Randomly sample tiles from the original folder, fetch them from the running server, and verify byte-exact matches.

# Start the server in one terminal, then in another:
tilepack selftest ./path/to/tiles --base-url http://127.0.0.1:8000 --samples 200

MBTiles vs PMTiles

MBTiles PMTiles
Format SQLite database Cloud-optimised archive (Hilbert-curve index)
File count 1 1
Needs a tile server Yes No (supports HTTP range requests)
Best for Local / on-prem serving Cloud storage (S3, Azure Blob, GCS)

Use MBTiles for local or on-prem serving (e.g. feeding CesiumForUnreal on the same machine or network). It's a SQLite file with fast tile lookups and no coordinate flipping at read time.

Use PMTiles if you plan to host tiles in cloud storage. PMTiles can be served directly from a bucket via HTTP range requests with no tile server needed. However, TMS clients like CesiumForUnreal cannot consume PMTiles directly — they still need a server translating to TMS endpoints.

Either format works identically when served through tilepack serve — clients see the same TMS and WMTS endpoints regardless of the backing archive.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tilepack-0.2.0.tar.gz (83.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tilepack-0.2.0-py3-none-any.whl (18.3 kB view details)

Uploaded Python 3

File details

Details for the file tilepack-0.2.0.tar.gz.

File metadata

  • Download URL: tilepack-0.2.0.tar.gz
  • Upload date:
  • Size: 83.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tilepack-0.2.0.tar.gz
Algorithm Hash digest
SHA256 db30d257d9da593df2499a634dd7680a1ec4705b63cf3e944de8c159a523c208
MD5 5a57084bca46ee3937d3b5bad4a59b26
BLAKE2b-256 b08d86a4eac8e90278f4090507f71f875376085fe72c844a23c524753b04f6a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for tilepack-0.2.0.tar.gz:

Publisher: release.yml on ashnair1/tilepack

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tilepack-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: tilepack-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 18.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tilepack-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c0b01c1a09ef84d1ef48f53eb0debaa131e8dd8b3ff0096bf352fafdc2e9323c
MD5 bf593f79fb0f5f5fcc53768d8db6d3ed
BLAKE2b-256 292483daaa3ede47ef88adc5f83e3e3419b4ea3d1a8d579adebbb8fb07e9578c

See more details on using hashes here.

Provenance

The following attestation bundles were made for tilepack-0.2.0-py3-none-any.whl:

Publisher: release.yml on ashnair1/tilepack

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page