Novo: Explorador de fotos · Encontre qualquer foto de viagem mapeada.

Diário do desenvolvedor

"Neste dia", "Then & Now" e "Passport Stamps"

"Neste dia", "Then & Now" e "Passport Stamps" usam técnicas diferentes: associações de calendário, agrupamento espacial e reconhecimento óptico de caracteres (OCR). Eles seguem a mesma regra: encontrar algo útil, explicá-lo e deixar a decisão final com o viajante.

Por. 11 minuto de leitura
Passaporte do Mapsake com estatísticas de viagem, mapas e cartões de memória.

Três maneiras de trazer o passado de volta.

A maioria dos softwares de rastreamento de viagens é otimizada para a próxima viagem. O Mapsake também precisa ser bom em trazer alguém de volta a uma viagem que aconteceu há cinco, dez ou vinte anos.

Esta atualização adiciona três caminhos diferentes para o passado. Neste dia encontra uma conexão com o calendário. Antes e agora encontra uma conexão de localização. Carimbos de passaporte preserva um artefato físico e o utiliza para melhorar o atlas.

Eles compartilham um princípio de design: comece com os dados que o usuário já possui, realize o trabalho interessante no dispositivo e solicite uma confirmação sempre que uma inferência possa estar incorreta.

Existe uma ideia de conservação por trás do lançamento, mas não é "enviar mais notificações". Um atlas vitalício se torna útil quando cria novas razões para revisar dados antigos. A melhor razão é uma conexão real que o usuário não teve que curar manualmente.

"Neste dia", "Then & Now" e "Stamps" criam essas conexões de maneira diferente. Isso os tornou um bom teste para ver se o conjunto de recursos em crescimento do Mapsake poderia compartilhar o carregamento de fotos, a resolução de locais, o renderização, a navegação e as regras de privacidade sem se transformar em um único motor de memória gigante.

"Neste dia" usa datas de mais do que apenas fotos.

A implementação mais óbvia pesquisaria na biblioteca de fotos o mês e o dia atuais. Mapsake vai um passo além, porque as fotos são apenas um tipo de evidência de viagem.

Cada local no atlas pode conter dias de presença de entradas manuais, importações, voos e histórico de fotos. "Neste dia" combina essas datas com os metadados das fotos armazenados em cache, agrupa o resultado por ano e ordena os locais mais específicos primeiro. Uma cidade ou aeroporto podem ser destacados na memória, enquanto sua região e país fazem parte da mesma história.

O filtro de fotos é separado da interface principal, pois uma biblioteca grande continua sendo uma biblioteca grande, mesmo quando a consulta parece simples. Os resultados são agrupados por ordem cronológica inversa e exibidos como cartões de ano claros. Ao abrir um cartão, ele revela sua galeria e links para as histórias de lugares relevantes.

Também existe uma função de fallback de "memória mais próxima" para os dias tranquilos. Se julho 9 não tiver nada, o Mapsake pode apontar para a data mais próxima que sim tem, em vez de apresentar um beco sem saída.

A função de correspondência de calendário tem mais detalhes do que aparenta.

"O mesmo mês e dia" pode parecer um predicado trivial até que os fusos horários e os registros incompletos entrem em jogo. As datas das fotos vêm dos meios capturados, enquanto as datas de locais inseridas manualmente ou importadas podem representar um dia em vez de um instante exato. Portanto, esta função funciona nos componentes do calendário em vez de verificar se os carimbos de data/hora estão exatamente 365 dias separados.

Os lugares são ordenados do mais fino ao mais fino para apresentação. Se o atlas conhece o aeroporto, a cidade, a região e o país por um dia, o aeroporto ou a cidade devem ser destacados no cartão; listar todos os quatro como memórias separadas exageraria uma evidência. A hierarquia completa está disponível como chips de local e contribui para a história circundante.

A visualização de fotos usa o cache de metadados que o Mapsake criou durante a importação. Ele não solicita que o PhotoKit escaneie toda a biblioteca sempre que o perfil é aberto. O filtro diário é executado em uma tarefa separada e, em seguida, a interface recebe uma pequena coleção de referências de ativos que pode carregar de forma preguiçosa.

O primeiro ponto de entrada estava no Atlas. Os testes mostraram que um botão de calendário tornava a tela visualmente mais importante mais confusa, mesmo em dias sem memórias. Mover o ponto de entrada para o Perfil permitiu que ele aparecesse condicionalmente, combinasse naturalmente com outros recursos pessoais e exibisse um estado não lido sem competir com os controles do mapa.

As notificações requerem seu próprio trabalho de roteamento. Uma notificação local não chega pelo mesmo caminho de um link universal comum. O Mapsake escreve um link profundo no payload da notificação, captura a resposta no delegado do aplicativo e a encaminha para o mesmo estado de navegação usado por outros links profundos. A funcionalidade visível é uma frase; o toque confiável requer todo o caminho.

O lembrete é intencionalmente opcional.

"Neste dia" pode programar uma notificação suave, mas apenas depois que o usuário a ativa. O Mapsake prepara as datas de memória futuras a partir dos dados locais e adiciona um link profundo para que, ao tocar na notificação, a visualização correta seja aberta.

Nenhum servidor decide quais memórias são importantes e nenhuma foto precisa sair do dispositivo para que o lembrete funcione. O bloco de Perfil aparece apenas quando há algo para mostrar naquele dia, com um pequeno ponto não lido que desaparece após a abertura.

A notificação pode resumir mais de um ano ou local, porque o cálculo local já conhece o resultado agrupado. Um lembrete pode indicar que o viajante esteve em Redmond, Roma e Tóquio neste dia, ao longo de vários anos. O texto é montado no dispositivo e localizado junto com o restante do aplicativo.

Essa entrada condicional foi uma decisão tanto de produto quanto de engenharia. Um cartão permanentemente vazio promoveria a funcionalidade com mais frequência, mas tornaria o perfil mais barulhento todos os dias em que a funcionalidade não tivesse nada de útil a dizer.

"Then & Now" considera a localização como o fio condutor.

"Then & Now" procura fotos tiradas perto do mesmo local com uma diferença de pelo menos dois anos. A implementação utiliza uma grade espacial compacta: as coordenadas das fotos filtradas são colocadas em células de aproximadamente 280 metros de largura, e cada célula armazena apenas a foto mais antiga e a mais recente enquanto é escaneada.

As células com um período de tempo suficientemente longo se tornam candidatas. Os períodos mais longos são exibidos primeiro, os candidatos próximos são removidos para que um único local não possa preencher toda a lista e o diretório agrupado fornece uma etiqueta de cidade e país. O resultado é armazenado em cache até que o índice de fotos mude.

Isso não é intencionalmente similaridade de imagens. As fotos não precisam mostrar a mesma composição ou assunto; isso é um trabalho diferente para Constellations. Como este lugar parecia quando você voltou anos depois?

Os pares são abertos no visualizador de fotos normal e podem ser compartilhados através do mesmo caminho de renderização dos cartões Passport. Os originais permanecem na sua biblioteca de origem, enquanto o Mapsake mantém os metadados leves necessários para encontrar o par novamente.

Por que 280 metros e dois anos?

A célula espacial é deliberadamente tolerante. O GPS do telefone pode variar, um ponto de referência pode ser fotografado dos lados opostos de uma praça, e uma câmera mais antiga pode ter coordenadas menos precisas. Uma correspondência exata de coordenadas perderia muitos resultados válidos. Uma correspondência no nível da cidade seria muito ampla e emparelharia bairros não relacionados.

Aproximadamente 280 metros é um limite de produto, e não uma afirmação de que duas fotos mostrem o mesmo ponto físico. Isso pergunta se a correspondência é suficientemente próxima para criar uma sensação de conexão quando as imagens são colocadas lado a lado. O mínimo de dois anos evita que o primeiro e o último dia de uma viagem sejam apresentados como uma mudança de longo prazo.

Apenas a foto mais antiga e a mais recente de cada célula são mantidas durante a varredura. Isso torna o uso da memória proporcional ao número de células ocupadas em vez do número total de imagens e maximiza naturalmente o período de tempo. Os pares candidatos são então classificados por duração e desduplicados espacialmente, para que uma pessoa com centenas de fotos em torno de uma única célula ainda veja variedade.

A chave de memorização segue a geração de metadados da foto e a contagem de exclusões. Importe um novo lote de bibliotecas ou remova uma foto do mapa e os pares são recalculados; reabra a tela sem alterar a fonte e o aplicativo reutiliza o resultado.

Um primeiro teste de benchmark mostrou que o "Then & Now" também gastava muito tempo em pesquisas de cidades próximas. Como ele usa o Gazetteer compartilhado em vez de um decodificador geográfico reverso específico para uma funcionalidade, o trabalho de indexação geográfica que acelerou as importações e o "Constellations" também tornou esses rótulos muito mais baratos. Bases compartilhadas criam vitórias compartilhadas.

Compartilhar reutiliza o pipeline do Passport.

"Then & Now" precisava de uma placa com duas fotos, anos, local e período. Criar um novo exportador teria duplicado o renderização de luz e escuridão, as proporções de aspecto sociais, o pré-carregamento de imagens, o salvamento de fotos e a folha de compartilhamento do sistema.

Em vez disso, o par é envolvido como um cartão Passport personalizado e entregue à tela de compartilhamento existente. As imagens de origem são pré-carregadas porque o ImageRenderer fora da tela do SwiftUI é síncrono no ponto de renderização final. O usuário vê o mesmo fluxo de visualização e destino usado para mapas e estatísticas.

Essa reutilização é mais do que economia de código. Isso torna o comportamento de compartilhamento previsível: nada é postado automaticamente, a exportação se parece com a visualização e as mesmas regras de acessibilidade e cor se aplicam.

Os carimbos de Passport precisam de uma ajuda, não de uma falsa certeza.

Os selos de passaporte reais são um material difícil de processar por OCR. Estão desbotados, rotacionados, sobrepostos a ilustrações, escritos em muitos idiomas e, às vezes, carimbados diretamente uns sobre os outros. Qualquer scanner que afirme oferecer reconhecimento automático perfeito engana o usuário, fornecendo dados de viagem imprecisos.

Mapsake usa o framework Vision da Apple no dispositivo para extrair o texto que pode ler e, em seguida, classifica as possíveis correspondências. Um código de aeroporto IATA é um sinal forte. Um código de país de dois dígitos, o nome do país, um endônimo local, uma cidade, um porto de entrada ou uma data europeia podem fornecer evidências adicionais. Os nomes de aeroportos no idioma local ajudam a reconhecer que uma entrada foi provavelmente feita de avião, mesmo quando o OCR falha no final da palavra.

O motor de correspondência sugere uma cadeia de locais preferidos: país, região, cidade e aeroporto, quando disponíveis. Ele nunca faz uma suposição por conta própria. A tela de revisão sempre permite outro candidato ou uma seleção totalmente manual.

Essa abordagem prudente é importante. Uma sugestão perdida custa um único toque. Uma sugestão incorreta e confiante corrompe silenciosamente o atlas.

Um carimbo de passaporte da Islândia desbotado mudou o algoritmo de correspondência.

Um selo real tornou os limites concretos. O texto do aeroporto deveria indicar KEFLAVIKURFLUGVOLLUR, mas a tinta desbotada e a quebra de linha foram interpretadas por Vision como algo mais próximo de KEFLAVIKURFLUGVOLI UR. Uma verificação de palavras inteiras falhou para o termo de aeroporto islandês, portanto, Mapsake não inferiu um voo nem resolveu o aeroporto de Keflavik.

A correção não foi um caso especial para um único passaporte. O comparador agora reconhece os radicais de palavras comuns de nomes de aeroportos em vários idiomas: fragmentos correspondentes à palavra "aeroporto" em islandês, alemão, espanhol, português, holandês, idiomas escandinavos e outros. Um final danificado ainda pode sugerir o modo de entrada e influenciar a resolução de localização em direção a um aeroporto.

Duas lições adicionais foram adicionadas sobre selos da UE e do Espaço Schengen. Um código de país ISO de dois caracteres no oval é útil apenas quando aparece sozinho; tratar cada palavra de dois caracteres como um país criaria correspondências absurdas. As datas europeias também devem ser analisadas primeiro de acordo com o dia antes que um detector geral sensível à localidade tenha a chance de lê-las de acordo com o mês.

A resolução do ponto de entrada é tolerante a prefixos pelo mesmo motivo. Palavras compostas longas em um idioma local podem conter um nome de cidade ou aeroporto, mesmo quando o glossário incluído armazena a forma curta em inglês. O resolvedor tenta usar fragmentos iniciais significativos e, em seguida, constrói a cadeia de país, região, cidade e aeroporto em torno do resultado confirmado.

A cadeia é mostrada antes de salvar. A seleção de um aeroporto com um nível de detalhe fino pode marcar sua cidade, região e país juntos, mas cada nível inferido permanece visível e editável. A interface do usuário é projetada em torno de uma sugestão forte seguida de uma decisão humana.

Mantenha o artefato, não outra cópia.

Um registro de carimbo de passaporte armazena metadados e uma referência à foto de origem, não aos bytes completos da imagem. A Mapsake cria uma miniatura pequena e regenerável para a parede de carimbos e carrega a imagem original sob demanda. Se uma imagem original proveniente do Fotos for realmente excluída, a reconciliação pode remover seu carimbo órfão sem fingir que a imagem ainda existe.

A palavra "realmente" nesta frase é importante. Uma permissão limitada de Fotos não pode provar que um ativo não visível foi excluído; pode simplesmente estar fora da seleção permitida. A reconciliação remove uma marca apenas quando a permissão da biblioteca é suficiente e nem o identificador local nem o da nuvem são resolvidos. A ambiguidade mantém o registro.

Este modelo baseado em referências também mantém os dados compatíveis com o CloudKit, de tamanho pequeno. Um carimbo pode sincronizar seu país, data, livro, método de registro, página, estado favorito, nota e identificadores, sem tentar armazenar uma fotografia de passaporte dentro de uma linha do banco de dados. Uma miniatura local 256 pixel é um cache, e não a fonte da verdade.

Os selos podem ser organizados em álbuns de passaporte nomeados, marcados como chegadas ou partidas, atribuídos datas e métodos de entrada e visualizados por país. Recortar, endireitar, girar e um pincel de desfoque ajudam a preparar uma imagem útil antes de compartilhar um mosaico de um país ou continente.

O mesmo fluxo pode digitalizar uma página de identificação do passaporte em um livro. A análise da zona de leitura automática fornece campos estruturados sempre que possível, enquanto a imagem permanece como uma referência à própria biblioteca do usuário.

O reconhecimento MRZ desativa a correção de idioma. A zona legível por máquina é uma sequência rígida de letras, números e colchetes; pedir ao OCR para convertê-la em palavras naturais pode torná-la mais legível, mas tornar os campos analisados menos precisos. Os campos impressos, como o local de nascimento, usam um processo separado de melhor esforço, e cada resultado é exibido em um formato de livro editável.

Os fluxos da câmera e do seletor compartilham uma etapa de recorte e rotação antes do reconhecimento. Posteriormente, foi adicionado um dial de endireitamento, zoom e panorâmica, além de um pincel de desfoque para detalhes sensíveis. O editor desativa os gestos conflitantes enquanto o pincel de desfoque está ativo, e então combina as edições na imagem de origem salva de acordo com o comportamento de armazenamento escolhido pelo usuário.

A galeria de selos agrupa os artefatos por continente e país, em vez de apenas por livro de passaporte. Tocar em uma pilha de países expandida abre os selos individuais; chegadas, partidas e favoritos podem ser filtrados; os cabeçalhos de continente e país podem exibir um mosaico através do pipeline de compartilhamento do Passport. Os livros de viagem permanecem metadados úteis, mas a geografia é o caminho de navegação mais natural em um atlas de viagens.

Técnicamente sólido para gerar confiança

Estes recursos utilizam três técnicas diferentes: junções de calendário, agrupamento espacial e reconhecimento óptico de caracteres (OCR). A experiência do usuário segue o mesmo padrão:

  1. Derive um candidato a partir de dados locais existentes.
  2. Mantenha o trabalho complexo fora da interface principal.
  3. Explique o que foi encontrado.
  4. Permita que o usuário abra, corrija, compartilhe ou ignore.

Esse é o tipo de inteligência que quero no Mapsake. Deve facilitar a redescoberta do registro privado sem agir como se um algoritmo entendesse uma vida melhor do que a pessoa que a viveu.

Existe mais engenharia nessas funcionalidades do que suas superfícies calmas sugerem, mas nenhuma delas precisa se tornar um trabalho de casa para o usuário. O trabalho técnico é bem-sucedido quando o "On This Day" abre para o ano correto, o "Then & Now" mostra um retorno surpreendente e uma marca difícil oferece um candidato útil sem exagerar a certeza.

Ícone do aplicativo Mapsake

Desenvolvedor independente do Mapsake, que explica o funcionamento do produto, do mapeamento, da privacidade e da plataforma Apple por trás do aplicativo.

Crie seu próprio atlas.

Comece com o histórico de viagens que você já tem.

Mapsake é gratuito, não requer uma conta Mapsake para uso básico e mantém o reconhecimento de fotos suportado no seu dispositivo.

Obtenha Mapsake grátis