earthengine-api/python/ee/collection.py
Max Shawabkeh d5352dac11 v0.1.13
2013-12-11 14:02:09 -08:00

204 lines
6.4 KiB
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
import apifunction
import customfunction
import ee_exception
import ee_types
import element
import filter # pylint: disable=redefined-builtin
class Collection(element.Element):
"""Base class for ImageCollection and FeatureCollection."""
_initialized = False
def __init__(self, func, args):
"""Constructs a collection by initializing its ComputedObject."""
super(Collection, self).__init__(func, args)
@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))
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 when the collection is evaluated.
This is equivalent to self.filter(Filter().geometry(...)).
Args:
geometry: The boundary to filter to either as a GeoJSON geometry,
or a FeatureCollection, from which a geometry will be extracted.
Returns:
The filter object.
"""
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 time_start property that doesn't
fall between the start and end dates will be excluded.
This is equivalent to self.filter(Filter().date(...)).
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'
def mapInternal(self, cls, algorithm):
"""Maps an algorithm over a collection.
Args:
cls: The collection elements' type (class).
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.
Returns:
The mapped collection.
Raises:
ee_exception.EEException: if algorithm is not a function.
"""
if not callable(algorithm):
raise ee_exception.EEException(
'Can\'t map non-callable object: %s' % algorithm)
signature = {
'name': '',
'returns': 'Object',
'args': [{
'name': None,
'type': ee_types.classToName(cls)
}]
}
return self._cast(apifunction.ApiFunction.apply_('Collection.map', {
'collection': self,
'baseAlgorithm': customfunction.CustomFunction(signature, algorithm)
}))