Home | Benchmarks | Categories | Atom Feed

Posted on Fri 04 September 2026 under Satellites

ICEYE's Open Satellite Feed

ICEYE is a 14-year-old Synthetic Aperture Radar (SAR) satellite manufacturer and constellation operator. They have a headquarters in Espoo, Finland, about a 25-minute drive from Helsinki city centre, as well as offices in Poland, Luxembourg, Greece and the UK. As of this writing, LinkedIn lists ICEYE as having 1,131 associated members.

ICEYE's satellites can see through clouds, smoke, rain, snow and certain types of camouflage attempting to cover the ground below. They can capture images day or night at resolutions as fine as 50cm. They can also record short videos.

The company was founded by its CEO, Rafal Modrzewski, who moved from Poland to Finland in 2010 to work as a researcher before later starting ICEYE in 2012 alongside his co-founder Pekka Laurila.

Rafal is to the left in this image, taken within the Polish Military's Satellite Operations Centre in Warsaw.

ICEYE Open Feed

In March, Rafal met with Ukraine's President Volodymyr Zelenskyy.

ICEYE Open Feed

A week prior, he met with India's Prime Minister Narendra Modi alongside Finland's President Alexander Stubb.

ICEYE Open Feed

A number of their satellites were deployed by SpaceX's Transporter 16 Mission on March 30th.

ICEYE Open Feed

This is one of their satellites during its release into Low Earth Orbit.

ICEYE Open Feed

ICEYE have a large number of satellites in orbit that they control, as well as satellites they've built for other entities around the world. These are the latest details for any assets still in orbit from GCAT.

$ ~/duckdb
.maxrows 100

SELECT State,
       Name,
       * EXCLUDE(AltNames,
                 Bus,
                 Dest,
                 Attach_flag,
                 Subtype_flag,
                 Orbit_flag,
                 ID_flag,
                 Status_or_failure_flag,
                 Coarse_type,
                 SDate,
                 SDate_Year,
                 "Primary",
                 DDate,
                 Manufacturer,
                 Motor,
                 JCAT,
                 ODate,
                 Type,
                 OQUAL,
                 PLName,
                 Shape,
                 Name,
                 State,
                 DryMass,
                 TotMass)
FROM     'gcat/satcat.parquet'
WHERE    (PLName ILIKE '%ICEYE%' OR Name ILIKE '%ICEYE%') AND Status = 'In orbit'
ORDER BY Launch_Tag,
         Name;
┌─────────┬──────────────┬────────┬──────────┬───────┬────────────┬─────────────┬────────┬───────┬─────────┬─────────────┬─────────────┬─────────┬────────────┬─────────┬───────┬──────────┐
│  State  │     Name     │ Apogee │ Diameter │  Inc  │ Launch_Tag │    LDate    │ Length │ Mass  │ OpOrbit │    Owner    │   Parent    │ Perigee │   Piece    │ Satcat  │ Span  │  Status  │
│ varchar │   varchar    │ int32  │  float   │ float │  varchar   │   varchar   │ float  │ float │ varchar │   varchar   │   varchar   │ varchar │  varchar   │ varchar │ float │ varchar  │
├─────────┼──────────────┼────────┼──────────┼───────┼────────────┼─────────────┼────────┼───────┼─────────┼─────────────┼─────────────┼─────────┼────────────┼─────────┼───────┼──────────┤
│ FI      │ ICEYE-X2     │    588 │      0.6 │ 97.77 │ 2018-099   │ 2018 Dec  3 │    0.8 │  80.0 │ LLEO/S  │ ICEYE       │ A09251      │ 570     │ 2018-099AU │ 43800   │   1.5 │ In orbit │
│ FI      │ ICEYE-X4     │    594 │      0.6 │ 97.68 │ 2019-038   │ 2019 Jul  5 │    0.8 │  80.0 │ LLEO/S  │ ICEYE       │ A09444      │ 564     │ 2019-038D  │ 44390   │   1.5 │ In orbit │
│ FI      │ ICEYE-X5     │    591 │      0.6 │ 97.68 │ 2019-038   │ 2019 Jul  5 │    0.8 │  80.0 │ LLEO/S  │ ICEYE       │ A09444      │ 564     │ 2019-038C  │ 44389   │   1.5 │ In orbit │
│ FI      │ ICEYE-X6     │    568 │      0.6 │ 97.67 │ 2020-068   │ 2020 Sep 28 │    0.8 │  80.0 │ LLEO/S  │ ICEYE       │ A09632      │ 545     │ 2020-068M  │ 46497   │   1.5 │ In orbit │
│ FI      │ ICEYE-X7     │    567 │      0.6 │ 97.67 │ 2020-068   │ 2020 Sep 28 │    0.8 │  80.0 │ LLEO/S  │ ICEYE       │ A09632      │ 548     │ 2020-068L  │ 46496   │   1.5 │ In orbit │
│ FI      │ ICEYE-X25    │    534 │      0.5 │ 97.51 │ 2023-084   │ 2023 Jun 12 │    0.7 │  90.0 │ LLEO/S  │ ICEYE       │ A10979      │ 513     │ 2023-084AH │ 56963   │  3.25 │ In orbit │
│ FI      │ ICEYE-X31    │    529 │      0.5 │ 97.48 │ 2023-174   │ 2023 Nov 11 │    0.7 │  90.0 │ LLEO/S  │ ICEYE       │ A11079  EXO │ 515     │ 2023-174AJ │ 58288   │  3.25 │ In orbit │
│ US      │ ICEYE-X34    │    529 │      0.5 │ 97.48 │ 2023-174   │ 2023 Nov 11 │    0.7 │  90.0 │ LLEO/S  │ ICEUS       │ A11079  EXO │ 514     │ 2023-174AQ │ 58294   │  3.25 │ In orbit │
│ FI      │ ICEYE-X35    │    529 │      0.5 │ 97.48 │ 2023-174   │ 2023 Nov 11 │    0.7 │  90.0 │ LLEO/S  │ ICEYE       │ A11079  EXO │ 513     │ 2023-174AY │ 58302   │  3.25 │ In orbit │
│ US      │ ICEYE-X36    │    598 │      0.5 │ 97.74 │ 2024-043   │ 2024 Mar  4 │    0.7 │  90.0 │ LLEO/S  │ ICEUS       │ A11161      │ 587     │ 2024-043F  │ 59103   │  3.25 │ In orbit │
│ US      │ ICEYE-X37    │    599 │      0.5 │ 97.75 │ 2024-043   │ 2024 Mar  4 │    0.7 │  90.0 │ LLEO/S  │ ICEUS       │ A11161      │ 587     │ 2024-043E  │ 59102   │  3.25 │ In orbit │
│ FI      │ ICEYE-X38    │    601 │      0.5 │ 97.74 │ 2024-043   │ 2024 Mar  4 │    0.7 │  90.0 │ LLEO/S  │ ICEYE       │ A11161      │ 588     │ 2024-043C  │ 59100   │  3.25 │ In orbit │
│ BR      │ Carcara III? │    595 │      0.6 │ 97.75 │ 2024-149   │ 2024 Aug 16 │    0.8 │  80.0 │ LLEO/S  │ FAB/ICEYE   │ A11288      │ 586     │ 2024-149BZ │ 60539   │   1.5 │ In orbit │
│ BR      │ Carcara IV?  │    595 │      0.6 │ 97.75 │ 2024-149   │ 2024 Aug 16 │    0.8 │  80.0 │ LLEO/S  │ FAB/ICEYE   │ A11288      │ 586     │ 2024-149CG │ 60546   │   1.5 │ In orbit │
│ US      │ ICEYE-X33    │    595 │      0.6 │ 97.75 │ 2024-149   │ 2024 Aug 16 │    0.8 │  80.0 │ LLEO/S  │ ICEUS/ICEYE │ A11288      │ 588     │ 2024-149CJ │ 60548   │   1.5 │ In orbit │
│ UAE     │ ICEYE-X40    │    595 │      0.6 │ 97.75 │ 2024-149   │ 2024 Aug 16 │    0.8 │  80.0 │ LLEO/S  │ ALYAH       │ A11288      │ 585     │ 2024-149CK │ 60549   │   1.5 │ In orbit │
│ FI      │ ICEYE-X47    │    515 │      0.6 │  45.0 │ 2024-247   │ 2024 Dec 21 │    0.8 │  80.0 │ LLEO/I  │ ICEYE       │ A11382      │ 512     │ 2024-247N  │ 62389   │   1.5 │ In orbit │
│ FI      │ ICEYE-X49    │    516 │      0.6 │  45.0 │ 2024-247   │ 2024 Dec 21 │    0.8 │  80.0 │ LLEO/I  │ ICEYE       │ A11382      │ 511     │ 2024-247H  │ 62384   │   1.5 │ In orbit │
│ US      │ ICEYE-X41    │    592 │      0.6 │ 97.75 │ 2025-009   │ 2025 Jan 14 │    0.8 │  80.0 │ LLEO/S  │ ICEUS       │ A11398      │ 589     │ 2025-009CV │ 62700   │   1.5 │ In orbit │
│ UAE     │ ICEYE-X42    │    592 │      0.6 │ 97.75 │ 2025-009   │ 2025 Jan 14 │    0.8 │  80.0 │ LLEO/S  │ SP42        │ A11398      │ 590     │ 2025-009CT │ 62698   │   1.5 │ In orbit │
│ UAE     │ ICEYE-X44    │    593 │      0.6 │ 97.75 │ 2025-009   │ 2025 Jan 14 │    0.8 │  80.0 │ LLEO/S  │ SP42        │ A11398      │ 592     │ 2025-009DC │ 62707   │   1.5 │ In orbit │
│ US      │ ICEYE-X45    │    593 │      0.6 │ 97.75 │ 2025-009   │ 2025 Jan 14 │    0.8 │  80.0 │ LLEO/S  │ ICEUS       │ A11398      │ 592     │ 2025-009DA │ 62705   │   1.5 │ In orbit │
│ FI      │ ICEYE-X46    │    591 │      0.6 │ 97.74 │ 2025-052   │ 2025 Mar 15 │    0.8 │  80.0 │ LLEO/S  │ ICEYE       │ A11437      │ 585     │ 2025-052BA │ 63258   │   1.5 │ In orbit │
│ US      │ ICEYE-X48    │    591 │      0.6 │ 97.74 │ 2025-052   │ 2025 Mar 15 │    0.8 │  80.0 │ LLEO/S  │ ICEUS       │ A11437      │ 586     │ 2025-052AV │ 63253   │   1.5 │ In orbit │
│ FI      │ ICEYE-X50    │    591 │      0.6 │ 97.74 │ 2025-052   │ 2025 Mar 15 │    0.8 │  80.0 │ LLEO/S  │ ICEYE       │ A11437      │ 585     │ 2025-052AX │ 63255   │   1.5 │ In orbit │
│ US      │ ICEYE-X51    │    591 │      0.6 │ 97.74 │ 2025-052   │ 2025 Mar 15 │    0.8 │  80.0 │ LLEO/S  │ ICEUS       │ A11437      │ 589     │ 2025-052AZ │ 63257   │   1.5 │ In orbit │
│ FI      │ ICEYE-X52    │    595 │      0.6 │ 97.75 │ 2025-135   │ 2025 Jun 23 │    0.8 │  80.0 │ LLEO/S  │ ICEYE       │ A11534      │ 588     │ 2025-135AW │ 64572   │   1.5 │ In orbit │
│ FI      │ ICEYE-X53    │    594 │      0.6 │ 97.75 │ 2025-135   │ 2025 Jun 23 │    0.8 │  80.0 │ LLEO/S  │ ICEYE       │ A11534      │ 589     │ 2025-135BJ │ 64584   │   1.5 │ In orbit │
│ NL      │ ICEYE-X54    │    595 │      0.6 │ 97.75 │ 2025-135   │ 2025 Jun 23 │    0.8 │  80.0 │ LLEO/S  │ RNAF        │ A11534      │ 589     │ 2025-135AU │ 64570   │   1.5 │ In orbit │
│ FI      │ ICEYE-X55    │    594 │      0.6 │ 97.75 │ 2025-135   │ 2025 Jun 23 │    0.8 │  80.0 │ LLEO/S  │ ICEYE       │ A11534      │ 587     │ 2025-135BF │ 64581   │   1.5 │ In orbit │
│ FI      │ ICEYE-X56    │    594 │      0.6 │ 97.75 │ 2025-135   │ 2025 Jun 23 │    0.8 │  80.0 │ LLEO/S  │ ICEYE       │ A11534      │ 588     │ 2025-135AY │ 64574   │   1.5 │ In orbit │
│ US      │ ICEYE-X57    │    594 │      0.6 │ 97.75 │ 2025-135   │ 2025 Jun 23 │    0.8 │  80.0 │ LLEO/S  │ ICEUS       │ A11534      │ 590     │ 2025-135BC │ 64578   │   1.5 │ In orbit │
│ UAE     │ Foresight-3  │    509 │      0.6 │  45.4 │ 2025-248   │ 2025 Nov  2 │    0.8 │  80.0 │ LLEO/I  │ SP42        │ A11675      │ 497     │ 2025-248H  │ 66300   │   1.5 │ In orbit │
│ UAE     │ Foresight-4  │    509 │      0.6 │  45.4 │ 2025-248   │ 2025 Nov  2 │    0.8 │  80.0 │ LLEO/I  │ SP42        │ A11675      │ 498     │ 2025-248J  │ 66301   │   1.5 │ In orbit │
│ UAE     │ Foresight-5  │    512 │      0.6 │ 45.41 │ 2025-248   │ 2025 Nov  2 │    0.8 │  80.0 │ LLEO/I  │ SP42        │ A11675      │ 510     │ 2025-248K  │ 66302   │   1.5 │ In orbit │
│ GR      │ ICEYE SAR-1  │    513 │      0.6 │ 97.44 │ 2025-276   │ 2025 Nov 28 │    0.8 │ 120.0 │ LLEO/S  │ ELKED       │ A11695      │ 511     │ 2025-276CQ │ 66752   │   1.5 │ In orbit │
│ GR      │ ICEYE SAR-2  │    514 │      0.6 │ 97.44 │ 2025-276   │ 2025 Nov 28 │    0.8 │ 120.0 │ LLEO/S  │ ELKED       │ A11695      │ 511     │ 2025-276CR │ 66753   │   1.5 │ In orbit │
│ FI      │ ICEYE-X58    │    515 │      0.6 │ 97.44 │ 2025-276   │ 2025 Nov 28 │    0.8 │ 120.0 │ LLEO/S  │ ICEYE       │ A11695      │ 512     │ 2025-276CP │ 66751   │   1.5 │ In orbit │
│ FI      │ ICEYE-X62    │    516 │      0.6 │ 97.44 │ 2025-276   │ 2025 Nov 28 │    0.8 │ 120.0 │ LLEO/S  │ ICEYE       │ A11695      │ 512     │ 2025-276CT │ 66755   │   1.5 │ In orbit │
│ PL      │ MikroSAR     │    513 │      0.6 │ 97.44 │ 2025-276   │ 2025 Nov 28 │    0.8 │ 120.0 │ LLEO/S  │ ARGUS/MON   │ A11695      │ 512     │ 2025-276CS │ 66754   │   1.5 │ In orbit │
│ FI      │ ICEYE-X63    │    612 │      0.6 │  97.8 │ 2026-004   │ 2026 Jan 11 │    0.8 │ 120.0 │ LEO/S   │ PUOL        │ A11731      │ 602     │ 2026-004K  │ 67372   │   1.5 │ In orbit │
│ NL      │ ICEYE-X64    │    607 │      0.6 │  97.8 │ 2026-004   │ 2026 Jan 11 │    0.8 │ 120.0 │ LEO/S   │ RNAF        │ A11731      │ 602     │ 2026-004L  │ 67373   │   1.5 │ In orbit │
│ P       │ CA-01        │    595 │      0.6 │ 97.75 │ 2026-067   │ 2026 Mar 30 │    0.8 │ 120.0 │ LLEO/S  │ FAP         │ A11790      │ 593     │ 2026-067CJ │ 68496   │   1.5 │ In orbit │
│ FI      │ ICEYE-X71    │    595 │      0.6 │ 97.75 │ 2026-067   │ 2026 Mar 30 │    0.8 │ 120.0 │ LLEO/S  │ ICEYE       │ A11790      │ 593     │ 2026-067CG │ 68494   │   1.5 │ In orbit │
│ FI      │ ICEYE-X72    │    602 │      0.6 │ 97.76 │ 2026-067   │ 2026 Mar 30 │    0.8 │ 120.0 │ LEO/S   │ ICEYE       │ A11790      │ 599     │ 2026-067CS │ 68504   │   1.5 │ In orbit │
│ FI      │ ICEYE-X74    │    594 │      0.6 │ 97.76 │ 2026-067   │ 2026 Mar 30 │    0.8 │ 120.0 │ LLEO/S  │ ICEYE       │ A11790      │ 592     │ 2026-067CN │ 68500   │   1.5 │ In orbit │
│ FI      │ ICEYE-X75    │    596 │      0.6 │ 97.76 │ 2026-067   │ 2026 Mar 30 │    0.8 │ 120.0 │ LLEO/S  │ ICEYE       │ A11790      │ 592     │ 2026-067CK │ 68497   │   1.5 │ In orbit │
│ FI      │ ICEYE-X76    │    602 │      0.6 │ 97.76 │ 2026-067   │ 2026 Mar 30 │    0.8 │ 120.0 │ LEO/S   │ ICEYE       │ A11790      │ 599     │ 2026-067CQ │ 68502   │   1.5 │ In orbit │
│ PL      │ ICEYE-X78    │    510 │      0.6 │ 97.41 │ 2026-100   │ 2026 May  3 │    0.8 │ 120.0 │ LLEO/S  │ MON/WKL     │ A11839      │ 501     │ 2026-100R  │ 68995   │   1.5 │ In orbit │
│ FI      │ ICEYE-X82    │    509 │      0.6 │ 97.41 │ 2026-100   │ 2026 May  3 │    0.8 │ 120.0 │ LLEO/S  │ ICEYE       │ A11839      │ 501     │ 2026-100S  │ 68996   │   1.5 │ In orbit │
│ FI      │ ICEYE-X77    │    597 │      0.6 │ 97.76 │ 2026-156   │ 2026 Jul  7 │    0.8 │ 120.0 │ LLEO/S  │ ICEYE       │ A11917      │ 586     │ 2026-156Z  │ 69892   │   1.5 │ In orbit │
│ NL      │ ICEYE-X79    │    598 │      0.6 │ 97.75 │ 2026-156   │ 2026 Jul  7 │    0.8 │ 120.0 │ LLEO/S  │ RNAF        │ A11917      │ 587     │ 2026-156B  │ 69870   │   1.5 │ In orbit │
│ FI      │ ICEYE-X80    │    598 │      0.6 │ 97.76 │ 2026-156   │ 2026 Jul  7 │    0.8 │ 120.0 │ LLEO/S  │ ICEYE       │ A11917      │ 588     │ 2026-156AA │ 69893   │   1.5 │ In orbit │
│ FI      │ ICEYE-X81    │    598 │      0.6 │ 97.76 │ 2026-156   │ 2026 Jul  7 │    0.8 │ 120.0 │ LLEO/S  │ ICEYE       │ A11917      │ 588     │ 2026-156W  │ 69889   │   1.5 │ In orbit │
└─────────┴──────────────┴────────┴──────────┴───────┴────────────┴─────────────┴────────┴───────┴─────────┴─────────────┴─────────────┴─────────┴────────────┴─────────┴───────┴──────────┘

Earlier this year, ICEYE announced an open data initiative. This includes an S3 bucket with select imagery and videos they've captured from 2024 all the way through to this week.

In this post, I'll analyse the imagery they've captured and published openly this year.

My Workstation

I'm using a 5.7 GHz AMD Ryzen 9 9950X CPU. It has 16 cores and 32 threads and 1.2 MB of L1, 16 MB of L2 and 64 MB of L3 cache. It has a liquid cooler attached and is housed in a spacious, full-sized Cooler Master HAF 700 computer case.

The system has 96 GB of DDR5 RAM clocked at 4,800 MT/s and a 5th-generation, Crucial T700 4 TB NVMe M.2 SSD which can read at speeds up to 12,400 MB/s. There is a heatsink on the SSD to help keep its temperature down. This is my system's C drive.

The system is powered by a 1,200-watt, fully modular Corsair Power Supply and is sat on an ASRock X870E Nova 90 Motherboard.

I'm running Ubuntu 24 LTS via Microsoft's Ubuntu for Windows on Windows 11 Pro. In case you're wondering why I don't run a Linux-based desktop as my primary work environment, I'm still using an Nvidia GTX 1080 GPU which has better driver support on Windows and ArcGIS Pro only supports Windows natively.

Installing Prerequisites

I'll use AWS' CLI for downloading ICEYE's deliverables and jq to help format some of the data in this post.

$ sudo apt update
$ sudo apt install \
    awscli \
    jq

I'll use DuckDB, along with its H3, JSON, Lindel, Parquet and Spatial extensions in this post.

$ cd ~
$ wget -c https://github.com/duckdb/duckdb/releases/download/v1.5.4/duckdb_cli-linux-amd64.zip
$ unzip -j duckdb_cli-linux-amd64.zip
$ chmod +x duckdb
$ ~/duckdb
INSTALL h3 FROM community;
INSTALL lindel FROM community;
INSTALL json;
INSTALL parquet;
INSTALL spatial;

I'll set up DuckDB to load every installed extension each time it launches.

$ vi ~/.duckdbrc
.timer on
.width 180
LOAD h3;
LOAD lindel;
LOAD json;
LOAD parquet;
LOAD spatial;

The maps in this post were rendered with QGIS version 4.2.1. QGIS is a desktop application that runs on Windows, macOS and Linux. The application has grown in popularity in recent years and has ~22M application launches from users all around the world each month.

The boundaries and place names were sourced from Natural Earth. Maritime Boundaries were sourced from Marine Regions. I used QGIS' HCMGIS plugin to add satellite imagery basemaps from Bing to this post.

Analysis-Ready Data

I'll list out the contents of their S3 bucket into a line-delimited JSON file.

$ aws --no-sign-request \
      --output json \
      s3api \
      list-objects \
      --bucket iceye-open-data-catalog \
      --max-items=100000000 \
    | jq -c '.Contents[]' \
    > iceye_s3.json

I'll clean up a few of the fields and import each of the above records into a DuckDB table.

$ ~/duckdb -nullvalue " "
CREATE OR REPLACE TABLE s3_inventory AS
    SELECT * EXCLUDE(LastModified),
           LastModified: LastModified::TIMESTAMP,
           file_type:    IF(Key LIKE '%.%',
                            SPLIT(Key, '.')[-1],
                            NULL),
           captured_at:
                IF(KEY LIKE '%ICEYE_%' AND SPLIT(SPLIT(Key, '/')[-1], '_')[3] LIKE '%Z%',
                   MAKE_DATE(SPLIT(SPLIT(Key, '/')[-1], '_')[3][:8][1:4]::INT,
                             SPLIT(SPLIT(Key, '/')[-1], '_')[3][:8][5:6]::INT,
                             SPLIT(SPLIT(Key, '/')[-1], '_')[3][:8][7:8]::INT),
                   NULL)
    FROM   READ_JSON('iceye_s3.json');

These are the number of deliverables for each year and month for which there is a capture time.

PIVOT (
    SELECT   year_:  YEAR(captured_at),
             month_: MONTH(captured_at),
             cnt:    COUNT(*)
    FROM     s3_inventory
    WHERE    captured_at IS NOT NULL
    GROUP BY 1, 2
)
ON       year_
USING    SUM(cnt)
GROUP BY month_
ORDER BY month_;
┌────────┬────────┬────────┬────────┬────────┐
│ month_ │  2023  │  2024  │  2025  │  2026  │
│ int64  │ int128 │ int128 │ int128 │ int128 │
├────────┼────────┼────────┼────────┼────────┤
│      1 │        │     18 │     32 │    256 │
│      2 │        │        │     65 │    383 │
│      3 │        │     18 │    172 │    273 │
│      4 │        │     18 │     18 │    480 │
│      5 │        │    594 │     22 │    501 │
│      6 │        │     11 │     36 │        │
│      7 │     18 │     36 │        │    192 │
│      8 │        │     18 │     18 │    507 │
│      9 │        │     54 │     63 │     18 │
│     10 │     11 │     54 │    337 │        │
│     11 │     11 │     18 │   2543 │        │
│     12 │     18 │     29 │    342 │        │
└────────┴────────┴────────┴────────┴────────┘

Any published scene can have a number of file types delivered for it. Below, I've counted the number of GIFs, GeoTIFFs and MP4s published, broken down by month of capture.

PIVOT (
    SELECT   yyyy_mm: STRFTIME(captured_at, '%Y-%m'),
             file_type,
             cnt: COUNT(*)
    FROM     s3_inventory
    WHERE    file_type NOT IN ('html',
                               'geojson',
                               'jpg',
                               'js',
                               'json',
                               'kml',
                               'mvgfwxsk',
                               'png',
                               'xml')
    AND      captured_at IS NOT NULL
    GROUP BY 1, 2
)
ON       file_type
USING    SUM(cnt)
GROUP BY yyyy_mm
ORDER BY yyyy_mm;
┌─────────┬────────┬────────┬────────┐
│ yyyy_mm │  gif   │  mp4   │  tif   │
│ varchar │ int128 │ int128 │ int128 │
├─────────┼────────┼────────┼────────┤
│ 2023-07 │      1 │      1 │      5 │
│ 2023-10 │        │        │      3 │
│ 2023-11 │        │        │      3 │
│ 2023-12 │      1 │      1 │      5 │
│ 2024-01 │      1 │      1 │      5 │
│ 2024-03 │      1 │      1 │      5 │
│ 2024-04 │      1 │      1 │      5 │
│ 2024-05 │     33 │     33 │    165 │
│ 2024-06 │        │        │      3 │
│ 2024-07 │      2 │      2 │     10 │
│ 2024-08 │      1 │      1 │      5 │
│ 2024-09 │      3 │      3 │     15 │
│ 2024-10 │      3 │      3 │     15 │
│ 2024-11 │      1 │      1 │      5 │
│ 2024-12 │      1 │      1 │      8 │
│ 2025-01 │        │        │      9 │
│ 2025-02 │        │        │     18 │
│ 2025-03 │      1 │      1 │     47 │
│ 2025-04 │      1 │      1 │      5 │
│ 2025-05 │        │        │      6 │
│ 2025-06 │      2 │      2 │     10 │
│ 2025-08 │      1 │      1 │      5 │
│ 2025-09 │      3 │      3 │     17 │
│ 2025-10 │     17 │     17 │     93 │
│ 2025-11 │    122 │    122 │    701 │
│ 2025-12 │     19 │     19 │     95 │
│ 2026-01 │     13 │     13 │     71 │
│ 2026-02 │      6 │      6 │    105 │
│ 2026-03 │     14 │     14 │     75 │
│ 2026-04 │     23 │     23 │    133 │
│ 2026-05 │     15 │     15 │    138 │
│ 2026-07 │      7 │      7 │     53 │
│ 2026-08 │     18 │     18 │    140 │
│ 2026-09 │      1 │      1 │      5 │
└─────────┴────────┴────────┴────────┘

Downloading Imagery

Some scenes have a GeoTIFF deliverable, which is a Colour Sub-Aperture Image (CSI). These are composite images made by splitting long radar scans into multiple colour-coded parts. This helps highlight moving objects and man-made structures. I'll download any of these that have been captured in 2026.

The following command will download four files concurrently.

I've reversed each of the URLs and sorted the list in reverse, so JSON and PNG files appear higher in the download list than TIF files. This allows me to look at their contents while I wait for the much larger GeoTIFFs to download.

I did try to use the AWS CLI command to sync individual files, but it wasn't behaving as I expected, so I instead test to see if a file name exists, sans its path, and if it doesn't, I then download it. The download will discard the path hierarchy ICEYE are using in their S3 bucket.

$ mkdir -p deliverables

$ fetch_if_new () {
      FN=`echo "$1" | rev | cut -d / -f1 | rev`

      if [ ! -e "deliverables/$FN" ]; then
          aws s3 cp \
              --no-sign-request \
              s3://iceye-open-data-catalog/$1 \
              deliverables/
      fi
  }

$ export -f fetch_if_new

$ grep '_2026' iceye_s3.json \
    | jq -r .Key \
    | grep CSI \
    | rev \
    | sort -r \
    | rev \
    | xargs -I% \
            --verbose \
            -P4 \
            bash -c 'fetch_if_new "%"'

Imagery Metadata

I'll make sure each scene metadata JSON file is structured as a single line and concatenate all of them into a single JSONL file.

$ touch all.json; rm all.json

$ for FILENAME in deliverables/ICEYE*.json; do
    jq -c . $FILENAME >> all.json
  done

I'll then produce two Parquet files. One will have the polygon of each image's footprint. The other will have a centroid for each footprint. QGIS' Globe view can draw labels on points and lines without issue, but there can be a lot of rendering defects when labelling polygons.

$ ~/duckdb
COPY(
    SELECT * EXCLUDE(geometry),
           geometry: ST_GEOMFROMGEOJSON(geometry),
           duration: EXTRACT(seconds FROM (properties.end_datetime - properties.start_datetime))
    FROM   'all.json'
) TO 'all.parquet' (
      FORMAT 'PARQUET',
      CODEC  'ZSTD',
      COMPRESSION_LEVEL 22,
      ROW_GROUP_SIZE 15000);

COPY(
    SELECT * EXCLUDE(geometry),
           geometry: ST_CENTROID(ST_GEOMFROMGEOJSON(geometry)),
           duration: EXTRACT(seconds FROM (properties.end_datetime - properties.start_datetime))
    FROM   'all.json'
) TO 'all.centroid.parquet' (
      FORMAT 'PARQUET',
      CODEC  'ZSTD',
      COMPRESSION_LEVEL 22,
      ROW_GROUP_SIZE 15000);

Data Fluency

The above Parquet files contain 97 records, one for each scene.

SELECT COUNT(*)
FROM   'all.parquet'; -- 97

These are the locations of each scene the feed has deliverables for.

ICEYE Open Feed

These are the durations of capture. The shortest was four seconds, while the longest was 20 seconds.

SELECT   duration,
         COUNT(*)
FROM     'all.parquet'
GROUP BY 1
ORDER BY 1;
┌──────────┬──────────────┐
│ duration │ count_star() │
│  int64   │    int64     │
├──────────┼──────────────┤
│        4 │            1 │
│        9 │            1 │
│       11 │            2 │
│       12 │            5 │
│       13 │            8 │
│       14 │            7 │
│       15 │           18 │
│       16 │           22 │
│       17 │           10 │
│       18 │           15 │
│       19 │            6 │
│       20 │            2 │
└──────────┴──────────────┘

These are the number of unique values for each field. I've excluded structures, lists and any field that didn't have more than one unique value. The fields are sorted alphabetically while ignoring both case and any prefixes.

SELECT   column_name,
         column_type,
         approx_unique,
         min[:20],
         max[:20]
FROM     (SUMMARIZE
          SELECT properties.*
          FROM   'all.parquet')
WHERE    column_type::TEXT NOT LIKE 'STRUCT%'
AND      column_type::TEXT NOT LIKE '%[]%'
AND      approx_unique != 1
ORDER BY LOWER(REVERSE(SPLIT(REVERSE(column_name), ':')[1]));
┌───────────────────────────────────────┬─────────────┬───────────────┬──────────────────────┬──────────────────────┐
│              column_name              │ column_type │ approx_unique │       min[:20]       │       max[:20]       │
│                varchar                │   varchar   │     int64     │       varchar        │       varchar        │
├───────────────────────────────────────┼─────────────┼───────────────┼──────────────────────┼──────────────────────┤
│ iceye:acquisition_prf                 │ DOUBLE      │            87 │ 5992.82              │ 6974.75              │
│ iceye:acquisition_range_sampling_rate │ BIGINT      │           110 │ 359894691            │ 2295520493           │
│ iceye:average_scene_height            │ DOUBLE      │            77 │ -43.0                │ 3974.0               │
│ view:azimuth                          │ DOUBLE      │            98 │ 35.44547             │ 316.667022           │
│ iceye:calibration_factor              │ DOUBLE      │            41 │ 1.6871631961018047e- │ 0.002931511185541565 │
│ sar:center_frequency                  │ BIGINT      │             3 │ 9600000000           │ 9800000000           │
│ created                               │ TIMESTAMP   │            94 │ 2026-06-02 12:37:37  │ 2026-09-03 04:44:03  │
│ datetime                              │ TIMESTAMP   │            91 │ 2026-01-06 21:33:12. │ 2026-09-01 01:59:44. │
│ iceye:doppler_cone_angle              │ DOUBLE      │            88 │ -100.693268          │ 96.740214            │
│ end_datetime                          │ TIMESTAMP   │           106 │ 2026-01-06 21:33:20. │ 2026-09-01 01:59:52. │
│ iceye:extent_azimuth                  │ BIGINT      │             2 │ 5000                 │ 5268                 │
│ iceye:extent_range                    │ DOUBLE      │             2 │ 5000.0               │ 5497.5               │
│ iceye:filename                        │ VARCHAR     │           112 │ ICEYE_3E4JMG_2026081 │ ICEYE_WYDM9Q_2026072 │
│ iceye:grazing_angle                   │ DOUBLE      │            99 │ 44.815299            │ 69.808083            │
│ iceye:grazing_angle_far               │ DOUBLE      │            91 │ 44.667599            │ 69.574988            │
│ iceye:grazing_angle_near              │ DOUBLE      │            98 │ 44.963567            │ 70.041772            │
│ iceye:image_id                        │ BIGINT      │            95 │ 8308406              │ 10424300             │
│ iceye:image_reference                 │ VARCHAR     │            78 │                      │ 01a0589f-913e-7690-8 │
│ view:incidence_angle                  │ DOUBLE      │            99 │ 20.191917            │ 45.184701            │
│ iceye:incidence_angle_far             │ DOUBLE      │            82 │ 20.425012            │ 45.332401            │
│ iceye:incidence_angle_near            │ DOUBLE      │           101 │ 19.958228            │ 45.036433            │
│ iceye:layover_angle                   │ DOUBLE      │            81 │ -20.59077            │ 21.179759            │
│ sar:looks_azimuth                     │ BIGINT      │             6 │ 3                    │ 13                   │
│ iceye:looks_azimuth_bandwidth         │ DOUBLE      │            99 │ 7149.95              │ 31894.69             │
│ iceye:looks_azimuth_overlap           │ DOUBLE      │            55 │ 10.03                │ 18.12                │
│ iceye:looks_range_bandwidth           │ BIGINT      │             3 │ 300000000            │ 1200000000           │
│ sar:observation_direction             │ VARCHAR     │             2 │ left                 │ right                │
│ view:off_nadir                        │ DOUBLE      │           102 │ 18.381658            │ 40.478552            │
│ iceye:orbit_mean_altitude             │ BIGINT      │            93 │ 387656               │ 615520               │
│ iceye:orbit_precision                 │ VARCHAR     │             2 │ precise              │ rapid                │
│ sat:orbit_state                       │ VARCHAR     │             2 │ ascending            │ descending           │
│ sar:pixel_spacing_azimuth             │ DOUBLE      │             3 │ 0.125                │ 0.5                  │
│ sar:pixel_spacing_range               │ DOUBLE      │             3 │ 0.125                │ 0.5                  │
│ platform                              │ VARCHAR     │            20 │ ICEYE-X11            │ ICEYE-X72            │
│ iceye:processing_bandwidth_azimuth    │ DOUBLE      │           117 │ 29866.279            │ 92112.353            │
│ iceye:processing_bandwidth_range      │ BIGINT      │             3 │ 300000000            │ 1200000000           │
│ iceye:processing_end_datetime         │ TIMESTAMP   │           104 │ 2026-06-02 12:37:37. │ 2026-09-03 04:44:03. │
│ iceye:processing_mode                 │ VARCHAR     │             5 │ SLED                 │ SLH                  │
│ iceye:processing_prf                  │ DOUBLE      │           130 │ 41032.441            │ 108609.44            │
│ iceye:pulse_bandwidth                 │ BIGINT      │             3 │ 300000000            │ 1200000000           │
│ iceye:pulse_duration                  │ DOUBLE      │            73 │ 1.4352e-05           │ 3.3216e-05           │
│ iceye:range                           │ DOUBLE      │           100 │ 445759.127972        │ 807565.618328        │
│ iceye:range_far                       │ DOUBLE      │            94 │ 447032.923338        │ 809328.20001         │
│ iceye:range_near                      │ DOUBLE      │           106 │ 444495.485974        │ 805806.760232        │
│ sar:resolution_azimuth                │ DOUBLE      │            97 │ 0.220435             │ 0.987193             │
│ sar:resolution_range                  │ DOUBLE      │            96 │ 0.194629             │ 1.325438             │
│ iceye:resolution_range_far            │ DOUBLE      │            82 │ 0.193929             │ 1.30943              │
│ iceye:resolution_range_near           │ DOUBLE      │            97 │ 0.195339             │ 1.341936             │
│ iceye:run_name                        │ VARCHAR     │             3 │ get-sicd             │ opencatalog          │
│ iceye:scene_id                        │ VARCHAR     │            64 │ 3E4JMG               │ WYDM9Q               │
│ iceye:shadow_angle                    │ DOUBLE      │            92 │ 21.996               │ 351.264613           │
│ iceye:squint_angle                    │ DOUBLE      │            86 │ -20.59077            │ 21.179759            │
│ start_datetime                        │ TIMESTAMP   │           107 │ 2026-01-06 21:33:05. │ 2026-09-01 01:59:35. │
│ iceye:synthetic_aperture_angle        │ DOUBLE      │            91 │ 3.746823             │ 11.200784            │
│ iceye:zero_doppler_end_datetime       │ TIMESTAMP   │            89 │ 2026-01-06 21:33:27. │ 2026-09-01 01:59:44. │
│ iceye:zero_doppler_start_datetime     │ TIMESTAMP   │            90 │ 2026-01-06 21:33:27. │ 2026-09-01 01:59:44. │
└───────────────────────────────────────┴─────────────┴───────────────┴──────────────────────┴──────────────────────┘

Imagery of Interest

The first two images of interest were taken close to one another in Rotterdam.

ICEYE Open Feed

This image shows a large number of greenhouses.

ICEYE Open Feed

This image shows a port area with oil storage containers.

ICEYE Open Feed

The containers almost look like they're transparent.

ICEYE Open Feed

This is one of ICEYE's marketing images I came across on LinkedIn. It shows how you can estimate the amount of oil contained within any container on any given day and see how this changes over time.

ICEYE Open Feed

This is Sete Cidades, Portugal. The landscape almost looks like a face with its mouth open.

ICEYE Open Feed

This is the island's location in relation to the Portuguese mainland and other geographies in the North Atlantic.

ICEYE Open Feed

This is an image of New York City.

ICEYE Open Feed

There are a few clusters of buildings that appear to glow in neon colours and stand out against their neighbouring buildings.

ICEYE Open Feed

This is an open-pit mine in Chile.

ICEYE Open Feed

The processing centre lights up with neon colours and stands out against the pit alongside it.

ICEYE Open Feed

This is a lithium mine in Chile.

ICEYE Open Feed
Thank you for taking the time to read this post. I offer both consulting and hands-on development services to clients in North America and Europe. If you'd like to discuss how my offerings can help your business please contact me via LinkedIn.

Copyright © 2014 - 2026 Mark Litwintschik. This site's template is based off a template by Giulio Fidente.