rio-pmtiles python package [#338] (#542)

Add rio-pmtiles command line tool. [#338]

This is derived from the original mapbox/rio-mbtiles implementation, with changes:

* output PMTiles only instead of MBTiles.
* Python 3.7+ only.
* remove --implementation, --image-dump, --append/--overwrite, --covers features.
* bump dependency versions.
* better progress reporting; add pyroaring. 
* update README and license texts.
* rio-pmtiles v0.0.6 on PyPI
This commit is contained in:
Brandon Liu
2025-03-24 20:50:53 +08:00
committed by GitHub
parent 1d897f4f7e
commit 63182e525d
36 changed files with 1296 additions and 2 deletions

View File

@@ -0,0 +1,70 @@
import unittest
from io import BytesIO
from pmtiles.writer import Writer
from pmtiles.reader import all_tiles, Reader, MemorySource
from pmtiles.tile import Compression, TileType, tileid_to_zxy, zxy_to_tileid
class TestReaderWriter(unittest.TestCase):
def test_roundtrip(self):
buf = BytesIO()
writer = Writer(buf)
writer.write_tile(zxy_to_tileid(0, 0, 0), b"1")
writer.write_tile(zxy_to_tileid(1, 0, 0), b"2")
writer.write_tile(zxy_to_tileid(2, 0, 0), b"3")
writer.finalize(
{
"tile_compression": Compression.UNKNOWN,
"tile_type": TileType.UNKNOWN,
},
{"key": "value"},
)
reader = Reader(MemorySource(buf.getvalue()))
self.assertEqual(reader.header()["version"], 3)
self.assertEqual(reader.header()["min_zoom"], 0)
self.assertEqual(reader.header()["max_zoom"], 2)
self.assertEqual(reader.header()["clustered"], True)
self.assertEqual(reader.metadata()["key"], "value")
self.assertEqual(reader.get(0, 0, 0), b"1")
self.assertEqual(reader.get(1, 0, 0), b"2")
self.assertEqual(reader.get(2, 0, 0), b"3")
self.assertEqual(reader.get(3, 0, 0), None)
def test_roundtrip_unclustered(self):
buf = BytesIO()
writer = Writer(buf)
writer.write_tile(zxy_to_tileid(1, 0, 0), b"2")
writer.write_tile(zxy_to_tileid(0, 0, 0), b"1")
writer.finalize(
{
"tile_compression": Compression.UNKNOWN,
"tile_type": TileType.UNKNOWN,
},
{},
)
reader = Reader(MemorySource(buf.getvalue()))
self.assertEqual(reader.header()["clustered"], False)
def test_all_tiles(self):
buf = BytesIO()
writer = Writer(buf)
writer.write_tile(zxy_to_tileid(0, 0, 0), b"1")
writer.write_tile(zxy_to_tileid(1, 0, 0), b"1")
writer.write_tile(zxy_to_tileid(2, 0, 0), b"2")
writer.finalize(
{
"tile_compression": Compression.UNKNOWN,
"tile_type": TileType.UNKNOWN,
},
{"key": "value"},
)
reader = Reader(MemorySource(buf.getvalue()))
tiles = list(all_tiles(reader.get_bytes))
self.assertEqual(tiles, [
((0,0,0), b"1"),
((1,0,0), b"1"),
((2,0,0), b"2"),
])