| 84 | self.addressed_tiles += 1 |
| 85 | |
| 86 | def finalize(self, header, metadata): |
| 87 | header["addressed_tiles_count"] = self.addressed_tiles |
| 88 | header["tile_entries_count"] = len(self.tile_entries) |
| 89 | header["tile_contents_count"] = len(self.hash_to_offset) |
| 90 | |
| 91 | self.tile_entries = sorted(self.tile_entries, key=lambda e: e.tile_id) |
| 92 | |
| 93 | header["min_zoom"] = tileid_to_zxy(self.tile_entries[0].tile_id)[0] |
| 94 | header["max_zoom"] = tileid_to_zxy(self.tile_entries[-1].tile_id)[0] |
| 95 | |
| 96 | root_bytes, leaves_bytes, num_leaves = optimize_directories( |
| 97 | self.tile_entries, 16384 - 127 |
| 98 | ) |
| 99 | |
| 100 | compressed_metadata = gzip.compress(json.dumps(metadata).encode()) |
| 101 | header["clustered"] = self.clustered |
| 102 | header["internal_compression"] = Compression.GZIP |
| 103 | header["root_offset"] = 127 |
| 104 | header["root_length"] = len(root_bytes) |
| 105 | header["metadata_offset"] = header["root_offset"] + header["root_length"] |
| 106 | header["metadata_length"] = len(compressed_metadata) |
| 107 | header["leaf_directory_offset"] = ( |
| 108 | header["metadata_offset"] + header["metadata_length"] |
| 109 | ) |
| 110 | header["leaf_directory_length"] = len(leaves_bytes) |
| 111 | header["tile_data_offset"] = ( |
| 112 | header["leaf_directory_offset"] + header["leaf_directory_length"] |
| 113 | ) |
| 114 | header["tile_data_length"] = self.offset |
| 115 | |
| 116 | header_bytes = serialize_header(header) |
| 117 | |
| 118 | self.f.write(header_bytes) |
| 119 | self.f.write(root_bytes) |
| 120 | self.f.write(compressed_metadata) |
| 121 | self.f.write(leaves_bytes) |
| 122 | self.tile_f.seek(0) |
| 123 | shutil.copyfileobj(self.tile_f, self.f) |
| 124 | self.tile_f.close() |