chore: checkpoint initial — Zektyc dataset, avant humanisation

- site vitrine + fingerprint test + zmap + z-panel
- remplacement duckdns -> riricdev.tail5ea5cd.ts.net (canonical/og/alternates/docs)
- suppression du token DuckDNS (plus utilisé)
This commit is contained in:
riricdev 2026-09-06 13:03:25 +02:00
commit 8e7ec41f18
104 changed files with 19256 additions and 0 deletions

View file

@ -0,0 +1,212 @@
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="La base de données des vitesses par route de ZMap : 90,5 millions de points, 3,6 millions de km de routes cartographiées avec leur limite de vitesse (OpenStreetMap), sur toute l'Europe." />
<meta name="robots" content="index, follow" />
<title>Vitesses par route · ZMap · Zektyc</title>
<link rel="canonical" href="https://riricdev.tail5ea5cd.ts.net/zmap/vitesses-par-route/" />
<meta name="theme-color" content="#070a0f" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Zektyc" />
<meta property="og:title" content="Vitesses par route · ZMap" />
<meta property="og:description" content="ZMap connaît la limite de vitesse de chaque route d'Europe : 90,5 millions de points, 3,6 millions de km, à partir des données OpenStreetMap." />
<meta property="og:url" content="https://riricdev.tail5ea5cd.ts.net/zmap/vitesses-par-route/" />
<meta property="og:locale" content="fr_FR" />
<meta property="og:locale:alternate" content="en_US" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="shortcut icon" href="/favicon.ico" />
<link rel="stylesheet" href="/css/style.css?v=7" />
<style>
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 12px;
margin: 24px 0;
}
.stat {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 10px;
padding: 16px;
text-align: center;
}
.stat b {
display: block;
font-size: 1.7em;
line-height: 1.2;
color: var(--accent, #4dd6a8);
}
.stat span {
font-size: 0.85em;
opacity: 0.7;
}
table.speeds {
width: 100%;
border-collapse: collapse;
margin: 16px 0;
}
table.speeds th,
table.speeds td {
text-align: right;
padding: 6px 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
table.speeds th:first-child,
table.speeds td:first-child {
text-align: left;
}
.bar {
display: inline-block;
height: 10px;
border-radius: 3px;
background: var(--accent, #4dd6a8);
vertical-align: middle;
}
code {
background: rgba(255, 255, 255, 0.06);
padding: 1px 6px;
border-radius: 4px;
font-size: 0.9em;
}
</style>
</head>
<body>
<header id="h"></header>
<main class="legal" id="main">
<p class="legal-note"><a href="/zmap/">← Retour à ZMap</a></p>
<h1>Vitesses par route</h1>
<p class="legal-meta">
La base de données interne de ZMap · comment elle est construite et
ce qu'elle contient
</p>
<div class="dev-banner">
🧭 <strong>Fonctionnalité de navigation.</strong> ZMap rattache chaque
point de votre itinéraire à sa route réelle et lit sa limite de vitesse
dans une base de données locale de toute l'Europe — puis la garde en
cache sur votre téléphone pour la conduite hors-ligne.
</div>
<section class="projects-page">
<article class="card">
<h3>Le principe</h3>
<p>
La plupart des applications de navigation ont besoin d'une connexion
pour connaître la vitesse autorisée. ZMap fait différemment : une base
de données des limites de vitesse est construite <em>par route</em> à
partir des données OpenStreetMap, puis embarquée côté serveur. Quand
un itinéraire est calculé, chaque point du trajet est rattaché à la
route la plus proche et reçoit sa vitesse. L'itinéraire complet — y
compris ses vitesses — est ensuite mis en cache sur le téléphone :
pendant la conduite, plus aucune requête réseau n'est nécessaire.
</p>
</article>
</section>
<div class="stats-grid">
<div class="stat"><b>90,5 M</b><span>points échantillonnés</span></div>
<div class="stat"><b>3,6 M km</b><span>de routes avec vitesse connue</span></div>
<div class="stat"><b>5 104</b><span>cellules de 0,5° × 0,5°</span></div>
<div class="stat"><b>370 Mo</b><span>grille compressée (gzip)</span></div>
<div class="stat"><b>40 m</b><span>échantillonnage le long des routes</span></div>
<div class="stat"><b>5 o</b><span>par point (lon, lat, vitesse)</span></div>
</div>
<section class="projects-page">
<article class="card">
<h3>Comment c'est construit</h3>
<ol>
<li>
<strong>Source :</strong> l'extrait Europe d'OpenStreetMap
(Geofabrik, 34,8 Go) contient 98,2 millions de routes
(<code>highway</code>).
</li>
<li>
<strong>Filtrage :</strong> <code>osmium tags-filter</code> ne garde
que les routes (8,5 Go), puis seules celles portant une vitesse
(<code>maxspeed</code>) sont conservées — environ 13 millions.
</li>
<li>
<strong>Échantillonnage :</strong> un point est posé tous les
40 mètres le long de chaque route, avec sa vitesse en km/h.
</li>
<li>
<strong>Indexation :</strong> l'Europe est découpée en cellules de
0,5° de côté (≈ 55 km), elles-mêmes subdivisées en 32 × 32. Chaque
point est quantifié sur ~0,76 m et stocké sur 5 octets, puis la
cellule est compressée en gzip : 90,5 millions de points en 370 Mo
au total.
</li>
</ol>
<p>
Le tout est reproductible : le script de construction
(<code>build_maxspeed.py</code>) tourne de bout en bout sur un petit
serveur.
</p>
</article>
<article class="card">
<h3>Ce qu'il y a dedans</h3>
<p>
Répartition des points par limite de vitesse (extrait des valeurs les
plus courantes) :
</p>
<table class="speeds">
<tr><th>Limite</th><th>Part des points</th><th></th></tr>
<tr><td>50 km/h</td><td>26,2 %</td><td><span class="bar" style="width:100%"></span></td></tr>
<tr><td>30 km/h (zones 30)</td><td>18,5 %</td><td><span class="bar" style="width:71%"></span></td></tr>
<tr><td>90 km/h</td><td>9,5 %</td><td><span class="bar" style="width:36%"></span></td></tr>
<tr><td>80 km/h</td><td>9,2 %</td><td><span class="bar" style="width:35%"></span></td></tr>
<tr><td>70 km/h</td><td>6,0 %</td><td><span class="bar" style="width:23%"></span></td></tr>
<tr><td>60 km/h</td><td>5,7 %</td><td><span class="bar" style="width:22%"></span></td></tr>
<tr><td>100 km/h</td><td>4,6 %</td><td><span class="bar" style="width:18%"></span></td></tr>
<tr><td>40 km/h</td><td>3,3 %</td><td><span class="bar" style="width:13%"></span></td></tr>
<tr><td>48 km/h (30 mph, RU)</td><td>2,8 %</td><td><span class="bar" style="width:11%"></span></td></tr>
<tr><td>97 km/h (60 mph, RU)</td><td>2,4 %</td><td><span class="bar" style="width:9%"></span></td></tr>
<tr><td>32 km/h (20 mph, RU)</td><td>2,1 %</td><td><span class="bar" style="width:8%"></span></td></tr>
<tr><td>20 km/h (zones piétonnes)</td><td>2,1 %</td><td><span class="bar" style="width:8%"></span></td></tr>
<tr><td>120 km/h</td><td>1,8 %</td><td><span class="bar" style="width:7%"></span></td></tr>
<tr><td>130 km/h (autoroutes)</td><td>1,7 %</td><td><span class="bar" style="width:6%"></span></td></tr>
<tr><td>110 km/h</td><td>1,4 %</td><td><span class="bar" style="width:5%"></span></td></tr>
</table>
<p class="legal-note">
Valeurs <em>numériques</em> présentes dans OpenStreetMap. Les vitesses
réelles peuvent différer (travaux, panneaux temporaires, conditions
météo). Les autoroutes sans limite (ex. certaines portions allemandes)
n'ont pas de <code>maxspeed</code> : ZMap n'affiche alors aucune
vitesse.
</p>
</article>
<article class="card">
<h3>Côté application</h3>
<p>
Le serveur renvoie, avec chaque itinéraire, un tableau de vitesses
aligné sur les points du tracé (une valeur par point). Le téléphone
enregistre tout dans son cache local : pendant la conduite, la limite
du tronçon courant est lue sans réseau, et le mode hors-ligne garde
tout le trajet. Le rattachement d'un trajet de 4 500 points prend
environ 170 ms sur le serveur.
</p>
</article>
<article class="card">
<h3>Précision et couverture</h3>
<ul>
<li>Couverture : Europe entière, longitude −12° à 46°, latitude 27° à 72°.</li>
<li>Rattachement : la route la plus proche à moins de 40 m du point.</li>
<li>Localisation d'un point : précision ≈ 0,76 m.</li>
<li>Données : OpenStreetMap, libre de droits (licence ODbL).</li>
</ul>
</article>
</section>
</main>
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>