Merge pull request #204 from protomaps/python-pmtiles-to-mbtiles-metadata

python pmtiles-to-mbtiles: lift vector_layers and tilestats into json…
This commit is contained in:
Brandon Liu
2023-06-23 10:40:40 +08:00
committed by GitHub
2 changed files with 26 additions and 2 deletions

View File

@@ -128,11 +128,24 @@ def pmtiles_to_mbtiles(input, output):
if header["tile_type"] == TileType.MVT: if header["tile_type"] == TileType.MVT:
metadata["format"] = "pbf" metadata["format"] = "pbf"
json_metadata = {}
for k, v in metadata.items(): for k, v in metadata.items():
if not isinstance(v, str): if k == "vector_layers":
json_metadata["vector_layers"] = v
continue
elif k == "tilestats":
json_metadata["tilestats"] = v
continue
elif not isinstance(v, str):
v = json.dumps(v, ensure_ascii=False) v = json.dumps(v, ensure_ascii=False)
cursor.execute("INSERT INTO metadata VALUES(?,?)", (k, v)) cursor.execute("INSERT INTO metadata VALUES(?,?)", (k, v))
if len(json_metadata) > 0:
cursor.execute(
"INSERT INTO metadata VALUES(?,?)",
("json", json.dumps(json_metadata, ensure_ascii=False)),
)
for zxy, tile_data in all_tiles(source): for zxy, tile_data in all_tiles(source):
flipped_y = (1 << zxy[0]) - 1 - zxy[2] flipped_y = (1 << zxy[0]) - 1 - zxy[2]
cursor.execute( cursor.execute(

View File

@@ -1,6 +1,8 @@
import unittest import unittest
import sqlite3
from io import BytesIO from io import BytesIO
import os import os
import json
from pmtiles.writer import Writer from pmtiles.writer import Writer
from pmtiles.reader import Reader, MemorySource from pmtiles.reader import Reader, MemorySource
from pmtiles.convert import ( from pmtiles.convert import (
@@ -51,10 +53,19 @@ class TestConvert(unittest.TestCase):
"center_lon_e7": 0, "center_lon_e7": 0,
"center_lat_e7": 0, "center_lat_e7": 0,
}, },
{"": "value"}, {"vector_layers": ['vector','layers'],
"tilestats":{'tile':'stats'}},
) )
pmtiles_to_mbtiles("test_tmp.pmtiles", "test_tmp.mbtiles") pmtiles_to_mbtiles("test_tmp.pmtiles", "test_tmp.mbtiles")
conn = sqlite3.connect('test_tmp.mbtiles')
cursor = conn.cursor()
res = cursor.execute("SELECT value from metadata where name = 'json'")
data = res.fetchone()[0]
json_metadata = json.loads(data)
self.assertEqual(json_metadata['vector_layers'], ['vector', 'layers'])
self.assertEqual(json_metadata['tilestats'], {'tile':'stats'})
mbtiles_to_pmtiles("test_tmp.mbtiles", "test_tmp_2.pmtiles", 3) mbtiles_to_pmtiles("test_tmp.mbtiles", "test_tmp_2.pmtiles", 3)
def test_mbtiles_header(self): def test_mbtiles_header(self):