Новое: Фотопросмотрщик · Найдите любую фотографию путешествия, добавленную на карту.

Дневник разработчика

«Сегодня в этот день», «Тогда и сейчас» и «Отметки в паспорте».

«Сегодня в этот день», «Тогда и сейчас» и «Отметки в паспорте» используют разные методы: сопоставление с календарем, пространственное разделение и оптическое распознавание символов (OCR). Они следуют одному правилу: находить что-то полезное, объяснять это и оставлять окончательное решение за путешественником.

Разработано компанией. 11 минута чтения
Mapsake Паспорт со статистикой путешествий, картами и карточками памяти

Три способа вернуть прошлое.

Большинство туристических программ оптимизированы для следующей поездки. Mapsake также должна хорошо справляться с возвращением пользователя к поездке, которая произошла пять, десять или двадцать лет назад.

Это обновление добавляет три разных пути в прошлое. В этот день Находит связь с календарем. Тогда и сейчас Находит связь с местоположением. Визы в паспорте сохраняет физический артефакт и использует его для улучшения карты.

Они основаны на одном и том же принципе: начинайте с данных, которыми уже владеет пользователь, выполняйте интересные операции на устройстве и запрашивайте подтверждение, когда предположение может быть неверным.

В основе этой версии лежит идея сохранения данных, но это не означает «отправлять больше уведомлений». Архив атласа становится полезным, когда он создает новые причины для повторного просмотра старых данных. Лучшая причина – это реальная связь, которую пользователю не нужно было создавать вручную.

Функция «Сегодня в этот день», «Тогда и сейчас» и «Отметки» создают эти связи по-разному. Это позволило протестировать, сможет ли растущий набор функций Mapsake совместно использовать загрузку фотографий, определение местоположения, рендеринг, навигацию и правила конфиденциальности, не превращаясь в один огромный движок памяти.

Функция «Сегодня в этот день» использует даты не только из фотографий.

Самая простая реализация предполагает поиск фотографий за текущий месяц и день в фотобиблиотеке. Mapsake идет дальше, поскольку фотографии – это лишь один из видов доказательств путешествий.

Каждое место на карте может содержать информацию о днях пребывания, полученную из ручных записей, импорта, данных о перелетах и истории фотографий. Функция «Сегодня в этот день» объединяет эти даты с метаданными фотографий, хранящимися в кэше, группирует результаты по годам и сортирует их, начиная с наиболее конкретных мест. Город или аэропорт может стать центральным элементом воспоминания, в то время как его регион и страна остаются частью той же истории.

Фильтрация фотографий выполняется отдельно от основного интерфейса, потому что большая библиотека все равно остается большой библиотекой, даже если запрос кажется простым. Результаты группируются по годам и отображаются в виде спокойных карточек. Открытие одной из них показывает ее галерею и ссылки на соответствующие истории о местах.

Также существует функция автоматической подстановки ближайшей записи для дней, когда нет данных. Если в июле нет данных для 9, Mapsake может предложить ближайшую доступную дату, а не показывать пустую страницу.

Сопоставление календаря имеет больше нюансов, чем кажется.

Фраза «один и тот же месяц и день» кажется тривиальной, пока не учитываются часовые пояса и неполные записи. Даты фотографий берутся из захваченных медиафайлов, в то время как даты мест, введенные вручную или импортированные, могут представлять собой день, а не точный момент. Поэтому эта функция работает в компонентах календаря, а не проверяет, находятся ли метки времени ровно на 365 дней друг от друга.

Места упорядочены по принципу "лучше - первым" для отображения. Если атлас знает аэропорт, город, регион и страну для одного дня, аэропорт или город должны быть указаны в заголовке карточки; перечисление всех четырех в качестве отдельных воспоминаний было бы преувеличением одного элемента доказательства. Полная иерархия доступна в виде меток мест и способствует окружающему повествованию.

Модуль обработки фотографий использует кэш метаданных, который Mapsake уже создал при импорте. Он не запрашивает у PhotoKit повторное сканирование всей библиотеки каждый раз при открытии профиля. Фильтрация по дням выполняется в отдельной задаче, а затем интерфейс получает небольшую коллекцию ссылок на ресурсы, которые можно загружать лениво.

Первый пункт входа находился в Atlas. Тестирование показало, что кнопка календаря делает самый важный экран более загруженным, даже в дни, когда нет воспоминаний. Перенос точки входа в Profile позволяет ей отображаться условно, естественно сочетаться с другими личными функциями и отображать не прочитанное состояние, не конкурируя с элементами управления картой.

Уведомления требуют собственной маршрутизации. Локальное уведомление не поступает по тому же пути, что и нажатие обычной универсальной ссылки. Mapsake записывает глубокую ссылку в полезную нагрузку уведомления, перехватывает ответ в делегате приложения и передает его в то же состояние навигации, которое используется другими глубокими ссылками. Видимая функция – это предложение; для надежного нажатия требуется весь маршрут.

Напоминание предоставляется только по запросу.

Функция «Сегодня в этот день» может запланировать мягкое уведомление, но только после того, как пользователь ее включит. Mapsake подготавливает предстоящие памятные даты на основе локальных данных и добавляет глубокую ссылку, чтобы нажатие на уведомление открывало соответствующую страницу.

Ни один сервер не решает, какая память важна, и ни одно фото не должно покидать устройство, чтобы работала функция напоминания. Плитка профиля отображается только тогда, когда сегодня действительно есть что показать, с небольшой непрочитанной точкой, которая исчезает после открытия.

Копия уведомления может содержать информацию о более чем одном годе или месте, поскольку локальный расчет уже знает сгруппированный результат. Напоминание может содержать информацию о том, что путешественник был в Редмонде, Риме и Токио в этот день в течение нескольких лет. Текст формируется на устройстве и локализуется вместе с остальной частью приложения.

Этот условный пункт был решением, которое было связано не только с разработкой, но и с продуктом. Постоянная пустая карточка чаще рекламировала бы эту функцию, но она бы делала профиль более шумным каждый день, когда у этой функции не было ничего полезного.

«Then & Now» рассматривает местоположение как общую нить.

«Then & Now» ищет фотографии, сделанные недалеко от одного и того же места, но не менее чем через два года. Для реализации используется компактная пространственная сетка: отфильтрованные координаты фотографий помещаются в ячейки примерно 280 метров в ширину, и каждая ячейка хранит только самую старую и самую новую фотографию.

Ячейки с достаточно большим временным интервалом становятся кандидатами. Самые длинные интервалы отображаются первыми, близлежащие кандидаты удаляются, чтобы один участок не заполнял весь список, а скомпилированный справочник предоставляет метку города и страны. Результат кэшируется до тех пор, пока индекс фотографии не изменится.

Это намеренно не похоже на поиск похожих изображений. Фотографии не должны показывать одну и ту же композицию или объект; это другая задача для Constellations. Then & Now задает более простой вопрос: как выглядело это место, когда вы вернулись через несколько лет?

Пары открываются в обычном просмотрщике фотографий и могут быть общими через тот же путь рендеринга, что и карточки паспорта. Оригиналы остаются в исходной библиотеке, а Mapsake хранит только легкие метаданные, необходимые для повторного поиска пары.

Почему 280 метров и два года?

Пространственная ячейка намеренно допускает погрешности. GPS телефона может давать сбой, достопримечательность может быть сфотографирована с противоположных сторон площади, а старая камера может иметь менее точные координаты. Точное совпадение координат пропустит многие действительные результаты. Совпадение по уровню города будет слишком широким и может привести к сопоставлению несвязанных районов.

Примерно 280 метров – это пороговое значение для продукта, а не утверждение о том, что две фотографии показывают одну и ту же физическую точку. Это вопрос о том, достаточно ли близко результаты, чтобы ощутить связь, когда изображения расположены рядом. Минимальный срок в два года предотвращает восприятие первого и последнего дня отпуска как долгосрочного изменения.

Во время сканирования сохраняются только самые ранние и последние фотографии в каждой ячейке. Это делает использование памяти пропорциональным количеству заполненных ячеек, а не общему количеству изображений, и естественным образом увеличивает временной охват. Кандидатские пары затем сортируются по продолжительности и пространственно дедуплицируются, поэтому даже если у человека есть сотни фотографий вокруг одного домашнего квадрата, он все равно видит разнообразие.

Ключ кэширования основан на метаданных фотографии и количестве исключенных фотографий. Импорт новой партии фотографий или удаление фотографии с карты приводит к пересчету пар; повторное открытие экрана без изменения источника позволяет приложению использовать ранее полученный результат.

Первый этап тестирования показал, что Then & Now также тратит много времени на поиск ближайших городов. Поскольку он использует общий справочник, а не функцию обратного геокодирования, специфичную для функции, эта работа по индексации географических данных ускорила импорт и работу Constellations, что сделало эти метки намного дешевле. Общие основы создают общие успехи.

Функция «Общий доступ» использует конвейер Passport.

«Then & Now» требовалась карточка с двумя фотографиями, отображающими годы, место и период времени. Создание нового экспортера привело бы к дублированию отрисовки светлой и темной темы, соотношений сторон для социальных сетей, предварительной загрузки изображений, сохранения в «Фотографии» и системного листа обмена.

Вместо этого, эта пара оборачивается в пользовательскую карту Passport и передается на существующий экран обмена. Изображения источника предварительно загружаются, потому что SwiftUI's offscreen ImageRenderer работает синхронно в конечной точке рендеринга. Пользователь видит ту же схему предварительного просмотра и назначения, которая используется для карт и статистики.

Повторное использование – это не просто экономия кода. Это делает поведение обмена предсказуемым: ничего не публикуется автоматически, экспортируемый файл выглядит как предварительный просмотр, и применяются те же правила доступности и цветовой схемы.

Штампы в паспорте нуждаются в помощи, а не в ложной уверенности.

Реальные штампы на паспорте – это сложный материал для OCR. Они могут быть выцветшими, повернутыми, наложенными на фоновые изображения, написанными на разных языках и иногда нанесенными друг на друга. Любой сканер, который заявляет об идеальном автоматическом распознавании, может предоставить пользователю неверные данные о путешествиях.

Mapsake использует фреймворк Apple Vision на устройстве для извлечения текста, который может быть распознан, а затем ранжирует возможные совпадения. Код аэропорта IATA является сильным сигналом. Двухбуквенный код страны, название страны, местное название, город, порт въезда или европейская дата могут служить дополнительными доказательствами. Части названия аэропорта на местном языке помогают определить, что запись, вероятно, была сделана самолетом, даже если OCR не распознал конец слова.

Сервис сопоставления предлагает вариант и предпочтительную цепочку мест: страна, регион, город и аэропорт, если это доступно. Он никогда не принимает решение самостоятельно. На экране просмотра всегда есть возможность выбрать другой вариант или указать место вручную.

Эта осторожная рекомендация важна. Пропущенная рекомендация стоит одного касания. Уверенная, но неправильная рекомендация тихо повреждает карту.

Выцветшая марка из Исландии изменила механизм сопоставления.

Один реальный штамп сделал ограничения более наглядными. Текст на аэропорту должен был выглядеть следующим образом: KEFLAVIKURFLUGVOLLUR,, но размытые чернила и перенос строки воспринимались как что-то более близкое к Vision. KEFLAVIKURFLUGVOLI UR.. Проверка на полное слово для термина аэропорта на исландском языке не удалась, поэтому Mapsake не смогла сделать вывод о рейсе и не смогла определить аэропорт Кефлавик.

Исправление не было специальным случаем для одного паспорта. Теперь механизм сопоставления распознает корни для общих слов, связанных с аэропортами, на нескольких языках: фрагменты, соответствующие слову "аэропорт" на исландском, немецком, испанском, португальском, нидерландском, скандинавских языках и других. Даже повреченный конец может указывать на способ въезда и смещать разрешение местоположения в сторону аэропорта.

Добавлены два новых урока о штампах ЕС и Шенгенской зоны. Двухбуквенный код страны в формате ISO полезен только в том случае, если он отображается отдельно; интерпретация каждого двухбуквенного слова как страны приведет к нелепым совпадениям. Европейские числовые даты также требуют анализа в формате «день-месяц», прежде чем локально-зависимый общий детектор получит возможность прочитать их в формате «месяц-день».

Разрешение точки входа толерантно к префиксам по той же причине. Длинные составные слова на местном языке могут содержать название города или аэропорта, даже если встроенный справочник содержит более короткую английскую форму. Программа решения пытается использовать значимые начальные фрагменты, а затем строит цепочку из страны, региона, города и аэропорта вокруг подтвержденного результата.

Цепочка отображается перед сохранением. Выбор конкретного аэропорта может указать город, регион и страну, но каждый уровень, полученный в результате анализа, остается видимым и доступным для редактирования. Интерфейс разработан таким образом, чтобы предлагать наиболее вероятный вариант, а затем предоставлять пользователю возможность принять или отклонить его.

Сохраняйте сам артефакт, а не его копию.

Запись штампа паспорта хранит метаданные и ссылку на исходное фото, а не полные байты изображения. Mapsake создает небольшой, воспроизводимый миниатюрный образ для стены штампов и загружает оригинал по запросу. Если исходный файл, полученный из Photos, удален, то при сверке можно удалить его сиротний штамп, не притворяясь, что изображение все еще существует.

Слово «действительно» в этом предложении имеет значение. Ограниченное разрешение «Фотографии» не может доказать, что невидимый ресурс был удален; он может просто находиться за пределами разрешенного набора. Восстановление удаляет штамп только в том случае, если разрешение библиотеки достаточно, и ни локальный, ни облачный идентификатор не найден. Неопределенность сохраняет запись.

Эта модель, основанная на ссылках, также позволяет хранить небольшие данные, совместимые с CloudKit. Метка может синхронизировать страну, дату, книгу, метод ввода, страницу, состояние избранного, заметку и идентификаторы, не пытаясь хранить фотографию паспорта в строке базы данных. Локальный миниатюрный снимок 256 – это кэш, а не источник истины.

Марки можно организовать в именованные паспорта, отмечать как прибытие или выезд, назначать даты и способы въезда, а также просматривать по странам. Обрезка, выравнивание, поворот и кисть для затушевания помогают подготовить полезное изображение перед публикацией коллажа по стране или континенту.

То же самое можно использовать для сканирования страницы с фотографией в паспорте в книгу. Разбор машиночитаемой зоны предоставляет структурированные поля, где это возможно, а изображение остается ссылкой на собственную библиотеку пользователя.

Распознавание MRZ (машинно-читаемой зоны) отключает исправление языка. MRZ – это последовательность букв, цифр и угловых скобок; попытка преобразовать ее в естественные слова с помощью OCR может сделать ее более читаемой, но при этом снизить точность извлеченных данных. Печатные поля, такие как место рождения, обрабатываются отдельно, и все результаты отображаются в редактируемом формате.

Функции камеры и выбора изображений используют этап обрезки и поворота перед распознаванием. Позднее была добавлена функция выравнивания, зум, панорамирование и кисть размытия для защиты конфиденциальной информации. Редактор отключает конфликтующие жесты при активной кисти размытия, а затем объединяет изменения в исходное изображение в соответствии с выбранным пользователем способом хранения.

Галерея штампов группирует артефакты по континентам и странам, а не только по страницам паспорта. Нажатие на развернутый список стран открывает отдельные штампы; можно фильтровать прибытия, вылеты и избранное; заголовки континентов и стран могут отображать коллаж через конвейер Passport. Страны остаются полезными метаданными, но географическое расположение – более естественный способ просмотра в атласе путешествий.

Достаточно технически продвинуто, чтобы вызывать доверие.

Эти функции используют три разных метода: объединение календарей, пространственное разбиение и оптическое распознавание символов (OCR). Пользовательский интерфейс следует той же схеме.

  1. Получите кандидата на основе существующих локальных данных.
  2. Сложные функции следует выносить за пределы основного интерфейса.
  3. Объясните, что было найдено.
  4. Предоставьте пользователю возможность открыть, исправить, поделиться или проигнорировать его.

Это тот вид интеллекта, который я хочу видеть в Mapsake. Он должен облегчать повторное открытие личной записи, не создавая впечатление, что алгоритм лучше понимает жизнь, чем человек, который ее прожил.

В этих функциях скрыто больше инженерной работы, чем кажется на первый взгляд, но ни одна из них не должна быть сложной задачей для пользователя. Техническая работа успешна, когда «Сегодня в этот день» открывается на правильный год, «Then & Now» показывает неожиданное возвращение, а сложная отметка предлагает полезный вариант, не преувеличивая уверенность.

Иконка приложения Mapsake

Независимый разработчик Mapsake, рассказывающий о разработке продукта, картографии, конфиденциальности и работе с платформой Apple.

Создайте свою собственную карту путешествий.

Начните с истории ваших путешествий, которая уже у вас есть.

Mapsake бесплатна, не требует учетной записи Mapsake для основных функций и сохраняет сопоставление фотографий на вашем устройстве.

Скачать Mapsake бесплатно.