def render_tile_and_put_to_s3(tile_str, s3_bucket, key_prefix, source_adapter): tile_type, tile = parse_tile_str(tile_str) render_data = RENDER_COMBINATIONS.get(tile_type) if not render_data: logger.error("Could not parse tile string %s", tile_str) (transformation, format, suffix) = render_data key = "{}/{}/{}/{}{}".format( tile_type, tile.z, tile.x, tile.y, suffix, ) if key_prefix: key = key_prefix + '/' + key with Timer() as t: (headers, data) = tiling.render_tile(tile, source_adapter, format=format, transformation=transformation) logger.debug("Tile %s rendered in %0.3f", tile, t.elapsed) with Timer() as t: # Each thread needs its own boto3 Session object – it's not threadsafe session = boto3.session.Session() s3 = session.resource('s3') bucket = s3.Bucket(s3_bucket) obj = write_to_s3(bucket, key, data, headers, overwrite=True) logger.debug("Tile %s uploaded to s3://%s/%s in %0.3f", tile, obj.bucket_name, obj.key, t.elapsed)
def render_tile_and_put_to_s3(tile, s3_details, sources): s3_bucket, s3_key_prefix = s3_details for (type, transformation, format, ext, scale) in RENDER_COMBINATIONS: if ONLY_RENDER and type not in ONLY_RENDER: logger.debug( '(%02d/%06d/%06d) Skipping render because ' 'type %s not in %s', tile.z, tile.x, tile.y, type, ONLY_RENDER, ) continue key = s3_key(s3_key_prefix, type, tile, ext) obj = THREAD_LOCAL.s3.Object(s3_bucket, key) if not OVERWRITE and s3_obj_exists(obj): logger.debug( '(%02d/%06d/%06d) Skipping existing %s tile', tile.z, tile.x, tile.y, type, ) continue with Timer() as t: (headers, data) = tiling.render_tile(tile, sources, format=format, transformation=transformation, scale=scale) logger.debug( '(%02d/%06d/%06d) Took %0.3fs to render %s tile (%s bytes), Source: %s, Timers: %s', tile.z, tile.x, tile.y, t.elapsed, type, len(data), headers.get('X-Imagery-Sources'), headers.get('X-Timers'), ) with Timer() as t: obj = write_to_s3(obj, tile, type, data, ext, headers) logger.debug( '(%02d/%06d/%06d) Took %0.3fs to write %s tile to s3://%s/%s', tile.z, tile.x, tile.y, t.elapsed, type, obj.bucket_name, obj.key, )
def render_tif(z, x, y): tile = Tile(x, y, z) headers, data = tiling.render_tile(tile, CATALOG, format=GEOTIFF_FORMAT) headers.update(CATALOG.headers) return data, 200, headers
def render_geotiff(z, x, y, **kwargs): tile = Tile(x, y, z) headers, data = tiling.render_tile( tile, ELEVATION_CATALOG, format=GEOTIFF_FORMAT, scale=2, data_band_count=1) return data, 200, headers
def render_hillshade_tiff(z, x, y, **kwargs): tile = Tile(x, y, z) headers, data = tiling.render_tile( tile, CATALOGS['hillshade'], format=HILLSHADE_GEOTIFF_FORMAT, transformation=HILLSHADE_TRANSFORMATION, scale=2, data_band_count=1) return data, 200, headers
def render_png(renderer, z, x, y, scale=1, **kwargs): tile = Tile(x, y, z) headers, data = tiling.render_tile( tile, CATALOGS[renderer], format=FORMATS[renderer], transformation=TRANSFORMATIONS.get(renderer), scale=scale, data_band_count=DATA_BAND_COUNTS.get(renderer, 1)) return data, 200, headers
def render_png(z, x, y, scale=1): tile = Tile(x, y, z) headers, data = tiling.render_tile( tile, CATALOG, format=IMAGE_FORMAT, transformation=COLORMAP_TRANSFORMATION, scale=scale, ) headers.update(CATALOG.headers) return data, 200, headers
def render_png(z, x, y, scale=1): catalog = make_catalog(request.args) tile = Tile(x, y, z) headers, data = tiling.render_tile( tile, catalog, format=IMAGE_FORMAT, transformation=IMAGE_TRANSFORMATION, scale=scale, ) headers.update(catalog.headers) return data, 200, headers
def user_render(id, z, x, y, scale=1, prefix=None): catalog = make_remote_catalog("user", id) tile = Tile(x, y, z) headers, data = tiling.render_tile( tile, catalog, format=OPTIMAL_FORMAT, transformation=IMAGE_TRANSFORMATION, scale=scale, ) headers.update(catalog.headers) return data, 200, headers
def render_json(z, x, y, scale=1): tile = Tile(x, y, z) sieve = int(request.args.get("sieve", 4)) headers, data = tiling.render_tile( tile, CATALOG, format=GeoJSON(sieve_size=sieve), transformation=Transformation(collar=8 * scale), scale=scale, ) headers.update(CATALOG.headers) return data, 200, headers
def render_png_from_remote(id, z, x, y, scale=1, prefix=None): # prefix is for URL generation only (API Gateway stages); if it matched the # URL, it's part of the id if prefix is not None: id = "/".join([prefix, id]) catalog = make_remote_catalog(id) tile = Tile(x, y, z) headers, data = tiling.render_tile(tile, catalog, format=PNG_FORMAT, transformation=IMAGE_TRANSFORMATION, scale=scale) headers.update(catalog.headers) return data, 200, headers
def render_tile( format, output, scale, transformation, tile, ): z, x, y = map(int, tile.split("/")) tile = Tile(x, y, z) (headers, data) = tiling.render_tile( tile, PostGISCatalog(), format=FORMATS[format], transformation=TRANSFORMATIONS.get(transformation), scale=scale) [click.echo("{}: {}".format(k, v), err=True) for k, v in headers.items()] output.write(data)
def render_tile(tile, sources, output): for (type, transformation, format, ext) in RENDER_COMBINATIONS: with Timer() as t: (headers, data) = tiling.render_tile(tile, sources, format=format, transformation=transformation) logger.debug( '(%02d/%06d/%06d) Took %0.3fs to render %s tile (%s bytes), Source: %s, Timers: %s', tile.z, tile.x, tile.y, t.elapsed, type, len(data), headers.get('X-Imagery-Sources'), headers.get('X-Timers'), ) MBTILES_POOL.apply_async(write_to_mbtiles, args=[type, tile, headers, data, output])
# coding=utf-8 from __future__ import print_function import logging from marblecutter import tiling from marblecutter.catalogs.postgis import PostGISCatalog from marblecutter.formats.geotiff import GeoTIFF from mercantile import Tile logging.basicConfig(level=logging.INFO) if __name__ == "__main__": tile = Tile(324, 787, 11) (headers, data) = tiling.render_tile( tile, PostGISCatalog(), format=GeoTIFF(area_or_point="Point"), scale=2) print("headers: ", headers) with open("tmp/11_324_787.tif", "w") as f: f.write(data)
from mercantile import Tile from marblecutter import tiling from marblecutter.catalogs.postgis import PostGISCatalog from marblecutter.formats.png import PNG from tilezen.transformations import Normal logging.basicConfig(level=logging.INFO) if __name__ == "__main__": zoom = 2 tile = Tile(0, 0, zoom) (headers, data) = tiling.render_tile(tile, PostGISCatalog(), format=PNG(), transformation=Normal(collar=2), scale=2) print("Headers: ", headers) with open( "tmp/{}_{}_{}_buffered_normal.png".format(tile.z, tile.x, tile.y), "w") as f: f.write(data) tile = Tile(0, 2**zoom - 1, zoom) (headers, data) = tiling.render_tile(tile, PostGISCatalog(), format=PNG(), transformation=Normal(collar=2),
# coding=utf-8 from __future__ import print_function import logging from mercantile import Tile from marblecutter import tiling from marblecutter.catalogs.postgis import PostGISCatalog from marblecutter.formats.png import PNG from tilezen.transformations import Terrarium logging.basicConfig(level=logging.INFO) if __name__ == "__main__": tile = Tile(324, 787, 11) (headers, data) = tiling.render_tile(tile, PostGISCatalog(), format=PNG(), transformation=Terrarium(), scale=2) print("Headers: ", headers) with open("tmp/11_324_787_terrarium.png", "w") as f: f.write(data)
from marblecutter import tiling from marblecutter.catalogs.postgis import PostGISCatalog from marblecutter.formats.color_ramp import ColorRamp from marblecutter.formats.geotiff import GeoTIFF from tilezen.transformations import Hillshade logging.basicConfig(level=logging.INFO) if __name__ == "__main__": tile = Tile(1308, 3164, 13) hillshade = Hillshade(resample=True, add_slopeshade=True) (headers, data) = tiling.render_tile(tile, PostGISCatalog(), format=GeoTIFF(), transformation=hillshade, scale=1) print("Headers: ", headers) with open("tmp/{}_{}_{}_hillshade.tif".format(tile.z, tile.x, tile.y), "w") as f: f.write(data) (headers, data) = tiling.render_tile(tile, PostGISCatalog(), format=GeoTIFF()) print("Headers: ", headers)