Journal d'ingénierie.
Développement de Maplight : De coordonnées de photos à couverture terrestre.
Derrière l'interface se trouve une chaîne de traitement déterministe pour la quantification des données, la fusion des appareils hors ligne, la mesure d'une superficie une seule fois et le maintien de l'historique de la source privée en dehors d'un serveur.
La question du produit derrière Maplight
Une carte d'un pays visité répond à une question binaire utile : est-ce qu'un endroit fait partie de votre histoire ? Maplight pose une question différente. Sur la base d'années de photos géolocalisées et d'autres preuves de voyage, quelles parties du territoire ont été touchées par ces moments ?
Cela ressemble à du dessin de cercles transparents autour de points. Une fonctionnalité de production doit résoudre des problèmes plus complexes : les points se chevauchent, les cercles traversent les côtes et les frontières, la Terre est courbée, les données sources proviennent de plusieurs systèmes, les anciens appareils peuvent être hors ligne, et une bibliothèque de vie entière doit être suffisamment rapide pour être explorée de manière interactive.
L'implémentation de Maplight sépare ces préoccupations en un petit modèle d'origine portable, un moteur de couverture déterministe et une couche de rendu. La même entrée doit produire la même couverture, que l'historique ait été créé sur un appareil ou combiné via iCloud sur plusieurs appareils.
Généralisez l'entrée avant de la sauvegarder
L'entrée initiale peut être une coordonnée photo, un voyage importé, un tampon de passeport ou un lieu enregistré manuellement. Avant qu'une origine Maplight ne soit persistée, Mapsake quantifie sa latitude et sa longitude en une cellule de geohash à six caractères. L'origine stockée contient ce geohash, un masque de bits décrivant les types de sources contribuant et le jour le plus ancien connu.
Cela offre trois propriétés utiles.
Premièrement, les preuves répétées dans la même petite cellule géographique peuvent se fusionner en une seule origine. Deuxièmement, l'enregistrement portable est compact et déterministe. Troisièmement, le modèle Maplight n'a pas besoin de conserver chaque coordonnée de photo originale pour reproduire l'éclairage.
La date la plus ancienne contrôle la vue « Historique ». Les sources sans date comptent toujours pour le résultat total, mais ne prétendent pas appartenir à une année que l'application ne peut pas déterminer.

Permettez l'ajout cumulatif.
La synchronisation iCloud n'est pas un flux de données unique et ordonné. Deux appareils peuvent fonctionner hors ligne, écrire des enregistrements connexes et recevoir ultérieurement des doublons dans des ordres différents. Un système du type "dernier arrivé, premier servi" entraînerait la disparition d'historiques légitimes.
Au lieu de cela, les origines sont fusionnées par geohash. Les indicateurs de source sont combinés et le jour valide le plus ancien l'emporte. Les origines sont encodées dans un ordre trié à l'intérieur de blocs compacts. Un bloc logique est identifié par profil, génération et tuile géographique, tandis que les unions de réconciliation dupliquent le contenu des blocs.
L'identifiant de génération est important lors de la reconstruction. Une nouvelle sortie peut être préparée sans traiter les fragments obsolètes de la génération précédente comme étant actuels. Cela empêche une synchronisation partielle ou un calcul interrompu de produire un mélange de couverture ancienne et nouvelle.
La règle de fusion est délibérément simple : combinez les preuves. Les règles simples et déterministes sont précieuses lorsque l'historique privé doit converger sur un iPhone, un iPad et un Mac.
La couverture est mesurée sur une grille de surface égale
Les degrés de latitude et de longitude ne représentent pas des distances égales partout. Un degré de longitude diminue vers les pôles, de sorte que le comptage des pixels de carte ordinaires ou des cellules de taille de degré biaiserait le résultat en fonction de la localisation.
Maplight évalue la couverture terrestre sur une grille de surface égale d'environ deux kilomètres. Chaque ligne représente une zone physique comparable, et les zones illuminées sont stockées sous forme d'intervalles dans cette ligne. Un rayon de source devient une plage de cellules candidates ; ces cellules sont ensuite testées et accumulées.
Les intervalles rendent les chevauchements peu coûteux. Si plusieurs photos à proximité illuminent la même zone, le moteur fusionne les enregistrements au lieu de compter le terrain à plusieurs reprises. Le nombre final représente l'union du terrain éclairé, et non la somme de chaque cercle.
C'est aussi pour cette raison que le nombre de couverture peut ne pas correspondre à la superficie des cercles mathématiques multipliée par le nombre de sources. Les cellules océaniques sont supprimées, les chevauchements sont combinés et l'attribution des frontières peut répartir le résultat entre les pays.
Ne tenez pas l'océan dans le total.
Une photo prise en vol ou une visite côtière peut placer un rayon sur l'eau. Maplight est décrit comme une terre illuminée, donc l'eau ne peut pas augmenter silencieusement le nombre.
Le moteur de couverture utilise la géométrie de limites regroupée pour déterminer si les cellules candidates se trouvent sur terre et dans quel pays. La même famille de sources de base qui prend en charge la carte et le gazetteer hors ligne de Mapsake rend ce calcul possible sans envoyer un ensemble de coordonnées à vie à une API de cartographie web.
Les côtes sont naturellement plus complexes que les points intérieurs. Les îles, les péninsules étroites, les enclaves et les conventions frontalières contestées créent tous des cas particuliers. Le moteur considère donc la couverture comme une estimation utile à sa résolution de grille, et non comme un relevé cadastral.
Couverture des attributs sans double comptage
Les totaux par pays sont dérivés des mêmes cellules couvertes que le total mondial. Une cellule peut être attribuée en utilisant le confinement des limites tandis que l'union globale continue de la compter une fois. Cela maintient la décomposition par pays explicable et empêche une source adjacente à la frontière de créer plus de terres à l'échelle mondiale que la carte ne couvre réellement.
Les détails de l'origine sont distincts de l'attribution de la zone. Une origine de geohash peut se souvenir que les photos et un emplacement manuel ont contribué, mais les cellules illuminées autour de cette origine fusionnée appartiennent toujours à une seule entité. Cette distinction permet à l'interface d'expliquer d'où proviennent les preuves sans transformer les preuves superposées en doublons.
Créez la chronologie à partir des instantanés enregistrés.
L’historique doit répondre à la question : « À quoi ressemblait Maplight cette année-là ? » Recalculer chaque année à partir de zéro à chaque mouvement du curseur gaspillerait la batterie et rendrait l’animation saccadée.
Le modèle enregistre des instantanés annuels associés à la génération et au rayon actuels. Chaque instantané représente des origines dont la date la plus ancienne est antérieure ou égale à sa date de fin. Les origines sans date restent disponibles pour la vue de toutes les époques sans être insérées dans une année historique fictive.
L'interface peut ensuite parcourir les totaux et la géométrie préparés tout en maintenant une réponse immédiate de la carte. La reconstruction se produit toujours lorsque l'ensemble d'origine sous-jacent, le rayon sélectionné ou la génération change, mais la lecture normale utilise une séquence stable.
Le rendu utilise un flou au lieu de milliers de cercles.
L'utilisateur voit une surface, et non des cellules de grille. La couche de rendu traduit la couverture calculée en une superposition qui peut se déplacer et effectuer un zoom avec l'atlas. Traiter le monde entier comme une texture haute résolution unique consommerait trop de mémoire ; représenter chaque origine comme une forme dynamique indépendante répéterait le travail de chevauchement à chaque image.
Par conséquent, Maplight maintient l'union géographique coûteuse en dehors de la boucle de rendu et affiche la couverture préparée en morceaux gérables. La superposition peut se concentrer sur la présentation : la couleur, l'opacité, le zoom et les transitions, tandis que le moteur de couverture gère la réponse géographique.
Cette limite aide également aux tests. Une capture instantanée de la couverture peut être vérifiée sans une vue SwiftUI, et le rendu peut être affiné sans modifier la sémantique de la fusion.
La confidentialité a façonné l'architecture.
Il serait plus simple de télécharger les coordonnées des photos sur un serveur et de calculer la couverture là-bas. Mapsake ne nécessite pas intentionnellement cette architecture. La quantification se produit avant la persistance de Maplight, la couverture peut être construite sur l'appareil avec une géométrie terrestre intégrée et le partage public exporte un résultat généralisé plutôt que la collection d'origine privée.
Ce choix déplace le travail vers le matériel de l'utilisateur et rend la conception de la synchronisation plus exigeante. Cela signifie également que le système peut rester utile hors ligne, le site web ne devient pas un entrepôt de lieux de photos personnels, et la suppression ou l'exportation de données reste liée à l'enregistrement Mapsake de l'utilisateur.

Ce que nous avons appris.
La leçon clé était de faire en sorte que chaque couche réponde à une question précise :
- Les origines expliquent quelles preuves généralisées existent et quand elles sont apparues pour la première fois.
- Les règles de fusion expliquent comment plusieurs appareils peuvent être combinés sans perdre d'ajouts.
- La couverture indique quelles cellules terrestres de surface égale sont mises en évidence.
- Les instantanés montrent comment cette union évolue au fil du temps.
- Le rendu explique comment faire en sorte que le résultat paraisse vivant.
Maplight semble ludique parce que la mécanique sous-jacente est délibérément retenue. Les entrées compactes, la synchronisation additive, la mesure de surface égale, les unions d'intervalles, les limites groupées et les instantanés préparés permettent à l'interface de faire sa partie émotionnelle : permettre à quelqu'un de voir une vie en photos illuminer la carte.