Le stockage S3

Un exemple pour la visualisation de cartes interactives

Benoît Seignovert

Observatoire des Sciences de l'Univers Nantes Atlantique (Osuna)

Groupement Ligérien pour le Calcul Intensif Distribué (GLiCID)

Josy Stockage S3 | Strasbourg | 2025-10-08

slid.es/seignovert/josy-s3

doi: 10.57745/DZGEQS
NASA/NOAA/R. Stöckli
Creative Commons “Attribution-Share Alike” license icon

https://mon.bucket.s3.example.org

https://mon-bucket.s3.example.org

 

 

 

https://s3.example.org/mon.bucket

https://s3.example.org/mon-bucket

Produire des cartes

Carte Sumérienne | -2500

Tabula Rogeriana | 1154

une histoire millénaire

70 feuillets

Global vs. détails

Carte de Mercator

1569

18 feuillets

1.2 m x 60 cm

Carte de Cassini

1756 - 1815

(4 générations !)

181 feuilles au 1:86 400

11 m x 11 m

1 km

Papier

130 000 x 130 000 pixels

17 000 Mpix ~ 50 Go

Écran

32 000 x 32 000 pixels

1 000 Mpix ~ 3 Go

Cartes IGN

2011 - 2025

1 200 cartes au 1:25 000

38 m x 38 m

300 m

Papier

450 000 x 450 000 pixels

200 000 Mpix ~ 0.5 To

Écran

110 000 x 110 000 pixels

12 000 Mpix ~ 33 Go

Projection Mercator

Global vs. détails aujourd'hui

1:1 000

40 km x 20 km

Papier

450 000 000 x 225 000 000 pixels

100 000 000 000 Mpix ~ 300 Po

Écran

110 000 000 x 55 000 000 pixels

6 000 000 000 Mpix ~ 18 Po

4 000 km

Open Street Map
Level 0

Strasbourg

Global vs. détails aujourd'hui

10 m

Open Street Map
Level 19

1:1 000

40 km x 20 km

Papier

450 000 000 x 225 000 000 pixels

100 000 000 000 Mpix ~ 300 Po

Écran

110 000 000 x 55 000 000 pixels

6 000 000 000 Mpix ~ 18 Po

Comment stocker tout ça ?

 

🧺 S3 ? 🤔

Oui mais ...

on n'a pas attendu S3 pour distribuer des cartes

Wikipedia / S. Viinamäki

Des cartes à

différentes

résolutions

IGN

Méthode de 

Tuilage | Pyramidage

Taille des tuiles :

Nombre de tuiles :

Indexation des tuiles :

/Z/X/Y.[jpg|png]
N(Z) = 22 x Z
256 x 256 pixels
Z=
Z=
Z=
Z=
N=1
N=4
N=16
N=22n
200 ko

WMTS (Web Map Tile Service)

Coté client

1 x 256 x 256 pix
200 ko

Coté server

256 x 256 pix
200 ko
256 x 256 pix
200 ko
256 x 256 pix
200 ko
256 x 256 pix
200 ko
256 x 256 pix
200 ko
256 x 256 pix
200 ko
1.2 Mo
0.5%
4 x 256 x 256 pix
800 ko
16 x 256 x 256 pix
3.2 Mo
64 x 256 x 256 pix
13 Mo
256 x 256 x 256 pix
51 Mo
1024 x 256 x 256 pix
324 Mo
+26 %

256 Mo
(Z, X, Y)

(0, 0)

(0, 1)

(1, 0)

(1, 1)

(0, 0)

(0, 1)

(0, 2)

(0, 3)

(1, 0)

(1, 1)

(1, 2)

(1, 3)

(2, 0)

(2, 1)

(2, 2)

(2, 3)

(3, 0)

(3, 1)

(3, 2)

(3, 3)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Map tiles demo</title>
     <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>
</head>
<body>
    <div id="map" style="height: 800px"></div>
    <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
    <script>
        const map = L.map('map').setView([48.6056, 7.7095], 0);

        const tiles = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
            maxZoom: 19,
            attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
        }).addTo(map);
    </script>
  </body>
</html>

Démo

Quelques fournisseurs de tuiles

Apple Maps

Open Street Map

Pourquoi faire du stockage sur S3 ?

Tuilage à petite échelle…

Level # Tuiles Taille du pixel ~ Échelle Couverture # dossiers / fichiers Taille
0 1 160 km 1:500 000 000 Globale 1 / 1 / 1 200 ko 😅
1
4 80 km 1:250 000 000 2 / 2 / 2 0.8 Mo 🌈
2 16 40 km 1:150 000 000 Continent 3 / 4 / 4 3.2 Mo 🦄
3 64 20 km 1:70 000 000 4 / 8 / 8 12 Mo
4 256 10 km 1:35 000 000 4 / 16 / 16 50 Mo 🤘
5 1 024 5 km 1:15 000 000 Pays 5 / 32 / 32 200 Mo 👋
6 4 096 2.5 km 1:8 000 000 6 / 64 / 64 0.8 Go 🤙
7 16 384 1.2 km 1:4 000 000 7 / 128 / 128 3.2 Go 👌
8 65 536 600 m 1:2 000 000 8 / 256 / 256 12 Go ✌️
9 262 144 300 m 1:1 000 000 9 / 512 / 512 50 Go 👊
10 1 048 576 150 m 1:500 000 Métropole 10 / 1024 / 1024 200 Go 💪
11 4 194 304 75 m 1:250 000 Ville 11 / 2 048 / 2 048 0.8 To 🏋️
... ... ... ... ... ... ...
15 1 073 741 824 5 m 1:15 000 Route 15 / 32 768 / 32 768 200 To 💣
16 4 294 967 296 2.5 m 1:8 000 16 / 65 536 / 65 536 0.8 Po 💥
17 17 179 869 184 1.2 m 1:4 000 Adresse 17 / 131 072 / 131 072 3.2 Po 🔥
18 68 719 476 736 60 cm 1:2 000 18 / 262 144 / 262 144 12 Po 😵
19 274 877 906 944 30 cm 1:1 000 Passage piéton 19 / 524 288 / 524 288 50 Po 💀
256 x 256 pixels

200 ko

Impossible de stocker des cartes

à haute résolution sans stockage objet !

Canonical

🗺️ Faire des cartes interactives en S3 🪣

Capacité à stocker des très grandes volumétries

Capacité à stocker un très grand nombre de fichiers de petites tailles

Pas de limite de dossiers / fichiers

 

Stockage web natif (gateway)

Stockage statique (pas besoin de serveur)

Adressage par des objets par clé : /{z}/{x}/{y}.fmt

 

Parallélisation des requêtes: excellente performance

Utilisation en CDN : réplication / synchronisation / haute disponibilité / régionalisation

Coût du stockage faible mais… ⚠️ au egress-cost 💸

Résolution temporelle ⏳

/{t}/{z}/{x}/{y}.fmt

2025

2002

1943

Google Earth

Résolution multi/hyper-spectrale 🌈

Eumetsat
Meteosat FCI
/{w}/{z}/{x}/{y}.fmt

0.6 µm

10.5 µm

Cloud Optimized GeoTiff ☁️

/{z}/{x}/{y}.tiff 👉 /cog.tiff

Cloud Optimized GeoTiff ☁️

/{z}/{x}/{y}.tiff 👉 /cog.tiff +
🙋 HTTP range requests
$ curl -r 128 https://example.org/cog.tiff
Start : 256
Length : 256
Nb tiles : 1
Start : 1024
Length : 256
Nb tiles : 16

Cloud Optimized GeoTiff ☁️

/{z}/{x}/{y}.tiff 👉 /cog.tiff +
🙋 HTTP range requests
$ curl -r 256-512 https://example.org/cog.tiff
Start : 256
Length : 256

Cloud Optimized GeoTiff ☁️

/{z}/{x}/{y}.tiff 👉 /cog.tiff +
🙋 HTTP range requests
$ curl -r 1024-5120 https://example.org/cog.tiff
Start : 1024
Length : 16 * 256 = 4096

Cloud Optimized GeoTiff ☁️

/{z}/{x}/{y}.tiff 👉 /cog.tiff +
🙋 HTTP range requests
$ curl -r 1280-1536 https://example.org/cog.tiff
Start : 1024
Length : 1 * 256 = 256
Offset : 1 * 256 = 256

Base de données géographique native S3 📍

Base de données géographique native S3 📍

Base de données géographique native S3 📍

ATTACH 's3://example.org/stations.duckdb' AS stations_db;

SELECT count(*) AS num_stations FROM stations_db.stations;
num_stations
578
ID_PARCEL geometry
123563 POLYGON ((3.33896 49.84122, 3.33948 49.8...
5527076 POLYGON ((-1.44483 49.61280, -1.44467 49...
11479241 POLYGON ((2.87821 46.53674, 2.87820 46.5...
... ...
SELECT PARCEL_ID, geometry FROM stations_db.stations
	WHERE ST_Contains(ST_Point(0, 45), geometry) LIMIT 100;

Quelques exemples dans le système solaire 🌘

Lune

Mars

50 cm /pix

22 000 000 x 11 000 000 pixels

240 000 000 Mpix ~ 720 To

30 cm /pix

70 000 000 x 35 000 000 pixels

2 500 000 000 Mpix ~ 7 Po

Carte du ciel ✨

Observatoire Vera Rubin (LSST) - 2025

8.4 m miroir

3 200 Mpix / image

200 000 images / an

20 To / jour

~ 6 Po / an

Nébuleuses Trifide et la Lagune

Backup

STAC catalogue 📚

Standard Open Geospatial Consortium (OGC) pour décrire les jeux de données

Modèle numérique de Terrain (MNT) 🏔️

/{z}/{x}/{y}.fmt