Welcome to the documentation of the Earth Observation Data Analysis Library (EOdal)
===================================================================================
.. image:: ../img/eodal_s2_image_fcir.png
:width: 600
:alt: Sentinel-2 false color image of Lake Lucerne, Switzerland.
:align: center
A truely open-source package for unified analysis of Earth Observation (EO) data.
* cloud-native by design thanks to `STAC `_
* access to petabytes of satellite imagery including Landsat, Sentinel-1, Sentinel-2 and PlanetScope
* EO data querying, I/O, processing, analysis and visualization in a single package
* Modulare and lightweight architecture
* Almost unlimited expandability with interfaces to `xarray `_, `numpy `_, `geopandas `_, and many more
Getting started
---------------
EOdal can be installed from `PyPi `_ or from `source `_.
To get started you might have a look at some Jupyter notebooks we prepared. Check them out `here `_
Example
-------
.. code-block:: python
:caption: eodal_example.py
import geopandas as gpd
from datetime import datetime
from eodal.core.sensors.sentinel2 import Sentinel2
from eodal.mapper.feature import Feature
from eodal.mapper.filter import Filter
from eodal.mapper.mapper import Mapper, MapperConfigs
from typing import List
#%% user-inputs
# -------------------------- Collection -------------------------------
collection: str = 'sentinel2-msi'
# ------------------------- Time Range ---------------------------------
time_start: datetime = datetime(2022,3,1) # year, month, day (incl.)
time_end: datetime = datetime(2022,6,30) # year, month, day (incl.)
# ---------------------- Spatial Feature ------------------------------
geom: Path = Path('data/sample_polygons/lake_lucerne.gpkg')
# ------------------------- Metadata Filters ---------------------------
metadata_filters: List[Filter] = [
Filter('cloudy_pixel_percentage','<', 80),
Filter('processing_level', '==', 'Level-2A')
]
# query the scenes available (no I/O of scenes, this only fetches metadata)
feature = Feature.from_geoseries(gpd.read_file(geom).geometry)
mapper_configs = MapperConfigs(
collection=collection,
time_start=time_start,
time_end=time_end,
feature=feature,
metadata_filters=metadata_filters
)
# now, a new Mapper instance is created
mapper = Mapper(mapper_configs)
# query the metadata (i.e., available scenes) first
mapper.query_scenes()
# load the scenes available from STAC (reading bands B02 "blue", B03 "green", B04 "red")
scene_kwargs = {
'scene_constructor': Sentinel2.from_safe,
'scene_constructor_kwargs': {'band_selection': ['B02', 'B03', 'B04'], 'read_scl': False}
}
mapper.load_scenes(scene_kwargs=scene_kwargs)
# the data loaded into `mapper.data` as a EOdal SceneCollection
mapper.data
.. include:: source/readme.rst
:start-line: 2
.. toctree::
:maxdepth: 2
:caption: Table of Contents:
packages/modules
source/changelog
py-modindex
genindex