Nuovo: Esplora foto · Trova qualsiasi foto di viaggio cartografiata.

Diario di ingegneria.

Ingegneria di Maplight: Da coordinate delle foto a copertura del suolo.

Dietro l'interfaccia si trova una pipeline deterministica per la quantizzazione dei dati, la fusione di dispositivi offline, la misurazione di un'area una sola volta e il mantenimento della cronologia della sorgente privata al di fuori di un server.

Di. 6 minuto di lettura
Maplight illumina le parti del mondo rappresentate da una cronologia di viaggi privati di Mapsake.

La domanda del prodotto dietro Maplight

Una mappa di un paese visitato risponde a una domanda binaria utile: un luogo fa parte della tua storia? Maplight pone una domanda diversa. Basandosi su anni di foto geolocalizzate e altre prove di viaggio, quali parti del territorio hanno raggiunto quei momenti?

Questo assomiglia al disegno di cerchi trasparenti attorno ai punti. Una funzionalità di produzione deve risolvere problemi più complessi: i punti si sovrappongono, i cerchi attraversano le coste e i confini, la Terra è curva, i dati di origine provengono da più sistemi, i dispositivi più vecchi potrebbero essere offline e una libreria a vita deve essere sufficientemente veloce da essere esplorata in modo interattivo.

L'implementazione di Maplight separa queste preoccupazioni in un piccolo modello di origine portatile, un motore di copertura deterministico e uno strato di rendering. La stessa input dovrebbe produrre la stessa copertura, sia che la cronologia sia stata creata su un dispositivo o combinata tramite iCloud su più dispositivi.

Generalizza l'input prima di salvarlo

L’input iniziale può essere una coordinata fotografica, un viaggio importato, un timbro sul passaporto o un luogo registrato manualmente. Prima di salvare un’origine Maplight, Mapsake quantizza latitudine e longitudine in una cella geohash di sei caratteri. L’origine salvata contiene il geohash, una maschera di bit che descrive i tipi di fonti contributive e il primo giorno noto.

Questo fornisce tre proprietà utili.

In primo luogo, le prove ripetute nella stessa piccola cella geografica possono essere fuse in un'unica origine. In secondo luogo, il registro portatile è compatto e deterministico. In terzo luogo, il modello Maplight non deve conservare ogni coordinata della foto originale per riprodurre l'illuminazione.

La data più antica controlla la visualizzazione "Cronologia". Le fonti senza data vengono comunque conteggiate nel risultato totale, ma non pretendono di appartenere a un anno che l'app non può determinare.

Maplight History mostra l'evoluzione dell'anno 2021 con territori, paesi e origini illuminate

Permetti l'aggiunta cumulativa.

La sincronizzazione di iCloud non è un flusso di dati unico e ordinato. Due dispositivi possono funzionare offline, scrivere record correlati e successivamente ricevere duplicati in ordini diversi. Un sistema del tipo "ultimo che scrive, vince" farebbe scomparire dati storici legittimi.

Invece, le origini vengono unite tramite geohash. I flag di origine vengono combinati e il giorno valido più antico vince. Le origini sono codificate in ordine ordinato all'interno di blocchi compatti. Un blocco logico è identificato da profilo, generazione e tile geografico, mentre le unioni di riconciliazione duplicano il contenuto del blocco.

L'identificatore di generazione è importante durante la ricostruzione. È possibile preparare una nuova emissione senza trattare i frammenti obsoleti della generazione precedente come attuali. Questo impedisce che una sincronizzazione parziale o un calcolo interrotto producano una miscela di copertura vecchia e nuova.

La regola di unione è deliberatamente semplice: unire le prove. Regole semplici e deterministiche sono preziose quando la stessa cronologia privata deve convergere su un iPhone, un iPad e un Mac.

La copertura viene misurata su una griglia di area uguale

I gradi di latitudine e longitudine non rappresentano distanze uguali ovunque. Un grado di longitudine diminuisce verso i poli, quindi contare i pixel della mappa ordinari o le celle di dimensioni di grado distorcerebbe il risultato in base alla posizione.

Maplight valuta la copertura del territorio su una griglia di area uguale di circa due chilometri. Ogni riga rappresenta un'area fisica comparabile e le aree illuminate sono memorizzate come intervalli all'interno di quella riga. Un raggio di origine diventa un intervallo di celle candidate; queste celle vengono quindi testate e accumulate.

Gli intervalli rendono le sovrapposizioni poco costose. Se diverse foto nelle vicinanze illuminano la stessa area, il motore unisce le esecuzioni invece di contare il terreno ripetutamente. Il numero finale rappresenta l'unione del terreno illuminato, non la somma di ogni cerchio.

Questo è anche il motivo per cui il numero di copertura potrebbe non corrispondere all'area dei cerchi matematici moltiplicata per il numero di fonti. Le celle oceaniche vengono rimosse, le sovrapposizioni vengono combinate e l'attribuzione dei confini può dividere il risultato tra i paesi.

Non includere l'oceano nel totale.

Una foto scattata in volo o una visita alla costa può posizionare un raggio sull'acqua. Maplight è descritta come terra illuminata, quindi l'acqua non può silenziosamente gonfiare il numero.

Il motore di copertura utilizza la geometria dei confini raggruppati per determinare se le celle candidate si trovano sulla terraferma e in quale paese si trovano. La stessa famiglia di base di fonti che supporta la mappa e la guida offline di Mapsake rende questo calcolo possibile senza inviare un set di coordinate a una API di mappatura web.

Le coste sono naturalmente più complesse dei punti interni. Isole, penisole strette, enclave e convenzioni di confine contestate creano tutti casi particolari. Pertanto, il motore considera la copertura come una stima utile alla sua risoluzione a griglia, e non come un rilievo catastale.

Copertura degli attributi senza conteggio doppio

I totali dei paesi sono derivati dalle stesse celle coperte del totale globale. Una cella può essere assegnata utilizzando il contenimento dei confini mentre l'unione globale continua a contarla una volta. Ciò mantiene la suddivisione per paese spiegabile e impedisce che una fonte adiacente al confine crei più terra a livello mondiale di quanto la mappa copra effettivamente.

I dettagli dell'origine sono distinti dall'attribuzione dell'area. Un'origine di geohash può ricordare che sia le foto che un luogo manuale hanno contribuito, ma le celle illuminate attorno a quell'origine unita appartengono comunque a un'unica entità. Questa distinzione consente all'interfaccia di spiegare da dove provengono le prove senza trasformare le prove sovrapposte in duplicati.

Crea la linea temporale a partire dagli snapshot salvati.

La cronologia deve rispondere alla domanda: "Come appariva Maplight in quell'anno?" Ricalcolare ogni anno da zero ad ogni movimento dello slider consumerebbe la batteria e farebbe tremare l'animazione.

Il modello registra istantanee annuali associate alla generazione e al raggio correnti. Ogni istantanea rappresenta origini la cui data più antica è precedente o uguale alla sua data di interruzione. Le origini non datate rimangono disponibili per la visualizzazione di tutte le epoche senza essere inserite in un anno storico fittizio.

L'interfaccia può quindi scorrere totali e geometria preparati mantenendo una risposta immediata della mappa. La ricostruzione si verifica ancora quando l'insieme di origine sottostante, il raggio selezionato o la generazione cambiano, ma la riproduzione normale legge una sequenza stabile.

Il rendering utilizza la sfocatura invece di migliaia di cerchi.

L'utente vede una superficie, non celle della griglia. Lo strato di rendering traduce la copertura calcolata in una sovrapposizione che può muoversi e zoomare con l'atlante. Trattare l'intero mondo come una singola texture ad alta risoluzione utilizzerebbe troppa memoria; rappresentare ogni origine come una forma dinamica indipendente ripeterebbe il lavoro di sovrapposizione ad ogni fotogramma.

Pertanto, Maplight mantiene l'unione geografica costosa al di fuori del ciclo di rendering e visualizza la copertura preparata in frammenti gestibili. L'overlay può concentrarsi sulla presentazione: colore, opacità, zoom e transizioni, mentre il motore di copertura gestisce la risposta geografica.

Questo limite aiuta anche nei test. È possibile verificare una snapshot di copertura senza una vista SwiftUI e il rendering può essere ottimizzato senza modificare la semantica della fusione.

La privacy ha influenzato l'architettura.

Sarebbe più semplice caricare le coordinate delle foto su un server e calcolare la copertura lì. Mapsake non richiede intenzionalmente tale architettura. La quantizzazione avviene prima della persistenza di Maplight, la copertura può essere costruita sul dispositivo con una geometria terrestre integrata e la condivisione pubblica esporta un risultato generalizzato anziché la raccolta di origine privata.

Questa scelta sposta il lavoro sull'hardware dell'utente e rende più impegnativo la progettazione della sincronizzazione. Ciò significa anche che il sistema può rimanere utile offline, il sito web non diventa un archivio di posizioni di foto personali e la rimozione o l'esportazione dei dati rimane collegata al record Mapsake dell'utente.

Impostazioni di Maplight che mostrano il raggio di visualizzazione, il numero di amici privati, l'opzione di ripristino e cancellazione dei dati.

Cosa abbiamo imparato.

La lezione chiave è stata fare in modo che ogni livello risponda a una domanda precisa:

  • Le origini spiegano quali prove generalizzate esistono e quando sono apparse per la prima volta.
  • Le regole di unione spiegano come più dispositivi possono essere combinati senza perdere aggiunte.
  • La copertura indica quali celle terrestri di area uguale sono evidenziate.
  • Gli scatti mostrano come questa unione cambia nel tempo.
  • Il rendering spiega come rendere il risultato più realistico.

Maplight sembra giocoso perché la meccanica sottostante è deliberatamente contenuta. Gli input compatti, la sincronizzazione additiva, la misurazione dell'area uguale, le unioni di intervalli, i limiti raggruppati e gli snapshot preparati consentono all'interfaccia di svolgere la sua parte emotiva: permettere a qualcuno di vedere una vita in foto illuminare la mappa.

Icona dell'app Mapsake

Sviluppatore indipendente di Mapsake, che spiega il funzionamento del prodotto, della mappatura, della privacy e della piattaforma Apple alla base dell'app.

Crea il tuo atlante personale.

Inizia con la cronologia dei viaggi che hai già.

Mapsake è gratuito, non richiede un account Mapsake per l'uso principale e mantiene il riconoscimento delle foto supportato sul tuo dispositivo.

Ottieni Mapsake gratuitamente