-
Notifications
You must be signed in to change notification settings - Fork 0
[FE] 새로운 길 생성 로직
YoonDH edited this page Feb 24, 2025
·
2 revisions
- 본 서비스는 참여형 서비스로 사용자들이 학교 내에 존재하는 숨은 길들 + 지도에 나타나지 않은 길들을 생성하는 기능을 지원합니다.
- 존재하는 길 - 존재하는 길
- 존재하는 길 - 새로운 곳
| 길 생성 Case |
|---|
![]() |
| 파란색 선은 가능 / 빨간색 선은 불가 |
- 서비스의 메인 기능인 길 찾기를 적용하기 위해서, 모든 길들은 연결되어 있도록 해야합니다.
- 위에서 정의된 케이스를 모두 만족하기 위해서는 시작점 혹은 도착점이 존재하는 길 위에 존재해야 하기에 더 간단하게 구현을 위해서 시작점을 무조건 선 위에서 시작할 수 있도록 하였습니다.
- 사용자가 드래그를 통해 그림을 그리기
- 사용자가 화면을 터치하여 직선을 만들기(현재 버전)
초기 논의 단계에서는 사용자 인터렉션으로 2가지 아이디어가 존재하였습니다. 사용자에게 더 자유로운 인터렉션을 제공하기에는 1번의 방법이 훨씬 좋다고 생각하여 데모를 제작했습니다. 그러나, 1번의 단점은 지도에 일정한 형태의 길을 그리기 위해서는 사용자의 손떨림, 오차 등을 보정할 수 없다고 판단하여 직선을 그리기 위해 2번의 방식을 채택하였습니다.
- 앞에서 결정되었듯이, 사용자는 길을 만들기 위해서 원하는 곳을 터치하며 직선을 생성합니다.
- 가장 기본적인 방법은 서버에 사용자가 선택한 지점의 좌표들을 전송하는 것입니다.
| 길 생성 기초 로직 |
|---|
![]() |
| 터치 지점 (검은색 원) 을 이어 선을 생성 |
- 그러나 곡선을 표현, 길 병합 및 길 찾기에서 정밀한 길을 제공하기 위해서는 길을 일정 간격으로 제공할 필요가 있었습니다.
- 사용자가 생성한 길을 일정하게 3m 간격으로 분할하였습니다.
- 3m로 선정한 이유는 일반적으로 도보 사용자의 보폭으로 3~5 걸음으로 갈 수 있는 길이기에 모든 곡선 + 세밀한 길 병합을 표현할 수 있다 생각하였습니다.
- 고정된 길이로 길을 분할
- 동일한 간격으로 길을 분할
- 고정된 길이로 길을 분할하게 될 경우, 고정된 길이랑 길이 차이가 많이 발생하는 짧은 선이 생성될 가능성이 높다.
- 그리하여, 고정된 길이에 비슷하고 모두 일정한 길이를 가지도록 길을 분할한다,
| 길 분할 로직 |
|---|
![]() |
POST 요청 - 사용자가 POST 요청을 하게 될 경우, POST의 Body에는 클라이언트에서 길을 분할(샘플링)하여 전송한다.
| 길 생성 과정 |
|---|
| 점 생성 |
![]() |
| 길 생성 |
![]() |
| 길 분할 |
![]() |
export default function createSubNodes(polyLine: google.maps.Polyline): Coord[] {
const paths = polyLine.getPath();
const [startNode, endNode] = paths.getArray().map((el) => LatLngToLiteral(el));
const length = distance(startNode, endNode);
const subEdgesCount = Math.ceil(length / EDGE_LENGTH);
const subNodes: Coord[] = [startNode];
for (let i = 1; i < subEdgesCount; i++) {
const fraction = i / subEdgesCount;
subNodes.push(interpolate(startNode, endNode, fraction));
}
subNodes.push(endNode);
return subNodes;
}- 🚏 완벽한 길을 그리기 위한 노력
- 🪖 버그데이 UT 결과 리포트
- 🐜 어드민 페이지
- 🌊 1차 자체 QA
- 🌊 2차 자체 QA
- 🌊 3차 자체 QA
- 🌊 4차 외부 QA
- 🌊 5차 외부 QA
- ☁️ FE의 GCP를 활용한 배포 방식 및 내부 아키텍쳐
- 🍀 UNIRO의 자연스러운 로딩 화면, 어떤 원리일까? (Suspense)
- 🧪 완벽한(?) 페이지를 위한 LightHouse 점수 개선기
- 🌎 구글 구면 좌표계 도입 여부
⚠️ API 통신 에러 처리- 🥷 바텀시트 만들기
- 💨 최적화 : 효율적인 길 렌더링(Event Capturing)
- 📀 최적화 : 오브젝트 캐싱
- 😎 최적화 : 모든 길 조회 SSE 적용





