sat4ec is a Python package to monitor occupancy rates of German automotive producing sites by exploiting Sentinel-1 IW GRD data.
Cars stored on parking lots of automotive producing facilities interact with the Sentinel-1 SAR wave: their presence or absence returns a strong or weak signal, respectively. The Sat4Ec algorithm aggregates a single mean SAR backscatter value for each AOI and computes a time series. In this way, timestamps of high or low parking lot occupancy rates can be identified.
Example Output for BMW Regensburg

The following peer-reviewed publication describes the methods and validation process in more detail:
Kraft, F., Martinis, S., Krullikowski, C., Plank, S., Anghelea, A., Delago Blasco, J. M., Schönenberger, K., Köhlmann, M., & Brauchler, M. (2025). Satellite Data for Economic Insights: Towards Tracking Automotive Production in Germany with Sentinel-1 for Economic Nowcasting. IEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing. https://doi.org/10.1109/JSTARS.2025.3601351
The sat4ec indicator requires an active SentinelHub subscription or Copernicus Data Space Ecosystem (CDSE) registration.
The main functionality is encapsulated inside the following scripts:
- The algorithm can simply be run from the Jupyter notebook
sat4ec.ipynb. - Alternatively, the algorithm can also be executed from the Python script
sat4ec/execution/dev/exe_runner.py.
This package also provides standalone CLI functionality:
usage: main.py [-h] --aoi_data AOI [--aoi_split {true,false}] --out_dir OUT --start_date YYYY-MM-DD [--end_date YYYY-MM-DD] [--polarization {VH,VV}] [--aggregate {daily,monthly}] [--orbit {asc,des,both}]
[--name NAME] [--regression {spline,poly,rolling}] [--linear {true,false}] [--linear_fill {true,false}] [--overwrite_raw {true,false}]
Compute aggregated statistics on Sentinel-1 data
options:
-h, --help show this help message and exit
--aoi_data AOI Path to AOI.[GEOJSON, SHP, GPKG], AOI geometry as WKT, Polygon or Multipolygon.
--aoi_split {true,false}
Wether to split the AOI into separate features or not, default: false.
--out_dir OUT Path to output directory.
--start_date YYYY-MM-DD
Begin of the time series, as YYYY-MM-DD, like 2020-11-01
--end_date YYYY-MM-DD
End of the time series, as YYYY-MM-DD, like 2020-11-01
--polarization {VH,VV}
Polarization of Sentinel-1 data, default: VH
--aggregate {daily,monthly}
Aggregation interval, default: daily
--orbit {asc,des,both}
Orbit of Sentinel-1 data, default: ascending
--name NAME Name of the location, e.g. BMW Regensburg. Appears in the plot title.
--regression {spline,poly,rolling}
Type of the regression, default: spline.
--linear {true,false}
Wether to plot the linear regression with insensitive range or not, default: false.
--linear_fill {true,false}
Wether to fill the linear insensitive range or not, default: false.
--overwrite_raw {true,false}
Overwrite existing raw data if desired, default: false.
This project uses a conda environment. For installing dependencies use:
conda env createFor the latest list of dependencies check the environment.yml.
Some development guardrails are enforced via pre-commit. This is to
ensure we follow similar code styles or it automatically cleans up jupyter notebooks.
To install pre-commit (not necessary if you installed the conda
environment):
conda/pip install pre-commitTo initialize all pre-commit hooks, run:
pre-commit installTo test whether pre-commit works:
pre-commit run --all-filesIt will check all files tracked by git and apply the triggers set up in
.pre-commit-config.yaml. That is, it will run triggers, possibly
changing the contents of the file (e.g. black formatting). Once set up, pre-commit will run, as
the name implies, prior to each git commit. In its current config, it will format code with
black and isort, clean up jupyter notebook output cells, remove trailing whitespaces and will
block large files to be committed. If it fails, one has to re-stage the affected files (git add or
git stage), and re-commit.
The code applies Python unit tests, located in tests with test data in tests/testdata.
The Sat4Ec project team includes (in alphabetical order):
- Anghelea, Anca (ESA)
- Delgado Blasco, José Manuel (Ranstad)
- Kraft, Franziska (DLR)
- Krullikowski, Christian (DLR)
- Martinis, Sandro (DLR)
- Plank, Simon (DLR)
- Schönenberger, Klara (Destatis)
European Space Agency (ESA), German Aerospace Center (DLR), Randstad Italia SPA (Ranstad), Federal Statistical Office of Germany (Destatis)
This software is licensed under the Apache 2.0 License.
Copyright (c) 2024 German Aerospace Center (DLR) * German Remote Sensing Data Center * Department: Geo-Risks and Civil Security
See changelog
The development team welcomes contributions from the community. For more detailed information, see our guide on contributing if you're interested in getting involved.
The project ‘Satellite-based economic flash estimation (Sat4Ec)’ was funded by the European Statistical Office (Eurostat) as part of the European Union's Single Market Programme in the thematic area SMP-ESS-2022-GEOS-IBA-REGIO (project-ID: 101113054). The project aimed to develop economic indicators from satellite time series, which could support estimations of the gross domestic product (GDP) in Germany. The idea of observing production parking lot occupancy rates and linking those to economic variables was originally developed by ESA and the RHEA Group.
