From c9b0ddc55891ac6decd483e60834199bcd0ea680 Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Thu, 17 Mar 2022 15:50:17 +0800 Subject: [PATCH] python reader can read v2 archives (non-fixed leaf level) [#36] --- python/bin/pmtiles-show | 7 ++++++- python/pmtiles/reader.py | 19 ++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/python/bin/pmtiles-show b/python/bin/pmtiles-show index a7c50e7..71a7c46 100755 --- a/python/bin/pmtiles-show +++ b/python/bin/pmtiles-show @@ -18,7 +18,12 @@ with read(sys.argv[1]) as reader: print('root entries:', reader.root_entries) print('leaf directories:', len(set(reader.leaves.values()))) elif len(sys.argv) == 3: - print("list") + for k,v in reader.root_dir.items(): + print(f"{k[0]} {k[1]} {k[2]} {v[0]} {v[1]}") + for val in set(reader.leaves.values()): + leaf_dir, _ = reader.load_directory(val[0],val[1]//17) + for k,v in leaf_dir.items(): + print(f"{k[0]} {k[1]} {k[2]} {v[0]} {v[1]}") else: z = int(sys.argv[2]) x = int(sys.argv[3]) diff --git a/python/pmtiles/reader.py b/python/pmtiles/reader.py index 97040fb..aaedc45 100644 --- a/python/pmtiles/reader.py +++ b/python/pmtiles/reader.py @@ -53,19 +53,24 @@ class Reader: def root_entries(self): return int.from_bytes(self.mmap[8:10],byteorder='little') + @property + def leaf_level(self): + return next(iter(self.leaves))[0] + def get(self,z,x,y): val = self.root_dir.get((z,x,y)) if val: return self.mmap[val[0]:val[0]+val[1]] else: - z7_tile_diff = z - 7 - z7_tile = (7,x // (1 << z7_tile_diff),y // (1 << z7_tile_diff)) - val = self.leaves.get(z7_tile) - if val: - directory, _ = self.load_directory(val[0],val[1]//17) - val = directory.get((z,x,y)) + if len(self.leaves) > 0: + level_diff = z - self.leaf_level + leaf = (self.leaf_level,x // (1 << level_diff),y // (1 << level_diff)) + val = self.leaves.get(leaf) if val: - return self.mmap[val[0]:val[0]+val[1]] + directory, _ = self.load_directory(val[0],val[1]//17) + val = directory.get((z,x,y)) + if val: + return self.mmap[val[0]:val[0]+val[1]] def tiles(self): for k,v in self.root_dir.items():