Source code for pyowm.agroapi10.search

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pyowm.agroapi10.enums import PresetEnum
from pyowm.agroapi10.imagery import MetaPNGImage, MetaTile, MetaGeoTiffImage
from pyowm.commons.databoxes import ImageType
from pyowm.utils import formatting


[docs] class SatelliteImagerySearchResultSet: """ Class representing a filterable result set by a satellite imagery search against the Agro API 1.0. Each result is a `pyowm.agroapi10.imagery.MetaImage` subtype instance """ def __init__(self, polygon_id, list_of_dict, query_timestamp): """ Parses raw data dict into a list of `pyowm.agroapi10.imagery.MetaImage` subtypes instances and stores that list internally for further filtering :param polygon_id: the ID of the polygon that has been searched for images :type polygon_id: str :param list_of_dict: the input data dictionary :type list_of_dict: list :param query_timestamp: UNIX timestamp of the query :type query_timestamp: int :returns: a `pyowm.agroapi10.imagery.SatelliteImagerySearchResultSet` instance or an exception is parsing fails """ assert isinstance(polygon_id, str) self.polygon_id = polygon_id assert isinstance(list_of_dict, list) assert isinstance(query_timestamp, int) self.query_timestamp = query_timestamp # parse raw data result = [] for the_dict in list_of_dict: # common metadata acquisition_time = the_dict.get('dt', None) satellite_name = the_dict.get('type', None) valid_data_percentage = the_dict.get('dc', None) cloud_coverage_percentage = the_dict.get('cl', None) sun = the_dict.get('sun', dict()) sun_azimuth = sun.get('azimuth', None) sun_elevation = sun.get('elevation', None) # Stats for the images stats_dict = the_dict.get('stats', dict()) stats_url_for_ndvi = stats_dict.get('ndvi', None) stats_url_for_evi = stats_dict.get('evi', None) # PNG images for the polygon png_dict = the_dict.get('image', dict()) true_color_png_url = png_dict.get('truecolor', None) false_color_png_url = png_dict.get('falsecolor', None) ndvi_png_url = png_dict.get('ndvi', None) evi_png_url = png_dict.get('evi', None) if true_color_png_url is not None: result.append( MetaPNGImage(true_color_png_url, PresetEnum.TRUE_COLOR, satellite_name, acquisition_time, valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=polygon_id)) if false_color_png_url is not None: result.append( MetaPNGImage(false_color_png_url, PresetEnum.FALSE_COLOR, satellite_name, acquisition_time, valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=polygon_id)) if ndvi_png_url is not None: result.append( MetaPNGImage(ndvi_png_url, PresetEnum.NDVI, satellite_name, acquisition_time, valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=polygon_id, stats_url=stats_url_for_ndvi)) if evi_png_url is not None: result.append( MetaPNGImage(evi_png_url, PresetEnum.EVI, satellite_name, acquisition_time, valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=polygon_id, stats_url=stats_url_for_evi)) # Tiles for the polygon tiles_dict = the_dict.get('tile', dict()) true_color_tile_url = tiles_dict.get('truecolor', None) false_color_tile_url = tiles_dict.get('falsecolor', None) ndvi_tile_url = tiles_dict.get('ndvi', None) evi_tile_url = tiles_dict.get('evi', None) if true_color_tile_url is not None: result.append( MetaTile(true_color_tile_url, PresetEnum.TRUE_COLOR, satellite_name, acquisition_time, valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=polygon_id)) if false_color_tile_url is not None: result.append( MetaTile(false_color_tile_url, PresetEnum.FALSE_COLOR, satellite_name, acquisition_time, valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=polygon_id)) if ndvi_tile_url is not None: result.append( MetaTile(ndvi_tile_url, PresetEnum.NDVI, satellite_name, acquisition_time, valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=polygon_id, stats_url=stats_url_for_ndvi)) if evi_tile_url is not None: result.append( MetaTile(evi_tile_url, PresetEnum.EVI, satellite_name, acquisition_time, valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=polygon_id, stats_url=stats_url_for_evi)) # geoTiff images for the polygon geotiff_dict = the_dict.get('data', dict()) true_color_geotiff_url = geotiff_dict.get('truecolor', None) false_color_geotiff_url = geotiff_dict.get('falsecolor', None) ndvi_geotiff_url = geotiff_dict.get('ndvi', None) evi_geotiff_url = geotiff_dict.get('evi', None) if true_color_geotiff_url is not None: result.append( MetaGeoTiffImage(true_color_geotiff_url, PresetEnum.TRUE_COLOR, satellite_name, acquisition_time, valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=polygon_id)) if false_color_geotiff_url is not None: result.append( MetaGeoTiffImage(false_color_geotiff_url, PresetEnum.FALSE_COLOR, satellite_name, acquisition_time, valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=polygon_id)) if ndvi_geotiff_url is not None: result.append( MetaGeoTiffImage(ndvi_geotiff_url, PresetEnum.NDVI, satellite_name, acquisition_time, valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=polygon_id, stats_url=stats_url_for_ndvi)) if evi_geotiff_url is not None: result.append( MetaGeoTiffImage(evi_geotiff_url, PresetEnum.EVI, satellite_name, acquisition_time, valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=polygon_id, stats_url=stats_url_for_evi)) self.metaimages = result
[docs] def issued_on(self, timeformat='unix'): """Returns the UTC time telling when the query was performed against the OWM Agro API :param timeformat: the format for the time value. May be: '*unix*' (default) for UNIX time '*iso*' for ISO8601-formatted string in the format ``YYYY-MM-DD HH:MM:SS+00`` '*date* for ``datetime.datetime`` object instance :type timeformat: str :returns: an int or a str """ return formatting.timeformat(self.query_timestamp, timeformat)
def __len__(self): return len(self.metaimages) def __repr__(self): return '<%s.%s - %s results for query issued on polygon_id=%s at %s>' % ( __name__, self.__class__.__name__, len(self), self.polygon_id, self.issued_on(timeformat='iso'))
[docs] def all(self): """ Returns all search results :returns: a list of `pyowm.agroapi10.imagery.MetaImage` instances """ return self.metaimages
[docs] def with_img_type(self, image_type): """ Returns the search results having the specified image type :param image_type: the desired image type (valid values are provided by the `pyowm.commons.enums.ImageTypeEnum` enum) :type image_type: `pyowm.commons.databoxes.ImageType` instance :returns: a list of `pyowm.agroapi10.imagery.MetaImage` instances """ assert isinstance(image_type, ImageType) return list(filter(lambda x: x.image_type == image_type, self.metaimages))
[docs] def with_preset(self, preset): """ Returns the search results having the specified preset :param preset: the desired image preset (valid values are provided by the `pyowm.agroapi10.enums.PresetEnum` enum) :type preset: str :returns: a list of `pyowm.agroapi10.imagery.MetaImage` instances """ assert isinstance(preset, str) return list(filter(lambda x: x.preset == preset, self.metaimages))
[docs] def with_img_type_and_preset(self, image_type, preset): """ Returns the search results having both the specified image type and preset :param image_type: the desired image type (valid values are provided by the `pyowm.commons.enums.ImageTypeEnum` enum) :type image_type: `pyowm.commons.databoxes.ImageType` instance :param preset: the desired image preset (valid values are provided by the `pyowm.agroapi10.enums.PresetEnum` enum) :type preset: str :returns: a list of `pyowm.agroapi10.imagery.MetaImage` instances """ assert isinstance(image_type, ImageType) assert isinstance(preset, str) return list(filter(lambda x: x.image_type == image_type and x.preset == preset, self.metaimages))