Source code for pyowm.agroapi10.imagery
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pyowm.commons.enums import ImageTypeEnum
from pyowm.commons.image import Image
from pyowm.commons.tile import Tile
from pyowm.utils import formatting
[docs]
class MetaImage:
"""
A class representing metadata for a satellite-acquired image
:param url: the public URL of the image
:type url: str
:param preset: the preset of the image (supported values are listed by `pyowm.agroapi10.enums.PresetEnum`)
:type preset: str
:param satellite_name: the name of the satellite that acquired the image (supported values are listed
by `pyowm.agroapi10.enums.SatelliteEnum`)
:type satellite_name: str
:param acquisition_time: the UTC Unix epoch when the image was acquired
:type acquisition_time: int
:param valid_data_percentage: approximate percentage of valid data coverage
:type valid_data_percentage: float
:param cloud_coverage_percentage: approximate percentage of cloud coverage on the scene
:type cloud_coverage_percentage: float
:param sun_azimuth: sun azimuth angle at scene acquisition time
:type sun_azimuth: float
:param sun_elevation: sun zenith angle at scene acquisition time
:type sun_elevation: float
:param polygon_id: optional id of the polygon the image refers to
:type polygon_id: str
:param stats_url: the public URL of the image statistics, if available
:type stats_url: str or `None`
:returns: an `MetaImage` object
"""
image_type = None
def __init__(self, url, preset, satellite_name, acquisition_time,
valid_data_percentage, cloud_coverage_percentage, sun_azimuth, sun_elevation, polygon_id=None,
stats_url=None):
assert isinstance(url, str)
self.url = url
self.preset = preset
self.satellite_name = satellite_name
assert isinstance(acquisition_time, int)
assert acquisition_time >= 0, 'acquisition_time cannot be negative'
self._acquisition_time = acquisition_time
assert isinstance(valid_data_percentage, (float, int))
assert valid_data_percentage >= 0., 'valid_data_percentage cannot be negative'
self.valid_data_percentage = valid_data_percentage
assert isinstance(cloud_coverage_percentage, (float, int))
assert cloud_coverage_percentage >= 0., 'cloud_coverage_percentage cannot be negative'
self.cloud_coverage_percentage = cloud_coverage_percentage
assert isinstance(sun_azimuth, (float, int))
assert sun_azimuth >= 0. and sun_azimuth <= 360., 'sun_azimuth must be between 0 and 360 degrees'
self.sun_azimuth = sun_azimuth
assert isinstance(sun_elevation, (float, int))
assert sun_elevation >= 0. and sun_elevation <= 90., 'sun_elevation must be between 0 and 90 degrees'
self.sun_elevation = sun_elevation
self.polygon_id = polygon_id
self.stats_url = stats_url
[docs]
def acquisition_time(self, timeformat='unix'):
"""Returns the UTC time telling when the image data was acquired by the satellite
: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._acquisition_time, timeformat)
def __repr__(self):
return "<%s.%s - %s %s image acquired at %s by %s on polygon with id=%s>" % (
__name__, self.__class__.__name__,
self.image_type.name if self.image_type is not None else '',
self.preset, self.acquisition_time('iso'), self.satellite_name,
self.polygon_id if self.polygon_id is not None else 'None')
[docs]
class MetaPNGImage(MetaImage):
"""
Class representing metadata for a satellite image of a polygon in PNG format
"""
image_type = ImageTypeEnum.PNG
[docs]
class MetaTile(MetaImage):
"""
Class representing metadata for a tile in PNG format
"""
image_type = ImageTypeEnum.PNG
[docs]
class MetaGeoTiffImage(MetaImage):
"""
Class representing metadata for a satellite image of a polygon in GeoTiff format
"""
image_type = ImageTypeEnum.GEOTIFF
[docs]
class SatelliteImage:
"""
Class representing a downloaded satellite image, featuring both metadata and data
:param metadata: the metadata for this satellite image
:type metadata: a `pyowm.agro10.imagery.MetaImage` subtype instance
:param data: the actual data for this satellite image
:type data: either `pyowm.commons.image.Image` or `pyowm.commons.tile.Tile` object
:param downloaded_on: the UNIX epoch this satellite image was downloaded at
:type downloaded_on: int or `None`
:param palette: ID of the color palette of the downloaded images. Values are provided by `pyowm.agroapi10.enums.PaletteEnum`
:type palette: str or `None`
:returns: a `pyowm.agroapi10.imagery.SatelliteImage` instance
"""
def __init__(self, metadata, data, downloaded_on=None, palette=None):
assert isinstance(metadata, MetaImage)
self.metadata = metadata
assert isinstance(data, (Image, Tile))
self.data = data
if downloaded_on is not None:
assert isinstance(downloaded_on, int)
self._downloaded_on = downloaded_on
if palette is not None:
assert isinstance(palette, str)
self.palette = palette
[docs]
def downloaded_on(self, timeformat='unix'):
"""Returns the UTC time telling when the satellite image was downloaded from 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._downloaded_on, timeformat)
[docs]
def persist(self, path_to_file):
"""
Saves the satellite image to disk on a file
:param path_to_file: path to the target file
:type path_to_file: str
:return: `None`
"""
self.data.persist(path_to_file)
def __repr__(self):
return "<%s.%s - %s %s satellite image downloaded on: %s>" % (
__name__, self.__class__.__name__,
self.metadata.preset, self.metadata.satellite_name,
self.downloaded_on('iso') if self._downloaded_on is not None else 'None')