---
title: 거리값을 위치로 해석하는 법
description: 센서의 원본 거리값을 위치로 해석하고 지도와 알림으로 전달할 때 필요한 데이터 경계를 살펴봅니다.
marp: true
theme: yceffort
paginate: true
size: 16:9
tags:
  - java
  - gis
  - backend
date: 2026-11-04
published: true
featured: true
post: https://cheonbi.kr/series/event-distance-to-mms
---

# 거리값을 위치로 해석하는 법

센서의 원본 거리에서 지도와 알림까지

cheonbi

<!--
이 발표는 같은 이름의 개인 블로그 시리즈 6편을 요약합니다. 시설명, 좌표, 식별자와 수치는 원문처럼 이해를 돕기 위한 예시이며 특정 조직의 운영 정보를 설명하지 않습니다.
원문: https://cheonbi.kr/series/event-distance-to-mms
-->

---

## 센서가 보내는 값

```json
{"routeId": 10, "distanceM": 1300}
```

장치는 기준점부터의 누적 거리를 보내지만, 지도에는 좌표가 필요합니다.

원본 거리를 보존하고 별도의 기준정보로 위치를 해석합니다.

<!--
입력 예시는 실제 시설 정보가 아닙니다. 원문은 센서가 측정한 거리와 서버가 계산한 좌표의 출처를 나누는 데서 시작합니다.
출처: https://cheonbi.kr/2026/09/event-distance-to-mms-series/01-event-ingest-and-trigger
출처: https://cheonbi.kr/2026/09/linear-referencing
-->

---

## 저장과 후속 처리

```mermaid
flowchart LR
  A[센서 이벤트] --> B[원본 저장]
  B --> C[분류 결과 반영]
  C --> D[알림 작업 예약]
  D --> E[위치 해석]
  E --> F[그림과 문장]
  F --> G[외부 요청과 결과 기록]
```

저장 응답과 알림의 접수 결과는 서로 다른 사실을 나타냅니다.

<!--
프로세스 내부의 비동기 예약은 종료 시 작업을 잃을 수 있습니다. 반드시 이어야 하는 작업에는 내구성 있는 큐나 아웃박스가 필요하다는 원문의 한계도 함께 설명합니다.
출처: https://cheonbi.kr/2026/09/event-distance-to-mms-series/01-event-ingest-and-trigger
-->

---

## 기준점과 경로점

| 점의 종류 | 입력        | 역할                 |
| --------- | ----------- | -------------------- |
| 기준점    | 거리와 좌표 | 거리축의 눈금을 고정 |
| 경로점    | 좌표        | 지도상의 굴곡을 표현 |

거리의 출처와 좌표의 출처를 따로 기록합니다.

기준정보를 고치면 같은 원본 이벤트를 다시 계산할 수 있습니다.

<!--
거리와 좌표의 신뢰도를 boolean 하나로 합치면 어느 값을 검증했는지 알기 어렵습니다. 경로점의 거리는 양쪽 기준점 사이에서 계산할 수 있습니다.
출처: https://cheonbi.kr/2026/09/linear-referencing
-->

---

## 목적에 따른 점 선택

| 필요한 값   | 고를 점                            |
| ----------- | ---------------------------------- |
| 보간 좌표   | 앞뒤에서 가장 가까운 좌표 보유 점  |
| 주변 위치명 | 이름이 있고 거리 차가 가장 작은 점 |
| 추가 설명   | 해당 설명이 있는 점                |

한 행의 정보 부족이 다른 계산까지 막지 않게 합니다.

<!--
계산식 전에 후보를 고르는 규칙이 필요합니다. 같은 거리의 후보가 여러 개라면 거리와 식별자로 순서를 고정해 단건 조회와 일괄 계산이 같은 결과를 내게 합니다.
출처: https://cheonbi.kr/2026/09/event-distance-to-mms-series/02-distance-to-coordinate
-->

---

## 두 기준점 사이의 보간

```text
t = (D - d0) / (d1 - d0)
latitude  = lat0 + (lat1 - lat0) * t
longitude = lon0 + (lon1 - lon0) * t
```

1,000m와 1,600m 사이의 1,300m는 `t = 0.5`입니다.

한쪽 기준점이 없거나 분모가 0이면 정상 좌표를 만들 수 없습니다.

<!--
이는 위경도를 각각 직선 보간한 예시입니다. 원문 3편에서는 앞쪽 기준점이 없는 구간을 자동 외삽하지 않고 위치를 알 수 없다고 반환합니다. 계산 좌표의 소수점 자릿수는 정확도를 증명하지 않습니다.
출처: https://cheonbi.kr/2026/09/event-distance-to-mms-series/02-distance-to-coordinate
-->

---

## 굴곡을 반영하는 경로 비율

```text
경로점의 거리 = 시작 거리
  + (끝 거리 - 시작 거리) * 누적 경로 길이 / 전체 경로 길이
```

인접 좌표 사이의 길이를 누적해 굴곡점의 거리를 배분합니다.

기준점 사이에서 실제 길이와 지도 경로 길이의 비율이 일정하다는 가정이 필요합니다.

<!--
원문은 Haversine으로 인접한 좌표 사이의 거리를 구하고 폴리라인 길이를 누적합니다. 이 가정이 맞지 않는 구간에는 기준점을 추가해야 하며 사람이 확정한 측정값은 자동 재계산으로 덮어쓰지 않습니다.
출처: https://cheonbi.kr/2026/09/linear-referencing
-->

---

## 일괄 계산의 등가성

여러 이벤트는 경로별 기준정보를 한 번 읽어 메모리에서 처리할 수 있습니다.

| 경로        | 같은 우선순위         |
| ----------- | --------------------- |
| SQL         | 거리 차이, 거리값, ID |
| 메모리 검색 | 같은 순서와 동률 처리 |

동일한 입력으로 두 경로의 결과를 대조합니다.

<!--
원문에서 gap보다 작은 경우와 작거나 같은 경우를 혼용하면 동률에서 다른 점을 고르게 됩니다. 질의 수를 줄인 뒤 계산의 의미까지 달라지지 않았는지 검증해야 합니다.
출처: https://cheonbi.kr/2026/09/linear-referencing
-->

---

## 이름으로 추론하던 관계

표시할 노드의 종류를 이름으로 유추하던 쿼리를 외래키로 연결했습니다.

- 화면 이름이 바뀌어도 참조 관계를 유지합니다.
- 종류 선택 목록의 소프트 삭제와 기존 노드 표시를 구분합니다.
- 행 수와 결과 집합, 실행계획을 함께 비교합니다.

<!--
원문 4편에서는 관측 실행시간이 줄었지만 버퍼 접근은 늘었습니다. 작은 데이터의 서브밀리초 결과를 일반적인 성능 향상으로 주장하지 않습니다. 이 발표도 새 성능 수치를 제시하지 않습니다.
출처: https://cheonbi.kr/2026/09/2026-09-18-query-tuning
-->

---

## 한 번 해석한 위치

좌표와 인접 기준점의 설명을 하나의 결과로 묶습니다.

지도 렌더러와 문장 포맷터는 같은 위치 결과를 소비합니다.

표현 방식이 달라져도 마커와 설명이 같은 이벤트를 가리키게 합니다.

<!--
화면과 메시지가 기준점을 따로 찾으면 좌표와 설명이 어긋날 수 있습니다. 결과 객체는 어떤 정보를 보간했고 무엇을 최근접 검색으로 구했는지도 보존하는 경계입니다.
출처: https://cheonbi.kr/2026/09/event-distance-to-mms-series/02-distance-to-coordinate
출처: https://cheonbi.kr/2026/09/event-distance-to-mms-series/03-map-image-and-message
-->

---

## 지도와 단순 도식

| 표현      | 필요한 입력        | 실패 시 판단            |
| --------- | ------------------ | ----------------------- |
| 지도      | 좌표, 설정, 타일   | 사용할 타일과 좌표 확인 |
| 단순 도식 | 경로와 이벤트 거리 | 경로 범위와 길이 확인   |

일부 타일의 실패와 전체 표현 실패를 구분합니다.

<!--
타일을 하나도 받지 못한 빈 지도를 성공으로 남기지 않습니다. 지도 제공자의 출처 표시와 사용 조건도 렌더링 요구에 포함됩니다. 좌표 순서와 추정값 표시도 원문에서 확인할 항목입니다.
출처: https://cheonbi.kr/2026/09/event-distance-to-mms-series/03-map-image-and-message
-->

---

## 외부 요청과 데이터베이스

이미지 등록과 메시지 접수는 데이터베이스 롤백으로 되돌릴 수 없습니다.

- 성공 기록이 없어도 외부 요청은 접수됐을 수 있습니다.
- 접수와 실제 배달은 서로 다른 상태입니다.
- 재시도에는 중복을 다루는 규칙이 필요합니다.

<!--
성공 이력 조회 후 외부 요청을 보내는 순서만으로 동시 실행을 막을 수 없습니다. 원문은 잠금, 유일성 제약, 내구성 있는 큐, 외부 멱등 키 등에서 보장 범위를 선택해야 한다고 설명합니다.
출처: https://cheonbi.kr/2026/09/event-distance-to-mms-series/04-send-history-and-operations
-->

---

## 운영 기록과 데이터의 수명

수신 번호는 필요한 요청을 만들 때만 복호화하고, 이력에는 수신 대상 식별자를 남깁니다.

임시 파일과 확인용 이미지는 보관 목적과 수명이 다릅니다.

건너뜀, 전송 중, 접수, 실패를 구분하면 알림이 없었던 이유를 확인할 수 있습니다.

<!--
이는 원문의 설계 경험을 요약한 것입니다. 실제 서비스의 개인정보 처리 기준은 별도 요구사항에 맞게 정해야 합니다. 요청 본문과 인증값이 로그에 남지 않는지도 확인합니다.
출처: https://cheonbi.kr/2026/09/event-distance-to-mms-series/04-send-history-and-operations
-->

---

## 원문과 검증 기준

[거리값을 위치로 해석하는 법 시리즈](https://cheonbi.kr/series/event-distance-to-mms)

원본 저장, 선형참조, 기준점 선택, 쿼리 정리, 그림과 문장, 외부 요청 기록을 6편으로 정리했습니다.

계산 경계의 재현성과 SQL·메모리 경로의 등가성을 먼저 확인합니다.

<!--
각 단계의 상세 코드와 실패 사례는 원문에서 읽을 수 있습니다. 발표의 숫자와 좌표는 설명용 예시이며 새로운 운영 성능이나 전송 보장을 주장하지 않습니다.
원문: https://cheonbi.kr/series/event-distance-to-mms
-->
