def execute(bbox: BBOX, run_id: str, args: Dict[str, object] = dict()) -> None: xyz_result = xyz_provisioner( bbox, args["xyz_url"], ZOOM_MIN, ZOOM_MAX, ["image/png", "image/jpeg"], OUTPUT_FORMAT, ) tmp_dir = get_run_data_path(run_id, (NAME, )) tmp_tile_paths = list() logging.info( f"Copying {len(xyz_result.tile_paths)} {NAME} tiles to tmp dir for edge clipping" ) for tile_path in xyz_result.tile_paths: tmp_tile_path = tile_path.replace(xyz_result.tile_dir, tmp_dir) tmp_tile_paths.append(tmp_tile_path) os.makedirs(os.path.dirname(tmp_tile_path), exist_ok=True) copyfile(tile_path, tmp_tile_path) transparent_clip_to_bbox( [ os.path.join(tmp_dir, tile_path) for tile_path in get_edge_tiles(tmp_dir) ], bbox, ) add_or_update(tmp_dir, get_result_path((NAME, )))
def add_or_update(source_dir: str, dest_dir: str): logging.info( "Searching existing tiles for edge overlaps and stitching if necessary" ) edge_tiles = get_edge_tiles(source_dir) existing_edge_tiles = [ edge_tile for edge_tile in edge_tiles if os.path.exists(os.path.join(dest_dir, edge_tile)) ] if len(existing_edge_tiles) > 0: logging.info(f"Stitching {len(existing_edge_tiles)} tile(s)") def stitch(edge_tile): new_edge_tile_path = os.path.join(source_dir, edge_tile) merge_tiles( os.path.join(dest_dir, edge_tile), new_edge_tile_path, new_edge_tile_path, ) ThreadPool(int(os.environ.get("TILE_STITCH_CONCURRENCY", 4))).map(stitch, existing_edge_tiles) logging.info("Updating result directories with latest export") merge_dirs(source_dir, dest_dir)
def execute( bbox: BBOX, run_id: str, xyz_url: str, profile_name: str, layers: List[ProjectLayer], extra_styles: List[str] = list(), ) -> None: xyz_result = xyz_provisioner(bbox, xyz_url, ZOOM_MIN, ZOOM_MAX, ["image/png", "image/jpeg"], OUTPUT_FORMAT) generate_result = generate_tiles( layers, ["common", profile_name] + extra_styles, bbox, profile_name, ZOOM_MIN, ZOOM_MAX, run_id, ) xyz_tiles_merged = list() logging.info( f"Merging {len(generate_result.tile_paths)} generated tile(s) to xyz base" ) path_tuples = [( data_tile.replace(generate_result.tile_dir, xyz_result.tile_dir), data_tile, data_tile, ) for data_tile in generate_result.tile_paths] merge_tiles(path_tuples) xyz_tiles_merged = [path_tuple[0] for path_tuple in path_tuples] logging.info("Collecting non-generated xyz tiles") for xyz_tile in xyz_result.tile_paths: if xyz_tile not in xyz_tiles_merged: xyz_copy_path = xyz_tile.replace(xyz_result.tile_dir, generate_result.tile_dir) os.makedirs(os.path.dirname(xyz_copy_path), exist_ok=True) copyfile(xyz_tile, xyz_copy_path) transparent_clip_to_bbox( [ os.path.join(generate_result.tile_dir, tile_path) for tile_path in get_edge_tiles(generate_result.tile_dir) ], bbox, ) logging.info("Transferring combined tile set to result directory") add_or_update(generate_result.tile_dir, get_result_path((profile_name, )))
def execute(bbox: BBOX, run_id: str, args: Dict[str, object] = dict()) -> None: layers = (canvec( bbox, run_id, (9244667, 4622334, 2311167, 1155583, 577792, 288896, 144448, 72224, 36112), ) + bc_topo(bbox, run_id) + bc_hillshade(bbox, run_id) + bc_resource_roads(bbox, run_id) + trails(bbox, run_id) + shelters(bbox, run_id)) generate_result = generate_tiles(layers, ["common", "topo"], bbox, NAME, ZOOM_MIN, ZOOM_MAX, run_id) transparent_clip_to_bbox( [ os.path.join(generate_result.tile_dir, tile_path) for tile_path in get_edge_tiles(generate_result.tile_dir) ], bbox, False, ) logging.info("Transferring generated tile set to result directory") add_or_update(generate_result.tile_dir, get_result_path((NAME, )), False)
def execute(bbox: BBOX, run_id: str, xyz_url: str, profile_name: str, layers: List[ProjectLayer]) -> None: xyz_result = xyz_provisioner(bbox, xyz_url, ZOOM_MIN, ZOOM_MAX, "image/jpeg", OUTPUT_FORMAT) generate_result = generate_tiles(layers, ["common", profile_name], bbox, profile_name, ZOOM_MIN, ZOOM_MAX, run_id) xyz_tiles_merged = list() logging.info( f"Merging {len(generate_result.tile_paths)} generated tile(s) to xyz base" ) for data_tile in generate_result.tile_paths: matching_raw_xyz_tile = data_tile.replace(generate_result.tile_dir, xyz_result.tile_dir) logging.debug( f"Base tile {matching_raw_xyz_tile}, overlay {data_tile}") merge_tiles( matching_raw_xyz_tile, data_tile, data_tile, ) xyz_tiles_merged.append(matching_raw_xyz_tile) logging.info("Collecting non-generated xyz tiles") for xyz_tile in xyz_result.tile_paths: if xyz_tile not in xyz_tiles_merged: xyz_copy_path = xyz_tile.replace(xyz_result.tile_dir, generate_result.tile_dir) os.makedirs(os.path.dirname(xyz_copy_path), exist_ok=True) copyfile(xyz_tile, xyz_copy_path) transparent_clip_to_bbox( [ os.path.join(generate_result.tile_dir, tile_path) for tile_path in get_edge_tiles(generate_result.tile_dir) ], bbox, ) logging.info("Transferring combined tile set to result directory") add_or_update(generate_result.tile_dir, get_result_path((profile_name, )))
def add_or_update(source_dir: str, dest_dir: str, quantize: bool = True): logging.info( "Searching existing tiles for edge overlaps and stitching if necessary" ) edge_tiles = get_edge_tiles(source_dir) existing_edge_tiles = [ edge_tile for edge_tile in edge_tiles if os.path.exists(os.path.join(dest_dir, edge_tile)) ] if len(existing_edge_tiles) > 0: logging.info(f"Stitching {len(existing_edge_tiles)} tile(s)") path_tuples = [ ( os.path.join(dest_dir, edge_tile), os.path.join(source_dir, edge_tile), os.path.join(source_dir, edge_tile), ) for edge_tile in existing_edge_tiles ] merge_tiles(path_tuples, quantize) logging.info("Updating result directories with latest export") merge_dirs(source_dir, dest_dir)