새로운 기능: 사진 탐색기 · 지도에 표시된 모든 여행 사진을 찾기

엔지니어링 저널

엔지니어링: 사진 좌표에서 지표면 범위까지

겉보기에는 아름다운 모습 뒤에는, 증거를 양자화하고, 오프라인 장치를 통합하고, 땅을 한 번 측정하고, 개인 소스 기록을 서버에서 분리하는 결정론적 프로세스가 있습니다.

에 의해. 6 분 읽기
Maplight는 개인 Mapsake 여행 기록으로 표현되는 세계의 다양한 지역을 조명합니다.

Maplight의 핵심 질문.

방문 국가 지도는 유용한 이진 질문에 답합니다. '이 장소는 귀하의 역사에 속합니까?' Maplight은 위치 정보가 포함된 사진 및 기타 여행 증거를 기반으로 해당 위치에서 얼마나 멀리까지 기억이 닿습니까?', 라는 다른 질문을 합니다.

이는 점 주변에 반투명한 원을 그리는 것과 같습니다. 실제 기능은 더 복잡한 문제를 해결해야 합니다. 점이 겹치고, 원이 해안선과 국경을 넘어, 지구는 둥글고, 소스 데이터가 여러 시스템에서 수집되며, 이전 장치가 오프라인 상태가 될 수 있고, 방대한 라이브러리가 인터랙티브하게 탐색할 수 있을 만큼 빠워야 합니다.

Maplight의 구현은 이러한 요소를 작은 휴대용 원점 모델, 결정론적 범위 엔진, 렌더링 레이어로 분리합니다. 동일한 입력은 기록이 한 장치에서 생성되었든 여러 장치를 통해 iCloud로 병합되었든 동일한 범위를 생성해야 합니다.

데이터를 영구 저장하기 전에 일반화합니다.

원시 입력은 사진 좌표, 가져온 여행, 여권 스탬프 또는 수동으로 기록된 장소로 시작될 수 있습니다. Maplight 원본이 영구적으로 저장되기 전에 Mapsake는 해당 위도와 경도를 6자리 지오해시 셀로 양자화합니다. 저장된 원본에는 해당 지오해시, 기여 원본 유형을 설명하는 비트 마스크 및 가장 오래 알려진 날짜가 포함됩니다.

이것은 세 가지 유용한 기능을 제공합니다.

첫째, 동일한 작은 지리적 셀 내에서 반복되는 증거는 하나의 원본 위치로 병합될 수 있습니다. 둘째, 휴대용 기록은 작고 결정적입니다. 셋째, Maplight 모델은 조명 효과를 재현하기 위해 모든 원본 사진 좌표를 유지할 필요가 없습니다.

가장 빠른 날짜는 히스토리 뷰에 사용됩니다. 날짜가 없는 소스는 여전히 전체 결과에 포함되지만, 앱이 확인할 수 없는 연도에 속하는 것으로 간주되지 않습니다.

2021년의 Maplight 기록으로, 조명된 토지, 국가, 그리고 출신지의 총량을 보여줍니다.

병합을 가산적으로 만듭니다.

iCloud 동기화는 단일 순서의 데이터 스트림이 아닙니다. 두 장치가 오프라인 상태에서 작동하고 관련 데이터를 기록한 다음, 나중에 다른 순서로 중복된 데이터를 받을 수 있습니다. 마지막에 기록된 데이터가 우선되는 방식은 유효한 기록을 삭제할 수 있습니다.

대신, 원본은 지오해시로 병합됩니다. 소스 플래그는 결합되며, 가장 이른 유효한 날짜가 우선됩니다. 원본은 프로필, 세대 및 지리적 타일로 식별되는 논리적 청크 내에 정렬된 순서로 인코딩됩니다. 재조합 유니언은 청크 내용을 중복합니다.

생성 식별자는 재구성을 할 때 중요합니다. 새로운 출력은 준비될 수 있으며, 이전 세대의 오래된 데이터가 현재 데이터로 처리되지 않습니다. 이를 통해 부분적인 동기화 또는 중단된 계산으로 인해 오래된 데이터와 새로운 데이터가 혼합되는 것을 방지합니다.

병합 규칙은 의도적으로 간단합니다. 증거를 결합합니다. 간단하고 결정론적인 규칙은 동일한 개인 기록이 iPhone, iPad 및 Mac에서 수렴해야 하는 경우에 유용합니다.

커버리지는 동일 면적 그리드로 측정됩니다.

위도와 경도의 도는 모든 곳에서 동일한 거리를 나타내지 않습니다. 경도는 극지방으로 갈수록 작아지므로, 일반적인 지도 픽셀이나 도 크기의 셀을 세면 위치에 따라 결과가 달라집니다.

Maplight는 약 2킬로미터의 등면적 그리드로 토지 범위를 평가합니다. 각 행은 비교 가능한 물리적 영역을 나타내며, 조명된 영역은 해당 행에 걸쳐 간격으로 저장됩니다. 소스 반경은 후보 셀의 범위가 되며, 그런 다음 해당 셀이 테스트되고 누적됩니다.

간격 덕분에 중복이 저렴합니다. 근처의 여러 사진이 동일한 셀을 비추는 경우, 엔진은 실행을 병합하여 동일한 땅을 반복적으로 계산하는 대신 최종 숫자는 조명된 땅의 합집합을 나타내며, 모든 원의 합이 아닙니다.

이것이 바로 보조 데이터 수와 수학적 원의 면적을 곱한 값이 일치하지 않는 이유입니다. 해양 셀은 제거되고, 중복은 제거되며, 경계 속성은 결과를 국가별로 분할할 수 있습니다.

총 거리에서 바다를 제외합니다.

항공 사진이나 해안 방문 시, 반경을 물 위에 표시할 수 있습니다. Maplight는 육지를 밝히는 것으로 설명되므로, 물은 숫자를 과도하게 늘리지 않습니다.

커버리지 엔진은 번들된 경계 지오메트리를 사용하여 후보 셀이 육지에 있는지 여부와 어떤 국가에 속하는지 여부를 판단합니다. Mapsake의 오프라인 지도 및 Gazetteer 기능에서 사용되는 동일한 기본 소스 패밀리를 통해 웹 매핑 API에 라이프타임 좌표 세트를 보내지 않고도 이 계산을 사용할 수 있습니다.

해안선은 내륙 지역보다 복잡한 경우가 많습니다. 섬, 좁은 반도, 포위 지역 및 경계에 대한 분쟁은 모두 특수한 경우를 만듭니다. 따라서 이 엔진은 격자 해상도에서 범위를 유용한 추정치로 취급하며, 측량 데이터가 아닙니다.

중복을 피한 속성 범위.

국가별 총계는 전역 총계와 동일한 범위의 셀에서 파생됩니다. 셀은 경계 포함을 사용하여 할당되지만, 전역 합계는 이를 한 번만 계산합니다. 이를 통해 국가별 세부 정보를 설명할 수 있으며, 국경과 인접한 출처가 실제 지도 범위보다 더 많은 육지를 차지하지 않도록 합니다.

소스 분류는 영역 속성 분리입니다. 지오해시 원본은 사진과 수동으로 추가된 위치가 모두 관련되어 있음을 기억할 수 있지만, 해당 병합된 원본 주변의 강조 표시된 셀은 여전히 하나의 그룹에 속합니다. 이 구분은 인터페이스가 증거의 출처를 설명할 수 있도록 하지만, 중복되는 증거를 중복된 영역으로 처리하지 않도록 합니다.

과거 여행 기록에서 타임라인을 만듭니다.

역사는 '올해 Maplight는 어떤 모습이었는가?'라는 질문에 답해야 합니다. 슬라이더를 움직일 때마다 매번 처음부터 다시 계산하면 배터리가 소모되고 애니메이션이 끊길 수 있습니다.

모델은 현재 세대 및 반지름과 관련된 연도별 스냅샷을 기록합니다. 각 스냅샷은 시작 날짜가 해당 절단 날짜 이전인 원본을 나타냅니다. 날짜가 없는 원본은 모든 기간에 사용할 수 있으며 가상의 역사적 연도에 삽입되지 않습니다.

인터페이스는 준비된 총계와 지오메트리를 처리하면서 지도 응답 속도를 유지할 수 있습니다. 기본 데이터 세트, 선택된 반경 또는 생성 변경 시에만 재구성이 수행되며, 일반적인 재생은 안정적인 시퀀스를 읽습니다.

수천 개의 원 대신 흐림 효과를 렌더링합니다.

사용자는 격자 셀이 아닌 밝기를 봅니다. 렌더링 레이어는 계산된 범위를 오버레이로 변환하며, 이 오버레이는 지도와 함께 이동하고 확대/축소됩니다. 전 세계를 단일 고해상도 텍스처로 처리하면 메모리를 너무 많이 사용하고, 각 원점을 독립적인 실시간 모양으로 렌더링하면 매 프레임마다 중복 작업을 수행합니다.

따라서 Maplight는 지리적 병합을 프레임 루프 외부에서 처리하고 준비된 범위를 관리 가능한 단위로 렌더링합니다. 오버레이는 색상, 불투명도, 확대/축소, 전환 등 표현에 집중할 수 있으며, 범위 엔진은 지리적 정보를 처리합니다.

이 경계는 테스트에도 도움이 됩니다. SwiftUI 뷰 없이도 커버리지 스냅샷을 확인할 수 있으며, 렌더링을 조정할 때 병합 의미를 변경할 필요가 없습니다.

개인 정보 보호가 아키텍처 설계에 영향을 미쳤습니다.

사진 좌표를 서버에 업로드하여 해당 위치에서 범위를 계산하는 것이 더 간단할 수 있습니다. Mapsake는 그러한 아키텍처를 필요로 하지 않습니다. 양자화는 Maplight 지속성 전에 발생하며, 범위는 번들된 육지 지오메트리를 사용하여 장치에서 구축할 수 있으며, 공개 공유는 개인 원본 컬렉션이 아닌 일반화된 결과를 내보냅니다.

이 선택은 처리를 사용자 하드웨어로 옮기고 동기화 설계를 더욱 복잡하게 만듭니다. 또한 시스템이 오프라인 상태에서도 유용하게 사용될 수 있으며, 웹사이트가 개인 사진 위치의 저장소가 되지 않으며, 데이터 삭제 또는 내보내기가 사용자 Mapsake 기록과 연결되도록 합니다.

Maplight 설정에서 반지름 표시, 개인 친구 총계, 재구성 및 삭제 컨트롤을 확인합니다.

저희가 배운 점들.

중요한 교훈은 각 레이어가 하나의 명확한 질문에 답하도록 하는 것이었습니다.

  • '기원'은 일반적인 증거가 무엇이 있는지, 그리고 그것이 언제 처음 나타났는지 설명합니다.
  • 병합 규칙은 여러 장치가 추가 사항을 잃지 않고 어떻게 통합되는지 설명합니다.
  • 커버리지는 동일 면적의 육지 셀이 얼마나 표시되는지 나타냅니다.
  • 스냅샷은 시간이 지남에 따라 해당 집합이 어떻게 변하는지 보여줍니다.
  • 렌더링은 결과물을 생동감 있게 만드는 방법입니다.

Maplight는 내부 장치가 의도적으로 단순화되어 있어 재미있어 보입니다. 간결한 입력, 동기화, 동일 면적 측정, 구간 병합, 묶인 경계선, 준비된 스냅샷을 통해 인터페이스는 감성적인 부분에 집중할 수 있습니다. 즉, 사진을 통해 인생이 지도에서 밝게 빛나는 것을 볼 수 있습니다.

Mapsake 앱 아이콘

Mapsake의 독립 개발자가 작성했으며, 앱 뒤에 있는 제품, 지도, 개인 정보 보호 및 Apple 플랫폼 작업에 대한 정보를 제공합니다.

나만의 여행 지도를 만드세요.

이미 가지고 있는 여행 기록부터 시작하세요.

Mapsake은 무료이며, 핵심 기능 사용을 위해 Mapsake 계정이 필요하지 않으며, 지원되는 사진 매칭 기능은 장치 내에서 작동합니다.

Mapsake 무료 다운로드