Convert TMS tile folders to MBTiles/PMTiles and serve them as TMS/WMTS endpoints
Project description
tilepack
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.xmlhttp://localhost:8000/{z}/{x}/{y}.png
WMTS endpoints:
http://localhost:8000/WMTSCapabilities.xml— GetCapabilitieshttp://localhost:8000/wmts/{Layer}/{TileMatrixSet}/{z}/{row}/{col}.png— RESTful tileshttp://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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db30d257d9da593df2499a634dd7680a1ec4705b63cf3e944de8c159a523c208
|
|
| MD5 |
5a57084bca46ee3937d3b5bad4a59b26
|
|
| BLAKE2b-256 |
b08d86a4eac8e90278f4090507f71f875376085fe72c844a23c524753b04f6a5
|
Provenance
The following attestation bundles were made for tilepack-0.2.0.tar.gz:
Publisher:
release.yml on ashnair1/tilepack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tilepack-0.2.0.tar.gz -
Subject digest:
db30d257d9da593df2499a634dd7680a1ec4705b63cf3e944de8c159a523c208 - Sigstore transparency entry: 1006683182
- Sigstore integration time:
-
Permalink:
ashnair1/tilepack@650d0d0400be710ffd1e5ae870944ba500b3a947 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/ashnair1
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@650d0d0400be710ffd1e5ae870944ba500b3a947 -
Trigger Event:
release
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c0b01c1a09ef84d1ef48f53eb0debaa131e8dd8b3ff0096bf352fafdc2e9323c
|
|
| MD5 |
bf593f79fb0f5f5fcc53768d8db6d3ed
|
|
| BLAKE2b-256 |
292483daaa3ede47ef88adc5f83e3e3419b4ea3d1a8d579adebbb8fb07e9578c
|
Provenance
The following attestation bundles were made for tilepack-0.2.0-py3-none-any.whl:
Publisher:
release.yml on ashnair1/tilepack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tilepack-0.2.0-py3-none-any.whl -
Subject digest:
c0b01c1a09ef84d1ef48f53eb0debaa131e8dd8b3ff0096bf352fafdc2e9323c - Sigstore transparency entry: 1006683183
- Sigstore integration time:
-
Permalink:
ashnair1/tilepack@650d0d0400be710ffd1e5ae870944ba500b3a947 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/ashnair1
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@650d0d0400be710ffd1e5ae870944ba500b3a947 -
Trigger Event:
release
-
Statement type: