La couche communautaire
Vos utilisateurs voient ce qu’aucun gestionnaire routier ne publiera jamais
Relay transporte le flux routier national français : une application de navigation qui ne fait que lire est donc utile dès le premier jour. Cette page traite de l’autre sens : la partie précise et nommable du vocabulaire qui ne peut venir que d’un pare-brise — et ce qu’il vous en coûte de l’y mettre.
10 signalements qu’aucun flux de gestionnaire ne produit
Ce n’est pas un jugement sur les gestionnaires — c’est une conséquence de ce qu’est un gestionnaire. Une autorité routière publie ce vers quoi elle a dépêché une équipe, et un nid-de-poule, avant cette intervention, n’existe dans le système de personne. Les premières lignes sont des types entiers sans aucune source publique : personne ne publie ses propres contrôles de police, une voiture-radar banalisée ou un feu en panne avant que quelqu’un ne le signale par téléphone. Chaque ligne ci-dessous est un type ou une valeur qu’aucune correspondance d’un flux national que nous ingérons ne peut produire.
- Contrôle de police
police_checkAucune autorité ne publie ses propres contrôles, et aucune ne le fera jamais. C’est le bouton le plus utilisé de tous les réseaux communautaires qui ont existé — et celui qu’une petite application ne peut obtenir nulle part ailleurs, à aucun prix.
- Radar · Radar mobile
speed_camera · mobile_cameraUne voiture-radar se gare deux heures et n’apparaît dans aucun jeu de données. Les radars fixes sont en données ouvertes ; celui-ci n’existe que dans les pare-brise qui viennent de le croiser.
- Panne d’équipement
infrastructure_faultUn feu tricolore éteint est signalé à la mairie par téléphone, aux heures de bureau, et n’atteint aucun flux. Tous les conducteurs à ce carrefour le savent en quelques secondes.
- Travaux · Travaux d’urgence
roadworks · emergency_worksLes travaux planifiés sont publiés des semaines à l’avance et nous ne les portons volontairement pas. La fouille ouverte à six heures ce matin n’est dans aucun planning.
- Chaussée dégradée · Nid-de-poule
road_damage · potholePersonne n’a encore envoyé d’équipe, donc rien dans le système d’aucun gestionnaire. Un capteur de suspension le remonte sans aucun conducteur.
- Chaussée dégradée · Affaissement
road_damage · sinkholeLa seule valeur de chaussée dégradée qui soit une urgence, et c’est d’abord une voiture qui la voit.
- Objet sur la chaussée · Débris
object_on_road · debrisLe flux porte les chargements perdus et les arbres tombés. Les débris ordinaires, ce sont ceux qu’un conducteur évite sans que personne ne les déclare.
- Personnes sur la chaussée · Ouvrier routier
people_on_road · road_workerUne équipe sur la chaussée hors d’un chantier déclaré — le cas qu’un enregistrement de travaux planifiés ne couvre pas.
- Personnes sur la chaussée · Agent de circulation
people_on_road · traffic_officerUn agent qui régule la circulation à un carrefour. Réel, immédiat, et dans aucun flux.
- Personnes sur la chaussée · Cycliste
people_on_road · cyclistUn cycliste sur une route qui n’en attend pas. Un danger pour lui avant d’en être un pour quiconque.
Et sur tout ce que le flux transporte, vos utilisateurs arrivent plus tôt
C’est la plus grande moitié, et ce n’est pas une question de vocabulaire. Un gestionnaire publie quand il sait ; un signalement venu de l’intérieur du bouchon est le même événement, plus tôt, et sur les tronçons que personne ne surveille, c’est le seul signalement qu’il y aura.
Accident
Le flux publie quand le gestionnaire est au courant. Quelqu’un dans la troisième voiture en arrière le sait avant.
Bouchon
Un bouchon est déclaré quand il est détecté sur le réseau géré. Vos utilisateurs sont dedans.
Véhicule arrêté
Sur la bande d’arrêt d’un tronçon non surveillé, un pare-brise est le seul capteur qui existe.
Danger météo
Le verglas fait cent mètres. À cette résolution, la détection est une voiture, pas une station.
Route fermée
Un gestionnaire déclare la fermeture qu’il avait prévue. Celle qu’un accident a causée il y a quatre minutes, ce sont les conducteurs déjà arrêtés devant qui l’annoncent.
Un bouton pour signaler, un bouton pour confirmer. C’est tout le mécanisme
Vous avez déjà le panneau de signalement — une grille d’icônes que vos utilisateurs touchent. Ce qui vous manque, c’est un endroit où envoyer ces signalements et quelqu’un pour les confirmer. Chacun tient en un appel HTTP, et publier est gratuit pour toujours.
1 · Un conducteur signale
Projetez votre panneau sur le vocabulaire une fois pour toutes. Filtrez sur type, affinez sur subtype— la liste générale grandit rarement, donc cette table s’écrit une fois et ne se périme pas. La durée de vie vient du type : vous n’expirez jamais un marqueur vous-même.
const API = "https://api.cudatus.com";
// Your report sheet, mapped onto the vocabulary once.
const SHEET = {
police: { type: "police_check" },
queue: { type: "congestion", subtype: "queue" },
accident: { type: "accident" },
roadClosed: { type: "road_closure", subtype: "full_closure" },
speedCamera: { type: "speed_camera" },
pothole: { type: "road_damage", subtype: "pothole" },
trafficLightOut: { type: "infrastructure_fault", subtype: "traffic_signal" },
roadworks: { type: "roadworks" },
debris: { type: "object_on_road", subtype: "debris" },
brokenDown: { type: "stopped_vehicle", subtype: "broken_down" },
blackIce: { type: "weather_hazard", subtype: "black_ice" },
personOnRoad: { type: "people_on_road", subtype: "pedestrian" },
};
// A driver taps a button. This is the whole publish path.
export async function report(kind, { lat, lon }, severity = "medium") {
const res = await fetch(`${API}/v1/events`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RELAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ ...SHEET[kind], lat, lon, severity }),
});
const event = await res.json();
return event.event_id; // it is on the stream before this line runs
}2 · Le conducteur suivant répond
« Toujours là » prolonge la vie de l’événement ; « Plus là » est ce qui le retire. Assez d’infirmations y mettent fin plus tôt — pour tout le réseau, pas seulement pour vos utilisateurs — et une infirmation retire sans condamner : personne n’est accusé d’un faux signalement parce que la route a simplement été dégagée.
// The marker is on screen. The driver says "still there" or "gone".
export async function answer(eventId, stillThere, device) {
const res = await fetch(`${API}/v1/events/${eventId}/signals`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RELAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
action: stillThere ? "confirm" : "deny",
// What the quorum counts: one stable token per DEVICE.
reporter_token: device.id,
// Optional, and worth sending — a confirmation from the
// scene is recorded as coming from the scene.
lat: device.lat,
lon: device.lon,
}),
});
// 409: a quorum cleared it before this driver answered.
if (res.status === 409) return "already over";
return (await res.json()).verification; // unverified | verified
}reporter_token est le champ à soigner
Le quorum compte des véhiculesdistincts, pas des organisations. Envoyez un jeton stable par appareil, et cent de vos utilisateurs qui confirment un nid-de-poule font cent voix ; omettez-le, et toute votre application compte pour une seule, ce qui fonctionne toujours mais ne promeut rien. Il n’atteint jamais le réseau : il est salé avec votre organisation à son arrivée et la valeur brute n’est jamais stockée, si bien qu’il ne peut être relié à une personne ni par nous, ni par quiconque lit le réseau.
Trois comportements que vous auriez sinon à construire
Ce qui rend une couche communautaire coûteuse, ce n’est jamais le bouton de signalement. C’est tout ce qui doit arriver à un signalement ensuite, et tout cela se passe de ce côté-ci du réseau.
Des marqueurs qui disparaissent d’eux-mêmes
Chaque événement porte une durée de vie issue de son type — quelques minutes pour un bouchon, jusqu’à plusieurs semaines pour une chaussée dégradée. Un client le retire quand sa propre échéance passe, et rien n’a besoin d’être envoyé pour le dire. Aucun nettoyage des dangers périmés à écrire.
La confirmation sans équipe de modération
Des véhicules distincts qui signalent la même chose la promeuvent ; assez de véhicules qui l’infirment la retirent. Ce n’est pas vous qui décidez si un signalement est vrai, ni nous — c’est la route.
Des signalements d’utilisateurs qui ne sont pas les vôtres
C’est la part qu’une application seule ne peut acheter à aucun prix. Un nid-de-poule confirmé par les camions d’une flotte atteint aussi vos utilisateurs, parce que tout le monde sur le réseau lit le même flux.
Les contrôles de police sont dans le vocabulaire, et la suspension explique pourquoi cela a pris du temps
C’est le type qu’on réclame en premier à une application communautaire. Il est livré, et la capacité sur laquelle il repose est, sur tout ce site, l’argument le plus net pour se brancher sur un tronc partagé.
La rediffusion des signalements de contrôles de police peut devoir être interrompue sur une zone donnée, pour une durée donnée, sur demande. Cette suspension relève du tronc plutôt que de chaque application : un petit nombre de zones actives, appliqué aux trois endroits où le réseau décide de ce qu’un abonné peut voir.
Chaque application de navigation fait face à cette exigence, et presque aucune n’a les moyens d’y répondre seule. La résoudre une fois pour tous ceux qui sont sur le réseau, c’est précisément la raison d’être d’un tronc partagé — et c’est une capacité que votre propre feuille de route n’atteindrait jamais.
Publier est gratuit : tout commence donc dans la sandbox
Créez une clé sandbox, branchez les deux appels ci-dessus, et regardez vos propres signalements arriver sur le flux que vous lisez déjà. Une clé sandbox lit aussi le trafic national réel : votre carte n’est donc jamais vide pendant vos tests.