diff --git a/mbtiles/cf.py b/mbtiles/cf.py index 144b9f1..70934a6 100644 --- a/mbtiles/cf.py +++ b/mbtiles/cf.py @@ -22,6 +22,7 @@ def process_tiles( resampling=None, img_ext=None, image_dump=None, + tile_scheme=None, progress_bar=None, open_options=None, warp_options=None, @@ -60,7 +61,7 @@ def process_tiles( for future in done: tile, contents = future.result() - insert_results(tile, contents, img_ext=img_ext, image_dump=image_dump) + insert_results(tile, contents, img_ext=img_ext, image_dump=image_dump, tile_scheme=tile_scheme) count += len(done) if count > BATCH_SIZE: diff --git a/mbtiles/mp.py b/mbtiles/mp.py index 22ca447..3f7143e 100644 --- a/mbtiles/mp.py +++ b/mbtiles/mp.py @@ -26,6 +26,7 @@ def process_tiles( resampling=None, img_ext=None, image_dump=None, + tile_scheme=None, progress_bar=None, open_options=None, warp_options=None, @@ -62,7 +63,7 @@ def grouper(iterable, n, fillvalue=None): if item is None: break tile, contents = item - insert_results(tile, contents, img_ext=img_ext, image_dump=image_dump) + insert_results(tile, contents, img_ext=img_ext, image_dump=image_dump, tile_scheme=tile_scheme) commit_mbtiles() diff --git a/mbtiles/scripts/cli.py b/mbtiles/scripts/cli.py index 70d87ed..0b54fea 100644 --- a/mbtiles/scripts/cli.py +++ b/mbtiles/scripts/cli.py @@ -149,6 +149,13 @@ def extract_features(ctx, param, value): metavar="PATH", help="A directory into which image tiles will be optionally " "dumped.", ) +@click.option( + "--scheme", + "tile_scheme", + type=click.Choice(["xyz", "tms"]), + default="tms", + help="Influences the y direction of the tile coordinates in file names, when `--image-dump` is used.", +) @click.option( "-j", "num_workers", @@ -235,6 +242,7 @@ def mbtiles( tile_size, zoom_levels, image_dump, + tile_scheme, num_workers, src_nodata, dst_nodata, @@ -531,7 +539,7 @@ def init_mbtiles(): ) conn.commit() - def insert_results(tile, contents, img_ext=None, image_dump=None): + def insert_results(tile, contents, img_ext=None, image_dump=None, tile_scheme="tms"): """Also a closure.""" cursor = conn.cursor() if contents is None: @@ -539,11 +547,18 @@ def insert_results(tile, contents, img_ext=None, image_dump=None): return # MBTiles have a different origin than Mercantile/tilebelt. + # See https://gist.github.com/tmcw/4954720 + # and https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#raster-scheme. tiley = int(math.pow(2, tile.z)) - tile.y - 1 # Optional image dump. if image_dump: - img_name = "{}-{}-{}.{}".format(tile.x, tiley, tile.z, img_ext) + img_name = "{}-{}-{}.{}".format( + tile.x, + tile.y if tile_scheme == "xyz" else tiley, + tile.z, + img_ext + ) img_path = os.path.join(image_dump, img_name) with open(img_path, "wb") as img: img.write(contents) @@ -589,6 +604,7 @@ def gen_tiles(): resampling=resampling, img_ext=img_ext, image_dump=image_dump, + tile_scheme=tile_scheme, progress_bar=pbar, open_options=open_options, creation_options=creation_options,