r-spatial / rgee

Google Earth Engine for R
https://r-spatial.github.io/rgee/
Other
668 stars 146 forks source link

Filtering multiple dates with ee.Filter.Or #330

Open andreatitolo opened 1 year ago

andreatitolo commented 1 year ago

At submit an issue, please attached the following information of your rgee session:

Attach your Python (reticulate) configuration:

library(reticulate)
py_config()
python:         /Users/andreatitolo/anaconda3/bin/python3.10
libpython:      NA
pythonhome:     /Users/andreatitolo/anaconda3:/Users/andreatitolo/anaconda3
version:        3.10.8 | packaged by conda-forge | (main, Nov 22 2022, 08:25:13) [Clang 14.0.6 ]
numpy:          /Users/andreatitolo/anaconda3/lib/python3.10/site-packages/numpy
numpy_version:  1.23.5
ee:             /Users/andreatitolo/anaconda3/lib/python3.10/site-packages/ee

NOTE: Python version was forced by the current process

Description

I am creating NDWI composites for each month of the year using Sentinel-2 images. However, I only need composites for four non consecutive months (january, april, june, december). I used to export all images and then just take what I need, however, I came across the existence of ee.filter.Or (https://developers.google.com/earth-engine/apidocs/ee-filter-or) which seems exactly what I need, based also on this answer.

However, when I apply the filter to my imageCollection of 12 images, I obtain an empty collection, and I don't understand what I am doing it wrong (100% my fault for sure).

Am I missing something? Below is the reproducible example (the filter is applied at the end).

What I Did

Code ```R # Initial Configuration --------------------------------------------------- library(rgee) # Initialize rgee ee_Initialize(email = "myemail@gmail.com", drive = TRUE, gcs = FALSE) study_region <- ee$Geometry$Polygon( coords = list( c(37.99069550372825,36.31033474346237), c(38.335048225896216,36.31033474346237), c(38.335048225896216,36.85151712320516), c(37.99069550372825,36.85151712320516) ) ) # Functions and variables Definition ----------------------------------------------------- area <- ee$String("tsh_NDWI_") ndwi_bands <- c("B3", "B11") sensor <- ee$String("_S2") start <- ee$Date$fromYMD(2021, 01, 01) end <- ee$List$sequence(0, 11) # Function to generate a list of dates over which we will map the image collection function # Use ee_utils_pyfunc when mapping over a ee_List object startDates <- end$map(ee_utils_pyfunc( function(x) start$advance(x, "month") )) # Function to mask clouds from the QA band in Sentinel images BOA cloudfunction <- function(image) { qa <- image$select("QA60") # Bits 10 and 11 are clouds and cirrus, respectively. cloudBitMask <- bitwShiftL(1, 10) cirrusBitMask <- bitwShiftL(1, 11) # Both flags should be set to zero, indicating clear conditions. mask <- qa$bitwiseAnd(cloudBitMask)$eq(0)$And( qa$bitwiseAnd(cirrusBitMask)$eq(0) ) # Return the masked and scaled data, without the QA bands. image$updateMask(mask)$ divide(10000)$ select("B.*")$ copyProperties(image, list("system:time_start")) } # Function to generate and NDWI band using the shortcut function getNDWI <- function(img) { NDWI <- img$normalizedDifference(ndwi_bands)$rename("NDWI") return(NDWI) } monthmap <- function(m){ start <- ee$Date(m) end <- ee$Date(m)$advance(1,"month") date_range <- ee$DateRange(start,end) name <- area$cat(start$format("YYYY-MM"))$cat(sensor) ImgYear <- ee$ImageCollection("COPERNICUS/S2_SR_HARMONIZED")$ filterDate(date_range)$ filterBounds(study_region)$ filter( ee$Filter$lt("CLOUDY_PIXEL_PERCENTAGE", 10))$ # Pre-filter to get less cloudy granules. map(cloudfunction)$ map(getNDWI)$ map(function(img){return(img$clip(study_region))}) return(ImgYear$median()$set("name",name)) } # Processing -------------------------------------------------------------- # Map the function over the list of dates created above list_of_images <- startDates$map(ee_utils_pyfunc(monthmap)) # Transform the list of images to an ImageCollection to batch export them ImgColl <- ee$ImageCollection(list_of_images) # Export ------------------------------------------------------------------ # Collection of 12 images cat("Collection Size: ", ImgColl$size()$getInfo()) ## Filter selected months ----------------------------------------------------------------------- filterSelected <- ee$Filter$Or( ee$Filter$date('2021-01-01', '2021-01-31'), ee$Filter$date('2021-04-01', '2021-04-30'), ee$Filter$date('2022-06-01', '2022-06-30'), ee$Filter$date('2021-12-01', '2021-12-31') ) Test <- ImgColl$filter(filterSelected) # Empty collection cat("Collection Size: ", Test$size()$getInfo()) ```