Інженерний журнал
Інженерія: Від фотокоординат до охоплення території
За видимою простотою ховається детермінований конвеєр для квантування даних, об'єднання автономних пристроїв, одноразового вимірювання території та захисту приватної історії джерел від сервера.
Питання продукту, що стоїть за Maplight.
Карта відвіданої країни відповідає на корисне питання: чи є це місце частиною вашої історії? Maplight ставить інше питання. Виходячи з років, вказаних у фотографіях та інших даних про подорожі, які найближчі місця досягли цих моментів?
Це схоже на малювання напівпрозорих кіл навколо точок. Для реалізації цієї функції в робочому середовищі необхідно вирішувати складніші завдання: точки можуть перекриватися, кола можуть перетинати узбережжя та кордони, Земля має форму кулі, дані надходять з кількох систем, старі пристрої можуть бути вимкнені, і бібліотека повинна бути достатньо швидкою для інтерактивного вивчення.
Реалізація Maplight розділяє ці аспекти на невелику портативну модель джерела, детермінований двигун обробки даних та шар рендерингу. Той самий вхід повинен призводити до одного й того ж результату, незалежно від того, чи було створено журнал на одному пристрої, чи він був об'єднаний через iCloud на кількох пристроях.
Узагальніть вхідні дані перед збереженням.
Початкові дані можуть бути фотокоординатами, імпортованою поїздкою, штампом у паспорті або вручну записаним місцем. Перш ніж початкова точка Maplight буде збережена, Mapsake перетворює її широту та довготу на комірку геохешу з шістьма символами. Збережена початкова точка містить цей геохеш, бітову маску, що описує типи джерел, які внесли вклад, і найранішу відому дату.
Це надає три корисні властивості.
По-перше, повторювані дані в одній і тій же невеликій географічній області можуть бути об'єднані в одне вихідне місце. По-друге, портативний запис є компактним і детермінованим. По-третє, моделі Maplight не обов'язково повинні зберігати всі вихідні координати фотографії для відтворення освітлення.
Найраніша дата використовується у представленні «Історія». Джерела без дат все одно враховуються в загальній статистиці, але вони не приписуються року, який додаток не може встановити.

Зробіть так, щоб об'єднання було сумарним.
Синхронізація з iCloud – це не єдиний впорядкований потік даних. Два пристрої можуть працювати в автономному режимі, записувати пов'язані записи, а потім отримувати дублікати в іншому порядку. Механізм «останнього запису перемагає» може призвести до втрати важливої історії.
Замість цього, джерела об'єднуються за геохэшем. Прапорці джерела об'єднуються, і найраніша допустима дата має пріоритет. Джерела закодовані в відсортованому порядку всередині компактних блоків. Логічний блок визначається профілем, поколінням і географічною плиткою, тоді як об'єднання реконсиляції дублюють вміст блоку.
Ідентифікатор покоління важливий при відновленні. Нові результати можуть бути підготовлені без урахування застарілих фрагментів з попередньої версії. Це запобігає частковій синхронізації або перериванню обчислень, які можуть призвести до змішування старих і нових даних.
Правило об'єднання навмисно просте: об'єднання доказів. Прості, детерміновані правила важливі, коли одна й та ж особиста історія має бути узгоджена на iPhone, iPad та Mac.
Покриття вимірюється на сітці з рівною площею.
Широта та довгота не представляють однакову відстань всюди. Довгота зменшується в міру наближення до полюсів, тому підрахунок звичайних пікселів карти або клітинок розміром з градус призведе до спотворення результату залежно від місцезнаходження.
Maplight оцінює площу покриття на приблизній сітці рівних площ у два кілометри. Кожен рядок представляє собою порівнянну фізичну площу, а освітлені ділянки зберігаються у вигляді інтервалів уздовж цього рядка. Радіус джерела стає діапазоном потенційних комірок; потім ці комірки тестуються та підсумовуються.
Інтервали роблять перекриття недорогим. Якщо кілька сусідніх фотографій освітлюють одні й ті ж комірки, двигун об'єднує послідовності, а не багаторазово підраховує землю. Остаточне число представляє собою об'єднання освітленої землі, а не суму кожного кола.
Це також пояснює, чому число покриття може не збігатися з площею математичних кіл, помноженою на кількість джерел. Морські комірки видаляються, перекриття усуваються, і атрибуція меж може розділити результат між країнами.
Виключіть океан із загальної суми.
Фотографія з літака або відвідування узбережжя може розмістити радіус над водою. Maplight описується як освітлена земля, тому вода не повинна штучно збільшувати кількість.
Механізм визначення області покриття використовує об'єднану геометрію меж для визначення, чи знаходяться потенційні клітинки на суші та в якій країні вони розташовані. Та сама базова сімейство джерел, яке підтримує автономні карти та довідник Mapsake, робить цей розрахунок доступним без надсилання набору координат у веб-картографічний API.
Берегові лінії, як правило, складніші, ніж внутрішні точки. Острови, вузькі півострови, анклави та суперечливі кордони створюють особливі випадки. Тому двигун розглядає покриття як корисну оцінку при його роздільній здатності, а не як кадастрову зйомку.
Покриття атрибутів без подвійного підрахунку.
Загальна кількість країн обчислюється на основі тих самих клітинок, що й загальна кількість по всьому світу. Клітиці може бути присвоєно значення з використанням граничного включення, в той час як глобальне об'єднання продовжує рахувати її лише один раз. Це дозволяє пояснити деталізацію по країнах і запобігає ситуації, коли джерело, розташоване поруч з кордоном, створює більше суші у всьому світі, ніж фактично покриває карта.
Розбивка джерел відрізняється від атрибуції території. Геохеш-джерело може запам'ятати, що до нього відносяться як фотографії, так і місце, додане вручну, але виділені клітинки навколо цього об'єднаного джерела все одно належать до однієї групи. Це розрізнення дозволяє інтерфейсу пояснювати, звідки взялися дані, не перетворюючи перекриваючіся дані на дубльовану територію.
Створіть часову шкалу з архівних знімків.
Історія повинна відповідати на питання: «Як виглядав Maplight у цей рік?». Повторний розрахунок кожного року з нуля при кожному русі повзунка буде витрачати батарею та викликати переривчастість анімації.
Модель зберігає знімки стану за кожен рік, пов'язані з поточною версією та радіусом. Кожен знімок представляє собою джерела, для яких найраніша дата знаходиться в межах або до вказаної дати. Джерела без дати залишаються доступними для перегляду за весь час, не додаючись до вигаданого історичного року.
Інтерфейс може потім переходити між підготовленими сумарними значеннями та геометрією, зберігаючи при цьому миттєву реакцію карти. Перебудова все одно відбувається при зміні вихідного набору, вибраного радіуса або генерації, але звичайне відтворення зчитує стабільну послідовність.
Замість тисяч кіл використовується ефект розмиття.
Користувач бачить не комірки сітки, а яскравість. Шар рендерингу перетворює обчислене покриття на накладення, яке може переміщатися та масштабуватися разом із картою. Обробка всього світу як єдиної текстури надзвичайно високої роздільної здатності вимагала б занадто багато пам'яті; рендеринг кожного джерела як незалежної живої форми призвів би до повторної обробки перекриттів на кожному кадрі.
Таким чином, Maplight утримує дорогий географічний облік поза основним циклом і відображає підготовлені дані у зручних для обробки фрагментах. Накладення може зосередитися на представленні: кольорі, прозорості, масштабуванні та переходах, в той час як двигун обробки даних відповідає за географічні обчислення.
Ця межа також допомагає в тестуванні. Знімок покриття можна перевірити без представлення SwiftUI, а рендеринг можна налаштувати без зміни семантики об'єднання.
Конфіденційність вплинула на архітектуру.
Було б простіше завантажувати координати фотографій на сервер і обчислювати покриття там. Mapsake навмисно не вимагає такої архітектури. Квантування відбувається до збереження даних у Maplight, покриття може бути побудовано на пристрої з використанням вбудованої геометрії землі, а публічний обмін експортує загальний результат, а не приватну вихідну колекцію.
Цей вибір переносить обробку на обладнання користувача та ускладнює проєктування синхронізації. Це також означає, що система може залишатися корисною в автономному режимі, веб-сайт не стає сховищем особистих фотографій, а видалення або експорт даних залишається пов’язаним із вашим записом Mapsake.

Чого ми навчилися.
Головний урок полягав у тому, щоб кожен шар відповідав на одне конкретне питання:
- Розділ «Походження» пояснює, які загальні докази існують та коли вони вперше з’явилися.
- Правила об'єднання пояснюють, як кілька пристроїв можуть об'єднуватися, не втрачаючи додані дані.
- Покриття показує, які клітинки суші з рівною площею відображаються.
- Знімки показують, як ця взаємодія змінюється з часом.
- Рендеринг дозволяє створити ефект живого зображення.
Maplight виглядає грайливо, тому що механізми, що лежать в основі, навмисно спрощені. Компактні елементи керування, синхронізація, вимірювання площі, об'єднання інтервалів, згруповані межі та підготовлені знімки дозволяють інтерфейсу зосередитися на емоційній складовій: дозволити користувачеві спостерігати, як фотографії оживляють карту.