Benoît Seignovert
Observatoire des Sciences de l'Univers Nantes Atlantique (Osuna)
Groupement Ligérien pour le Calcul Intensif Distribué (GLiCID)
NASA/NOAA/R. Stöckli
https://mon.bucket.s3.example.org
https://mon-bucket.s3.example.org
https://s3.example.org/mon.bucket
https://s3.example.org/mon-bucket
Carte Sumérienne | -2500
Tabula Rogeriana | 1154
70 feuillets
Carte de Mercator
1569
18 feuillets
1.2 m x 60 cm
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
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
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
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
🧺 S3 ? 🤔
on n'a pas attendu S3 pour distribuer des cartes
Wikipedia / S. Viinamäki
IGN
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>
Apple Maps
Open Street Map
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
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 💸
/{t}/{z}/{x}/{y}.fmt
2025
2002
1943
Google Earth
Eumetsat
Meteosat FCI
/{w}/{z}/{x}/{y}.fmt
0.6 µm
10.5 µm
/{z}/{x}/{y}.tiff 👉 /cog.tiff
/{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
/{z}/{x}/{y}.tiff 👉 /cog.tiff +
🙋 HTTP range requests
$ curl -r 256-512 https://example.org/cog.tiff
Start : 256 Length : 256
/{z}/{x}/{y}.tiff 👉 /cog.tiff +
🙋 HTTP range requests
$ curl -r 1024-5120 https://example.org/cog.tiff
Start : 1024 Length : 16 * 256 = 4096
/{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
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;
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
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
Standard Open Geospatial Consortium (OGC) pour décrire les jeux de données
/{z}/{x}/{y}.fmt