library(terra) library(sf) # Check the mosaic mosaic <- terra::rast('laravel_app/storage/app/angata/weekly_mosaic/week_52_2025.tif') cat('Mosaic info:\n') cat(' Layers:', terra::nlyr(mosaic), '\n') ext_vals <- c(terra::ext(mosaic)$xmin, terra::ext(mosaic)$xmax, terra::ext(mosaic)$ymin, terra::ext(mosaic)$ymax) cat(' Extent:', paste(round(ext_vals, 2), collapse=', '), '\n') # Extract band 5 band5 <- mosaic[[5]] cat('Band 5 (CI):\n') min_val <- as.numeric(terra::global(band5, 'min', na.rm=TRUE)) max_val <- as.numeric(terra::global(band5, 'max', na.rm=TRUE)) cat(' Min:', round(min_val, 3), '\n') cat(' Max:', round(max_val, 3), '\n') # Check field boundaries geojson_path <- 'laravel_app/storage/app/angata/Data/pivot.geojson' fields <- sf::st_read(geojson_path, quiet=TRUE) cat('\nTesting extraction on first field:\n') # Get first field field_1 <- fields[1, ] field_id <- field_1$field cat(' Field ID:', field_id, '\n') # Try extraction tryCatch({ field_geom <- terra::vect(sf::as_Spatial(field_1)) cat(' Geometry CRS:', terra::crs(field_geom), '\n') cat(' Raster CRS:', terra::crs(band5), '\n') result <- terra::extract(band5, field_geom) cat(' Extract result rows:', nrow(result), '\n') cat(' Extract result cols:', ncol(result), '\n') if (nrow(result) > 0) { vals <- result[, 2] cat(' Values extracted:', length(vals), '\n') cat(' Non-NA values:', sum(!is.na(vals)), '\n') if (sum(!is.na(vals)) > 0) { cat(' Range of non-NA values:', min(vals, na.rm=TRUE), 'to', max(vals, na.rm=TRUE), '\n') } } }, error = function(e) { cat(' ERROR:', e$message, '\n') })