| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- #!/usr/bin/env python
- """Common representation for ImageCollection and FeatureCollection.
- This class is never intended to be instantiated by the user.
- """
- # Using lowercase function naming to match the JavaScript names.
- # pylint: disable=g-bad-name
- from . import apifunction
- from . import deprecation
- from . import ee_exception
- from . import element
- from . import filter # pylint: disable=redefined-builtin
- class Collection(element.Element):
- """Base class for ImageCollection and FeatureCollection."""
- _initialized = False
- def __init__(self, func, args, opt_varName=None):
- """Constructs a collection by initializing its ComputedObject."""
- super(Collection, self).__init__(func, args, opt_varName)
- @classmethod
- def initialize(cls):
- """Imports API functions to this class."""
- if not cls._initialized:
- apifunction.ApiFunction.importApi(cls, 'Collection', 'Collection')
- apifunction.ApiFunction.importApi(
- cls, 'AggregateFeatureCollection', 'Collection', 'aggregate_')
- cls._initialized = True
- @classmethod
- def reset(cls):
- """Removes imported API functions from this class.
- Also resets the serial ID used for mapping Python functions to 0.
- """
- apifunction.ApiFunction.clearApi(cls)
- cls._initialized = False
- def filter(self, new_filter):
- """Apply a filter to this collection.
- Args:
- new_filter: Filter to add to this collection.
- Returns:
- The filtered collection object.
- """
- if not new_filter:
- raise ee_exception.EEException('Empty filters.')
- return self._cast(apifunction.ApiFunction.call_(
- 'Collection.filter', self, new_filter))
- @deprecation.CanUseDeprecated
- def filterMetadata(self, name, operator, value):
- """Shortcut to add a metadata filter to a collection.
- This is equivalent to self.filter(Filter().metadata(...)).
- Args:
- name: Name of a property to filter.
- operator: Name of a comparison operator as defined
- by FilterCollection. Possible values are: "equals", "less_than",
- "greater_than", "not_equals", "not_less_than", "not_greater_than",
- "starts_with", "ends_with", "not_starts_with", "not_ends_with",
- "contains", "not_contains".
- value: The value to compare against.
- Returns:
- The filtered collection.
- """
- return self.filter(filter.Filter.metadata_(name, operator, value))
- def filterBounds(self, geometry):
- """Shortcut to add a geometry filter to a collection.
- Items in the collection with a footprint that fails to intersect
- the given geometry will be excluded.
- This is equivalent to self.filter(Filter().geometry(...)).
- Caution: providing a large or complex collection as the `geometry` argument
- can result in poor performance. Collating the geometry of collections does
- not scale well; use the smallest collection (or geometry) that is required
- to achieve the desired outcome.
- Args:
- geometry: The boundary to filter to either as a GeoJSON geometry,
- or a FeatureCollection, from which a geometry will be extracted.
- Returns:
- The filtered collection.
- """
- return self.filter(filter.Filter.geometry(geometry))
- def filterDate(self, start, opt_end=None):
- """Shortcut to filter a collection with a date range.
- Items in the collection with a system:time_start property that doesn't
- fall between the start and end dates will be excluded.
- This is equivalent to self.filter(ee.Filter.date(...)); see the ee.Filter
- type for other date filtering options.
- Args:
- start: The start date as a Date object, a string representation of
- a date, or milliseconds since epoch.
- opt_end: The end date as a Date object, a string representation of
- a date, or milliseconds since epoch.
- Returns:
- The filter object.
- """
- return self.filter(filter.Filter.date(start, opt_end))
- def getInfo(self):
- """Returns all the known information about this collection.
- This function makes an REST call to to retrieve all the known information
- about this collection.
- Returns:
- The return contents vary but will include at least:
- features: an array containing metadata about the items in the
- collection that passed all filters.
- properties: a dictionary containing the collection's metadata
- properties.
- """
- return super(Collection, self).getInfo()
- def limit(self, maximum, opt_property=None, opt_ascending=None):
- """Limit a collection to the specified number of elements.
- This limits a collection to the specified number of elements, optionally
- sorting them by a specified property first.
- Args:
- maximum: The number to limit the collection to.
- opt_property: The property to sort by, if sorting.
- opt_ascending: Whether to sort in ascending or descending order.
- The default is true (ascending).
- Returns:
- The collection.
- """
- args = {'collection': self, 'limit': maximum}
- if opt_property is not None:
- args['key'] = opt_property
- if opt_ascending is not None:
- args['ascending'] = opt_ascending
- return self._cast(
- apifunction.ApiFunction.apply_('Collection.limit', args))
- def sort(self, prop, opt_ascending=None):
- """Sort a collection by the specified property.
- Args:
- prop: The property to sort by.
- opt_ascending: Whether to sort in ascending or descending
- order. The default is true (ascending).
- Returns:
- The collection.
- """
- args = {'collection': self, 'key': prop}
- if opt_ascending is not None:
- args['ascending'] = opt_ascending
- return self._cast(
- apifunction.ApiFunction.apply_('Collection.limit', args))
- @staticmethod
- def name():
- return 'Collection'
- @staticmethod
- def elementType():
- """Returns the type of the collection's elements."""
- return element.Element
- def map(self, algorithm, opt_dropNulls=None):
- """Maps an algorithm over a collection.
- Args:
- algorithm: The operation to map over the images or features of the
- collection, a Python function that receives an image or features and
- returns one. The function is called only once and the result is
- captured as a description, so it cannot perform imperative operations
- or rely on external state.
- opt_dropNulls: If true, the mapped algorithm is allowed to return nulls,
- and the elements for which it returns nulls will be dropped.
- Returns:
- The mapped collection.
- Raises:
- ee_exception.EEException: if algorithm is not a function.
- """
- element_type = self.elementType()
- with_cast = lambda e: algorithm(element_type(e))
- return self._cast(apifunction.ApiFunction.call_(
- 'Collection.map', self, with_cast, opt_dropNulls))
- def iterate(self, algorithm, first=None):
- """Iterates over a collection with an algorithm.
- Applies a user-supplied function to each element of a collection. The
- user-supplied function is given two arguments: the current element, and
- the value returned by the previous call to iterate() or the first argument,
- for the first iteration. The result is the value returned by the final
- call to the user-supplied function.
- Args:
- algorithm: The function to apply to each element. Must take two
- arguments - an element of the collection and the value from the
- previous iteration.
- first: The initial state.
- Returns:
- The result of the Collection.iterate() call.
- Raises:
- ee_exception.EEException: if algorithm is not a function.
- """
- element_type = self.elementType()
- with_cast = lambda e, prev: algorithm(element_type(e), prev)
- return apifunction.ApiFunction.call_(
- 'Collection.iterate', self, with_cast, first)
|