Source code for ee_extra.ImageCollection.core

import json
import os
import re
import warnings
from typing import Optional, Union

import ee
import pkg_resources

from ee_extra.STAC.utils import _get_platform_STAC


[docs]def closest( x: ee.ImageCollection, date: Union[ee.Date, str], tolerance: Union[float, int] = 1, unit: str = "month", ) -> ee.ImageCollection: """Gets the closest image (or set of images if the collection intersects a region that requires multiple scenes) to the specified date. Args: x : Image Collection from which to get the closest image to the specified date. date : Date of interest. The method will look for images closest to this date. tolerance : Filter the collection to [date - tolerance, date + tolerance) before searching the closest image. This speeds up the searching process for collections with a high temporal resolution. unit : Units for tolerance. Available units: 'year', 'month', 'week', 'day', 'hour', 'minute' or 'second'. Returns: Closest images to the specified date. Examples: >>> import ee >>> from ee_extra.ImageCollection.core import closest >>> ee.Initialize() >>> S2 = ee.ImageCollection('COPERNICUS/S2_SR') >>> closest(S2,'2018-01-23') """ if not isinstance(date, ee.ee_date.Date): date = ee.Date(date) startDate = date.advance(-tolerance, unit) endDate = date.advance(tolerance, unit) x = x.filterDate(startDate, endDate) # no images? if x.size().getInfo() == 0: raise ValueError( "No images were retrieved using the established tolerance and units arguments." ) def setProperties(img): img = img.set( "dateDist", ee.Number(img.get("system:time_start")).subtract(date.millis()).abs(), ) img = img.set("day", ee.Date(img.get("system:time_start")).get("day")) img = img.set("month", ee.Date(img.get("system:time_start")).get("month")) img = img.set("year", ee.Date(img.get("system:time_start")).get("year")) return img x = x.map(setProperties).sort("dateDist") closestImageTime = x.limit(1).first().get("system:time_start") dayToFilter = ee.Filter.eq("day", ee.Date(closestImageTime).get("day")) monthToFilter = ee.Filter.eq("month", ee.Date(closestImageTime).get("month")) yearToFilter = ee.Filter.eq("year", ee.Date(closestImageTime).get("year")) x = x.filter(ee.Filter.And(dayToFilter, monthToFilter, yearToFilter)) return x