diff --git a/python/pmtiles/reader.py b/python/pmtiles/reader.py index 5354107..d0dee2d 100644 --- a/python/pmtiles/reader.py +++ b/python/pmtiles/reader.py @@ -63,9 +63,10 @@ def traverse(get_bytes, header, dir_offset, dir_length): entries = deserialize_directory(get_bytes(dir_offset, dir_length)) for entry in entries: if entry.run_length > 0: - yield tileid_to_zxy(entry.tile_id), get_bytes( - header["tile_data_offset"] + entry.offset, entry.length - ) + for i in range(entry.run_length): + yield tileid_to_zxy(entry.tile_id + i), get_bytes( + header["tile_data_offset"] + entry.offset, entry.length + ) else: for t in traverse( get_bytes, diff --git a/python/test/test_reader_writer.py b/python/test/test_reader_writer.py index ec7647b..7837e58 100644 --- a/python/test/test_reader_writer.py +++ b/python/test/test_reader_writer.py @@ -1,7 +1,7 @@ import unittest from io import BytesIO from pmtiles.writer import Writer -from pmtiles.reader import Reader, MemorySource +from pmtiles.reader import all_tiles, Reader, MemorySource from pmtiles.tile import Compression, TileType, tileid_to_zxy, zxy_to_tileid @@ -46,3 +46,25 @@ class TestReaderWriter(unittest.TestCase): 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"), + ]) \ No newline at end of file