diff --git a/src/globato/cli/build.py b/src/globato/cli/build.py index 2e32f28..7e3b491 100644 --- a/src/globato/cli/build.py +++ b/src/globato/cli/build.py @@ -76,6 +76,16 @@ @click.option( "-W", "--weights", default="auto", help="Weight thresholds ('auto' or '1.0/0.5')." ) +@click.option( + "--modifier", + multiple=True, + help="Apply a recipe modifier at runtime (e.g., exclude_module:modules=csb/tnm).", +) +@click.option( + "--schema", + multiple=True, + help="Apply a domain schema validation to the recipe.", +) @click.option( "--shared-cache", # type=click.Path(resolve_path=True), @@ -87,6 +97,11 @@ @click.option( "--refresh", is_flag=True, help="Force fresh API fetch, bypassing local cache." ) +@click.option( + "--ignore-failures", + is_flag=True, + help="Continue processing through failures (Warning: may result in incomplete data or products).", +) @click.argument("sources", nargs=-1) def build_cmd( region, @@ -104,11 +119,14 @@ def build_cmd( limits, weights, blend, + modifier, + schema, shared_cache, metadata, export, sources, refresh, + ignore_failures, ): """Build a Digital Elevation Model recipe, and execute it.""" @@ -128,6 +146,9 @@ def build_cmd( res=increment, ) + parsed_modifiers = [parse_hook_string(m) for m in modifier] + parsed_schemas = [s for s in schema] + base_outdir = os.path.abspath(outdir) if outdir else os.path.abspath(".") try: @@ -164,6 +185,7 @@ def build_cmd( auto_res_list = [base_res * (3**i) for i in range(len(weight_list) + 1)] blend_list = [int_or(b, 10) for b in str(blend).split("/")] if blend else [] + batch_outname = "%name%_%batch_name%" # --- Base Pipeline Standard Hooks --- global_hooks = [ {"name": "spatial-crop"}, @@ -173,11 +195,11 @@ def build_cmd( {"name": "drop_class"}, { "name": "provenance", - "args": {"res": increment, "output": f"{outname}_provenance.tif"}, + "args": {"res": increment, "output": f"{batch_outname}_provenance.tif"}, }, { "name": "source_masks", - "args": {"res": increment, "output": f"{outname}_sources.vrt"}, + "args": {"res": increment, "output": f"{batch_outname}_sources.vrt"}, }, ] @@ -199,7 +221,7 @@ def build_cmd( "mode": stack_mode, "nodata": nodata, "weight_threshold": "/".join([str(x) for x in weight_list]), - "output": f"{outname}_stack.tif", + "output": f"{batch_outname}_stack.tif", }, } ) @@ -281,7 +303,7 @@ def build_cmd( if "barrier" not in args: args["barrier"] = "osm" - algo_hook.setdefault("args", {})["output"] = f"{outname}.tif" + algo_hook.setdefault("args", {})["output"] = f"{batch_outname}.tif" global_hooks.append(algo_hook) # --- Add Clipping (-C) --- @@ -309,7 +331,7 @@ def build_cmd( global_hooks.append( { "name": "viz_geoshade", - "args": {"output": f"{outname}_hs.tif", "cmap": "coastal_relief"}, + "args": {"output": f"{batch_outname}_hs.tif", "cmap": "coastal_relief"}, } ) @@ -340,7 +362,7 @@ def build_cmd( "cells": ext_cells, "pct": ext_pct, "increment": increment, - "outname": outname, + "outname": batch_outname, }, } ] @@ -348,6 +370,12 @@ def build_cmd( # Ensure schemas validate the generated recipe config["schemas"] = [{"name": "validate-recipe"}] + if parsed_modifiers: + config["modifiers"].extend(parsed_modifiers) + + if schema: + config["schemas"].extend(parsed_schemas) + # --- Export or Execute --- if export: os.makedirs(base_outdir, exist_ok=True) @@ -364,7 +392,12 @@ def build_cmd( recipe = Recipe.from_dict(config) # Fetchez handles all directory switching, batching, and execution - recipe.run(outdir=outdir, shared_cache=shared_cache, refresh=refresh) + recipe.run( + outdir=outdir, + shared_cache=shared_cache, + refresh=refresh, + ignore_failures=ignore_failures, + ) click.secho( "✨ Successfully completed Globato build pipeline!", fg="green", diff --git a/src/globato/hooks/filters/point_raster_mask.py b/src/globato/hooks/filters/point_raster_mask.py index 7a79a5f..c783164 100644 --- a/src/globato/hooks/filters/point_raster_mask.py +++ b/src/globato/hooks/filters/point_raster_mask.py @@ -47,13 +47,17 @@ def setup(self, mod, entry): logger.warning(f"[{self.name}] No barrier provided. Skipping.") return False + region = getattr(mod, "region", None) + mod_outdir = getattr(mod, "outdir", getattr(mod, "_outdir", None)) + cache_dir = mod_outdir if mod_outdir else os.getcwd() + target_crs = entry.get("src_srs", "EPSG:4326") from globato.utils import resolve_barrier barrier_path = resolve_barrier( self.barrier, - region=getattr(mod, "region", None), - outdir=os.path.join(os.getcwd(), "auto_barriers"), + region=region, + outdir=os.path.join(cache_dir, "auto_barriers"), res=self.res, include_rivers=True, include_lakes=True, diff --git a/src/globato/hooks/filters/rq.py b/src/globato/hooks/filters/rq.py index 42e59c5..5ca9d6c 100644 --- a/src/globato/hooks/filters/rq.py +++ b/src/globato/hooks/filters/rq.py @@ -20,7 +20,7 @@ from scipy.ndimage import map_coordinates import fetchez -from fetchez.utils import str2inc +from fetchez.utils import str2inc, parse_arg_to_list from .base import GlobatoFilter @@ -82,8 +82,7 @@ def __init__( **kwargs, ): super().__init__(**kwargs) - self.ref_source = reference - self.ref_sources = [s.strip().lower() for s in str(reference).split("/")] + self.ref_sources = parse_arg_to_list(reference, str) self.threshold = float(threshold) self.mode = mode.lower() self.builder = builder.lower() @@ -202,7 +201,7 @@ def _fetch_reference_files(self, region, outdir): ) if files: for f in files: - if os.path.exists(f) and os.path.getsize(f) > 2000: + if os.path.exists(f) and os.path.getsize(f) > 0: valid_files.append(f) except Exception as e: logger.warning(f"[RQ] Fetch failed for {source}: {e}") diff --git a/src/globato/hooks/rasters/base.py b/src/globato/hooks/rasters/base.py index 8b2f673..f30531d 100644 --- a/src/globato/hooks/rasters/base.py +++ b/src/globato/hooks/rasters/base.py @@ -16,7 +16,6 @@ import logging import shutil import numpy as np -import tempfile import rasterio from rasterio.windows import Window import fiona @@ -27,9 +26,6 @@ logger = logging.getLogger(__name__) -tmp_dir = tempfile.gettempdir() - - # ============================================================================= # THE SHARED BASE (Utilities) # ============================================================================= @@ -144,14 +140,16 @@ def _get_barrier_geometries( mod = getattr(self, "current_mod", None) region = getattr(mod, "region", None) if mod else None - outdir = os.path.dirname(self.output) if self.output else os.getcwd() + + mod_outdir = getattr(mod, "outdir", getattr(mod, "_outdir", None)) + cache_dir = mod_outdir if mod_outdir else os.getcwd() from globato.utils import resolve_barrier barrier_path = resolve_barrier( self.barrier, region=region, - outdir=os.path.join(outdir, "auto_barriers"), + outdir=os.path.join(cache_dir, "auto_barriers"), output_type="vector", include_rivers=include_rivers, include_lakes=include_lakes, @@ -313,11 +311,15 @@ def process_chunk(self, data, ndv, entry, transform=None, window=None): def run(self, entries): logger.info(f"[{self.name}] Running in local mode on {len(entries)} entries") - new_entries = [] + + local_tmp = os.path.abspath("tmp") + os.makedirs(local_tmp, exist_ok=True) + for mod, entry in entries: # SET CURRENT MOD FOR COASTLINE GENERATION self.current_mod = mod + if self.has_stream(entry): stream = entry.get("stream") entry["stream"] = self._stream_wrapper(stream, entry) @@ -337,7 +339,7 @@ def run(self, entries): dst_fn = self.output else: base_name = os.path.splitext(os.path.basename(src_fn))[0] - dst_fn = os.path.join(tmp_dir, f"{base_name}{self.suffix}.tif") + dst_fn = os.path.join(local_tmp, f"{base_name}{self.suffix}.tif") logger.debug(f"Running local {self.name} on {os.path.basename(src_fn)}") try: @@ -414,6 +416,10 @@ def process_raster(self, src_path, dst_path, entry): def run(self, entries): logger.info(f"[{self.name}] Running in global mode on {len(entries)} entries") new_entries = [] + + local_tmp = os.path.abspath("tmp") + os.makedirs(local_tmp, exist_ok=True) + for mod, entry in entries: # SET CURRENT MOD FOR COASTLINE GENERATION self.current_mod = mod @@ -428,14 +434,12 @@ def run(self, entries): base_name = os.path.basename(src_fn) drain_fn = os.path.join( - tmp_dir, f"{os.path.splitext(base_name)[0]}_drained_{self.name}.tif" + local_tmp, + f"{os.path.splitext(base_name)[0]}_drained_{self.name}.tif", ) - # drain_fn = f"{os.path.splitext(src_fn)[0]}_drained_{self.name}.tif" entry["dst_fn"] = drain_fn - drainer = RasterWrite(suffix="", inline=False) drainer.run([(mod, entry)]) - src_fn = entry.get("dst_fn") if not src_fn or not os.path.exists(src_fn): @@ -446,7 +450,7 @@ def run(self, entries): dst_fn = self.output else: base_name = os.path.splitext(os.path.basename(src_fn))[0] - dst_fn = os.path.join(tmp_dir, f"{base_name}{self.suffix}.tif") + dst_fn = os.path.join(local_tmp, f"{base_name}{self.suffix}.tif") logger.debug(f"Running global {self.name} on {os.path.basename(src_fn)}") try: diff --git a/src/globato/hooks/rasters/binary_cudem.py b/src/globato/hooks/rasters/binary_cudem.py index 0f55737..1b68443 100644 --- a/src/globato/hooks/rasters/binary_cudem.py +++ b/src/globato/hooks/rasters/binary_cudem.py @@ -50,13 +50,12 @@ def __init__( resolutions=None, # ["3s", "9s", "15s"], # E.g., 1s=Dense, 3s=Med, 9s=Sparse algos=None, # ,["raster_fill", "raster_fill", "interp_rbf"], blend_dists=None, # 20, - barrier=None, decimation_mode="weighted_mean", bathy_max_z=-0.01, - keep_steps=True, + keep_steps=False, **kwargs, ): - super().__init__(barrier=barrier, strip_bands=True, **kwargs) + super().__init__(strip_bands=True, **kwargs) self.valid_algos = [ "interp_gmt", @@ -159,6 +158,9 @@ def _decimate_raster(self, src_path, dst_path, target_res): import fetchez + local_tmp = os.path.abspath("tmp") + os.makedirs(local_tmp, exist_ok=True) + logger.info( f"[{self.name}] Decimating to {target_res} using '{self.decimation_mode}'..." ) @@ -171,6 +173,7 @@ def _decimate_raster(self, src_path, dst_path, target_res): decimated_stack = fetchez.get( "file", + outdir=local_tmp, region=region, region_srs=src_crs, path=src_path, diff --git a/src/globato/hooks/rasters/rio_warp.py b/src/globato/hooks/rasters/rio_warp.py index 311a00e..ed6527f 100644 --- a/src/globato/hooks/rasters/rio_warp.py +++ b/src/globato/hooks/rasters/rio_warp.py @@ -12,10 +12,14 @@ """ import os -import shutil import logging import rasterio -from rasterio.warp import calculate_default_transform, reproject, Resampling +from rasterio.warp import ( + calculate_default_transform, + reproject, + Resampling, + transform_bounds, +) from fetchez.hooks import FetchHook from fetchez.utils import str2inc @@ -30,6 +34,7 @@ class RioWarpHook(FetchHook): name = "raster_warp" meta_stage = "file" meta_category = "raster-file" + meta_desc = "Reprojects, resamples, and clips raster files." def __init__(self, dst_crs=None, res=None, resampling="bilinear", **kwargs): super().__init__(**kwargs) @@ -46,6 +51,18 @@ def run(self, entries): ): continue + tmp_dir = os.path.abspath("tmp") + os.makedirs(tmp_dir, exist_ok=True) + + basename = os.path.basename(src_fn) + name, ext = os.path.splitext(basename) + out_fn = os.path.join(tmp_dir, f"{name}_warped{ext}") + + if os.path.exists(out_fn): + logger.debug(f"[{self.name}] Warped file already exists: {out_fn}") + entry["dst_fn"] = out_fn + continue + try: with rasterio.open(src_fn) as src: target_crs = ( @@ -73,6 +90,33 @@ def run(self, entries): if not needs_warp or not target_crs: continue + w, s, e, n = src.bounds + + if hasattr(mod, "region") and mod.region and mod.region.valid_p(): + region_bounds = ( + mod.region.xmin, + mod.region.ymin, + mod.region.xmax, + mod.region.ymax, + ) + + r_w, r_s, r_e, r_n = transform_bounds( + mod.region.srs, src.crs, *region_bounds + ) + + # Intersect the bounds + w = max(w, r_w) + s = max(s, r_s) + e = min(e, r_e) + n = min(n, r_n) + + # Skip if there is no spatial overlap + if w >= e or s >= n: + logger.warning( + f"[{self.name}] {basename} does not overlap with target region." + ) + continue + res_log = target_res if target_res else "Native" logger.info( f"[{self.name}] Warping {os.path.basename(src_fn)} (CRS: {target_crs}, Res: {res_log})..." @@ -83,7 +127,10 @@ def run(self, entries): target_crs, src.width, src.height, - *src.bounds, + w, + s, + e, + n, resolution=target_res, ) @@ -94,11 +141,15 @@ def run(self, entries): "transform": transform, "width": width, "height": height, + "compress": "deflate", + "tiled": True, + "blockxsize": 256, + "blockysize": 256, } ) - temp_fn = src_fn + ".warp.tif" - with rasterio.open(temp_fn, "w", **kwargs) as dst: + # temp_fn = src_fn + ".warp.tif" + with rasterio.open(out_fn, "w", **kwargs) as dst: for i in range(1, src.count + 1): reproject( source=rasterio.band(src, i), @@ -110,8 +161,8 @@ def run(self, entries): resampling=self.resampling, ) - shutil.move(temp_fn, src_fn) - entry["dst_fn"] = src_fn + # shutil.move(temp_fn, src_fn) + entry["dst_fn"] = out_fn except Exception as e: logger.error(f"[{self.name}] Failed to warp {src_fn}: {e}") diff --git a/src/globato/hooks/sinks/multi_stack.py b/src/globato/hooks/sinks/multi_stack.py index 54b3f40..4b6a246 100644 --- a/src/globato/hooks/sinks/multi_stack.py +++ b/src/globato/hooks/sinks/multi_stack.py @@ -102,7 +102,7 @@ def __init__( ) logger.info( - f"Initializing Multi_Stack internal arrays at {self.xcount}/{self.ycount}" + f"Initializing Multi_Stack internal arrays at {self.xcount}/{self.ycount} {self.region}" ) def _init_raster(self): diff --git a/src/globato/modules/bundles/crm_standard_bato.yaml b/src/globato/modules/bundles/crm_standard_bato.yaml index f274281..93793bc 100644 --- a/src/globato/modules/bundles/crm_standard_bato.yaml +++ b/src/globato/modules/bundles/crm_standard_bato.yaml @@ -12,7 +12,6 @@ tags: - glob-stream - glob-bundle modules: - - bundle: global-bathy-topo hooks: - name: raster_warp @@ -22,31 +21,34 @@ modules: - name: stream_reproject args: dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" # dst_srs: "EPSG:4326+3855" # TNM NED 1 - # - module: tnm - # args: {weight: 0.5, formats: "GeoTIFF", datasets: "1"} - # hooks: - # - name: raster_flats - # args: - # stage: "file" - # - name: raster_warp - # args: {res: 1s} + - module: tnm + args: {weight: 0.5, formats: "GeoTIFF", datasets: "1"} + hooks: + - name: raster_flats + args: + stage: "file" + - name: raster_warp + args: {res: 1s} - # - name: stream_data - # - name: stream_reproject - # args: {dst_srs: "EPSG:4326+3855"} - # - name: point_raster_mask - # args: - # barrier: "coastline" - # invert: False - # res: 1s - # - name: spatial_crop - # - name: range_z - # args: {min_z: 0.01} + - name: stream_data + - name: stream_reproject + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" + - name: point_raster_mask + args: + barrier: "coastline" + invert: False + res: 1s + - name: spatial_crop + - name: range_z + args: {min_z: 0.01} - # TNM NED 1/3 + # TNM NED 1/3 - module: tnm args: {weight: 1.0, formats: "GeoTIFF", datasets: "3"} hooks: @@ -56,7 +58,9 @@ modules: - name: raster_warp args: {res: 1s} - name: stream_reproject - args: {dst_srs: "EPSG:4326+3855"} + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: point_raster_mask args: barrier: "coastline" @@ -80,7 +84,9 @@ modules: args: data_type: bag - name: stream_reproject - args: {dst_srs: "EPSG:4326+3855"} + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: spatial_crop # - module: mbdb @@ -118,6 +124,7 @@ modules: args: src_srs: "EPSG:4326+5866" dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: spatial_crop - name: outlierz - name: range_z @@ -143,4 +150,5 @@ modules: args: src_srs: "EPSG:4326+5866" dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: spatial_crop diff --git a/src/globato/modules/bundles/cudem_standard_bato.yaml b/src/globato/modules/bundles/cudem_standard_bato.yaml index 838c3fb..2f0fb4e 100644 --- a/src/globato/modules/bundles/cudem_standard_bato.yaml +++ b/src/globato/modules/bundles/cudem_standard_bato.yaml @@ -21,6 +21,7 @@ modules: - name: stream_reproject args: dst_srs: "EPSG:4269+5703" + cache_dir: "%shared_cache%" # --- HIGH RES TOPOGRAPHY --- # - module: coned @@ -53,7 +54,9 @@ modules: invert: false res: .11111111s - name: range_z - args: {min_z: 0.01} + args: + min_z: 0.01 + cache_dir: "%shared_cache%" # USACE eHydro. - module: ehydro @@ -66,4 +69,5 @@ modules: - name: stream_reproject args: dst_srs: "EPSG:4269+5703" + cache_dir: "%shared_cache%" - name: outlierz diff --git a/src/globato/modules/bundles/etopo_standard_bato.yaml b/src/globato/modules/bundles/etopo_standard_bato.yaml index b094922..c2ad6a1 100644 --- a/src/globato/modules/bundles/etopo_standard_bato.yaml +++ b/src/globato/modules/bundles/etopo_standard_bato.yaml @@ -22,7 +22,9 @@ modules: - name: stream_data - name: stream_reproject - args: {dst_srs: "EPSG:4326+3855"} + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: point_raster_mask args: barrier: "coastline" @@ -43,7 +45,9 @@ modules: args: {res: .33333333s} - name: stream_data - name: stream_reproject - args: {dst_srs: "EPSG:4326+3855"} + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: point_raster_mask args: barrier: "coastline" @@ -67,6 +71,10 @@ modules: - name: stream_data args: chunk_size: 100000 + - name: stream_reproject + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: range_z args: {min_z: 0.01} @@ -77,9 +85,11 @@ modules: args: match: ".fbt" - name: stream_data - - name: set-srs + - name: stream_reproject args: src_srs: "EPSG:4326+9003" + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: rq args: reference: "gmrt/gebco/cudem" @@ -98,7 +108,10 @@ modules: data_type: "margrav-xyz" - name: stream_data - name: stream_reproject - args: {src_srs: "EPSG:4326+9003", dst_srs: "EPSG:4269+3855"} + args: + src_srs: "EPSG:4326+9003" + dst_srs: "EPSG:4269+3855" + cache_dir: "%shared_cache%" - name: range_z args: max_z: -0.1 @@ -120,6 +133,7 @@ modules: args: src_srs: "EPSG:4326+5866" dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: spatial_crop - name: outlierz @@ -143,6 +157,7 @@ modules: args: src_srs: "EPSG:4326+5866" dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: spatial_crop # Crowd-Sourced Bathymetry (Fills the gaps) @@ -162,5 +177,6 @@ modules: args: src_srs: "EPSG:4326+5866" dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: spatial_crop - name: outlierz diff --git a/src/globato/modules/bundles/global_bato.yaml b/src/globato/modules/bundles/global_bato.yaml index 7d4c5f1..7f856d3 100644 --- a/src/globato/modules/bundles/global_bato.yaml +++ b/src/globato/modules/bundles/global_bato.yaml @@ -40,7 +40,9 @@ modules: args: data_type: "rio" - name: stream_reproject - args: {dst_srs: "EPSG:4326+3855"} + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: range_z args: {min_z: 0.01} @@ -61,7 +63,9 @@ modules: args: data_type: "rio" - name: stream_reproject - args: {dst_srs: "EPSG:4326+3855"} + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: range_z args: {min_z: 0.01} @@ -88,7 +92,9 @@ modules: # method: inverse # offset: 1.2 - name: stream_reproject - args: {dst_srs: "EPSG:4326+3855"} + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: range_z args: {max_z: -0.01} @@ -104,10 +110,12 @@ modules: args: src_srs: "EPSG:4326+9003" - name: stream_reproject - args: {dst_srs: "EPSG:4326+3855"} + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: rq args: - reference: "gmrt/gebco/cudem" + reference: "gmrt/gebco" threshold: 5 mode: "percent" builder: "grid" @@ -125,7 +133,9 @@ modules: args: srs: "EPSG:4326+9003" - name: stream_reproject - args: {dst_srs: "EPSG:4326+3855"} + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: rq args: reference: "gebco" @@ -149,7 +159,9 @@ modules: args: max_z: -0.1 - name: stream_reproject - args: {dst_srs: "EPSG:4326+3855"} + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: rq args: reference: "gebco" @@ -177,7 +189,9 @@ modules: args: srs: "EPSG:4326+9003" - name: stream_reproject - args: {dst_srs: "EPSG:4326+3855"} + args: + dst_srs: "EPSG:4326+3855" + cache_dir: "%shared_cache%" - name: rq args: reference: "gebco" diff --git a/src/globato/recipes/modifiers/buffer_and_cut.py b/src/globato/recipes/modifiers/buffer_and_cut.py index f624294..f0da88e 100644 --- a/src/globato/recipes/modifiers/buffer_and_cut.py +++ b/src/globato/recipes/modifiers/buffer_and_cut.py @@ -47,10 +47,10 @@ def apply(self, config): ) self.pct = 5.0 - buffer_region = parsed_region.buffer( + buffer_region = parsed_region.copy().buffer( pct=self.pct, x_inc=self.increment, y_inc=self.increment ) - delivery_region = parsed_region.buffer( + delivery_region = parsed_region.copy().buffer( x_bv=self.cells * self.increment, y_bv=self.cells * self.increment ) config["region"] = buffer_region.to_list() diff --git a/src/globato/recipes/newport_coastal_coupling.yaml b/src/globato/recipes/newport_coastal_coupling.yaml index 1e59e02..e14e96a 100644 --- a/src/globato/recipes/newport_coastal_coupling.yaml +++ b/src/globato/recipes/newport_coastal_coupling.yaml @@ -23,6 +23,7 @@ modules: - name: stream_reproject args: dst_srs: "EPSG:4269+5703" + cache_dir: "%shared_cache%" - name: spatial_crop # This lidar dataset has water surface returns and # no bathymetry, so we just mask it to the coastline. @@ -35,6 +36,7 @@ modules: - name: stream_reproject args: dst_srs: "EPSG:4269+5703" + cache_dir: "%shared_cache%" - name: point_raster_mask args: barrier: osm