mirror of
https://github.com/protomaps/PMTiles.git
synced 2026-03-21 22:39:39 +00:00
fix(python): set defaults if mbtile headers omitted during pmtile convert (#599)
This commit is contained in:
@@ -9,22 +9,40 @@ from .tile import zxy_to_tileid, tileid_to_zxy, TileType, Compression
|
|||||||
|
|
||||||
|
|
||||||
def mbtiles_to_header_json(mbtiles_metadata):
|
def mbtiles_to_header_json(mbtiles_metadata):
|
||||||
|
# Metadata spec: https://github.com/mapbox/mbtiles-spec/blob/master/1.3/spec.md#metadata
|
||||||
|
|
||||||
header = {}
|
header = {}
|
||||||
|
|
||||||
|
# MBTiles don't work well without zooms, so we expect them to be set.
|
||||||
header["min_zoom"] = int(mbtiles_metadata["minzoom"])
|
header["min_zoom"] = int(mbtiles_metadata["minzoom"])
|
||||||
|
|
||||||
header["max_zoom"] = int(mbtiles_metadata["maxzoom"])
|
header["max_zoom"] = int(mbtiles_metadata["maxzoom"])
|
||||||
|
|
||||||
bounds = mbtiles_metadata["bounds"].split(",")
|
# Default to global bounds in case 'bounds' not present.
|
||||||
header["min_lon_e7"] = int(float(bounds[0]) * 10000000)
|
bounds_str = mbtiles_metadata.get("bounds", "-180.0,-85.05112878,180.0,85.05112878")
|
||||||
header["min_lat_e7"] = int(float(bounds[1]) * 10000000)
|
try:
|
||||||
header["max_lon_e7"] = int(float(bounds[2]) * 10000000)
|
bounds = [float(x.strip()) for x in bounds_str.split(",")]
|
||||||
header["max_lat_e7"] = int(float(bounds[3]) * 10000000)
|
min_lon, min_lat, max_lon, max_lat = bounds
|
||||||
|
except Exception:
|
||||||
|
min_lon, min_lat, max_lon, max_lat = -180.0, -85.05112878, 180.0, 85.05112878
|
||||||
|
header["min_lon_e7"] = int(min_lon * 1e7)
|
||||||
|
header["min_lat_e7"] = int(min_lat * 1e7)
|
||||||
|
header["max_lon_e7"] = int(max_lon * 1e7)
|
||||||
|
header["max_lat_e7"] = int(max_lat * 1e7)
|
||||||
|
|
||||||
center = mbtiles_metadata["center"].split(",")
|
# The spec expects 'center', but not all tools respect this. Provide a default as the center of the bounds.
|
||||||
header["center_lon_e7"] = int(float(center[0]) * 10000000)
|
center_str = mbtiles_metadata.get("center")
|
||||||
header["center_lat_e7"] = int(float(center[1]) * 10000000)
|
try:
|
||||||
header["center_zoom"] = int(center[2])
|
if center_str:
|
||||||
|
parts = [p.strip() for p in center_str.split(",")]
|
||||||
|
header["center_lon_e7"] = int(float(parts[0]) * 1e7)
|
||||||
|
header["center_lat_e7"] = int(float(parts[1]) * 1e7)
|
||||||
|
header["center_zoom"] = int(float(parts[2]))
|
||||||
|
else:
|
||||||
|
raise ValueError
|
||||||
|
except Exception:
|
||||||
|
header["center_zoom"] = header["min_zoom"]
|
||||||
|
header["center_lon_e7"] = (header["min_lon_e7"] + header["max_lon_e7"]) // 2
|
||||||
|
header["center_lat_e7"] = (header["min_lat_e7"] + header["max_lat_e7"]) // 2
|
||||||
|
|
||||||
tile_format = mbtiles_metadata["format"]
|
tile_format = mbtiles_metadata["format"]
|
||||||
if tile_format == "pbf":
|
if tile_format == "pbf":
|
||||||
@@ -88,7 +106,7 @@ def mbtiles_to_pmtiles(input, output, maxzoom):
|
|||||||
if maxzoom:
|
if maxzoom:
|
||||||
pmtiles_header["max_zoom"] = int(maxzoom)
|
pmtiles_header["max_zoom"] = int(maxzoom)
|
||||||
mbtiles_metadata["maxzoom"] = maxzoom
|
mbtiles_metadata["maxzoom"] = maxzoom
|
||||||
result = writer.finalize(pmtiles_header, pmtiles_metadata)
|
writer.finalize(pmtiles_header, pmtiles_metadata)
|
||||||
|
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user