-
Notifications
You must be signed in to change notification settings - Fork 2
[FE] Polyline 생성 로직 및 Event Capturing 적용
YoonDH edited this page Apr 7, 2025
·
4 revisions
const flightPlanCoordinates = [
{ lat: 37.772, lng: -122.214 },
{ lat: 21.291, lng: -157.821 },
{ lat: -18.142, lng: 178.431 },
{ lat: -27.467, lng: 153.027 },
];
for(let i =0; i < flightPlanCoordinates.length - 1; i++) {
const tempPath = new google.maps.Polyline({
path: [flightPlanCoordinates[i], flightPlanCoordinates[i+1]],
geodesic: true,
strokeColor: "#FF0000",
strokeOpacity: 1.0,
strokeWeight: 2,
});
}
const flightPlanCoordinates = [
{ lat: 37.772, lng: -122.214 },
{ lat: 21.291, lng: -157.821 },
{ lat: -18.142, lng: 178.431 },
{ lat: -27.467, lng: 153.027 },
];
const flightPath = new google.maps.Polyline({
path: flightPlanCoordinates,
geodesic: true,
strokeColor: "#FF0000",
strokeOpacity: 1.0,
strokeWeight: 2,
});
- 다음과 같이 선을 그릴 때는 두 점을 잇는 짧은 길을 여러개 생성하거나, 복수의 점을 넣어서 하나의 길을 생성할 수 있다.
- | 여러 선 | 하나의 선 |
---|---|---|
장점 | 각 선에 이벤트를 등록할 수 있다. | 생성되는 오브젝트의 수가 적다. |
단점 | 생성되는 오브젝트의 수가 많다. | 각 짧은 선에 이벤트를 등록할 수 없다. |
- 두 방법은 다음과 같은 장단점이 존재한다.
- UNIRO는 매우 많은 짧은 선이 존재한다. 하나의 학교 내에 최대 1~2만 개의 간선이 생성되어 모든 오브젝트에 이벤트를 등록하게 될 경우, 메모리 소비가 매우 늘어날 가능성이 존재한다.
- 지도 + 모바일 서비스 특성상, 사용성이 중요하여 메모리 한계로 인한 성능 감소를 최소화로 하고자 후자의 방법을 선택하였다.
- 메모리 사용량을 줄이기 위해, 여러 짧은 선들을 합친 하나의 선으로 생성하기로 결정하였다.
- 그러나, 우리는 짧은 선에 이벤트를 등록해야하는 문제가 존재한다.
- 이 문제를 해결하기 어려워, 다시 여러 선을 생성하는 방식으로 돌아가려 했으나, 부트캠프 학습시간에 이벤트 캡처링 방식으로 고민하였다.
- 현재 긴 선을 터치하였을 때, 짧은 간선을 탐지하는 과정이 필요하였기에, 이벤트 캡처링을 적용하여 긴 간선에서 터치 지점으로 짧은 간선을 특정 짓는 알고리즘을 구현하였다.
export default function findNearestSubEdge(
edges: [google.maps.LatLngLiteral, google.maps.LatLngLiteral][],
point: google.maps.LatLngLiteral,
): {
edge: [google.maps.LatLngLiteral, google.maps.LatLngLiteral];
point: google.maps.LatLngLiteral;
} {
const edgesWithDistance = edges
.map(([startNode, endNode]) => {
return {
edge: [startNode, endNode] as [google.maps.LatLngLiteral, google.maps.LatLngLiteral],
distance: distance(point, centerCoordinate(startNode, endNode)),
};
})
.sort((a, b) => {
return a.distance - b.distance;
});
const nearestEdge = edgesWithDistance[0].edge;
const distance0 = distance(nearestEdge[0], point);
const distance1 = distance(nearestEdge[1], point);
const nearestPoint = distance0 > distance1 ? nearestEdge[1] : nearestEdge[0];
return {
edge: nearestEdge,
point: nearestPoint,
};
}
- 하나의 선을 이루는 좌표를 알기에 선 내부에 존재하는 짧은 선과, 터치 지점의 거리를 계산하여 거리가 가장 짧은 선을 터치한 선으로 결정지을 수 있었다.
before | after |
---|---|
![]() |
![]() |
- 각 생성 간선에 색을 입힌 결과입니다. 전체적으로 개별의 Polyline이 감소된 것을 확인할 수 있습니다.
before | after | |
---|---|---|
Image | ![]() |
![]() |
오브젝트 개수 | 3940 | 248 |
메모리 사용량 | 21.34 MB | 6.27 MB |
before | after |
---|---|
![]() |
![]() |
- FCP가 34초에서 14초로 약 20초 단축된 것을 확인할 수 있었습니다
- 🚏 완벽한 길을 그리기 위한 노력
- 🪖 버그데이 UT 결과 리포트
- 🐜 어드민 페이지
- 🌊 1차 자체 QA
- 🌊 2차 자체 QA
- 🌊 3차 자체 QA
- 🌊 4차 외부 QA
- 🌊 5차 외부 QA
- ☁️ FE의 GCP를 활용한 배포 방식 및 내부 아키텍쳐
- 🍀 UNIRO의 자연스러운 로딩 화면, 어떤 원리일까? (Suspense)
- 🧪 완벽한(?) 페이지를 위한 LightHouse 점수 개선기
- 🌎 구글 구면 좌표계 도입 여부
⚠️ API 통신 에러 처리- 🥷 바텀시트 만들기
- 💨 최적화 : 효율적인 길 렌더링(Event Capturing)
- 📀 최적화 : 오브젝트 캐싱
- 😎 최적화 : 모든 길 조회 SSE 적용