From d99ca0a3c445b9834ac07a383de6cb23aa98aa7d Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 12 Aug 2025 14:37:05 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[refactor]=20=EC=9B=A8=EC=9D=B4=EB=B8=94?= =?UTF-8?q?=EC=A1=B4=20=EC=B6=94=EC=B2=9C=20=EA=B2=BD=EB=A1=9C=EA=B0=80=20?= =?UTF-8?q?30km=20=EC=9D=B4=EC=83=81=EC=9D=BC=20=EA=B2=BD=EC=9A=B0,=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wayble/server/direction/exception/WalkingErrorCase.java | 1 + .../server/direction/service/WaybleDijkstraService.java | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/main/java/com/wayble/server/direction/exception/WalkingErrorCase.java b/src/main/java/com/wayble/server/direction/exception/WalkingErrorCase.java index d0ba3c76..09413004 100644 --- a/src/main/java/com/wayble/server/direction/exception/WalkingErrorCase.java +++ b/src/main/java/com/wayble/server/direction/exception/WalkingErrorCase.java @@ -12,6 +12,7 @@ public enum WalkingErrorCase implements ErrorCase { GRAPH_FILE_NOT_FOUND(500, 8002, "그래프 파일을 찾을 수 없습니다."), GRAPH_INIT_FAILED(500, 8003, "그래프 초기화에 실패했습니다."), NODE_NOT_FOUND(400, 8004, "해당 위도, 경도 근처의 노드가 존재하지 않습니다."), + DISTANCE_LIMIT_EXCEEDED(400, 8005, "경로가 허용 최대 거리(30km)를 초과하였습니다."), ; private final Integer httpStatusCode; diff --git a/src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java b/src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java index 8c847154..422134dc 100644 --- a/src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java +++ b/src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java @@ -1,9 +1,11 @@ package com.wayble.server.direction.service; +import com.wayble.server.common.exception.ApplicationException; import com.wayble.server.direction.dto.response.WayblePathResponse; import com.wayble.server.direction.entity.Edge; import com.wayble.server.direction.entity.Node; import com.wayble.server.direction.entity.type.Type; +import com.wayble.server.direction.exception.WalkingErrorCase; import com.wayble.server.direction.init.GraphInit; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -18,12 +20,16 @@ public class WaybleDijkstraService { // 11cm의 오차 허용 private static final double TOLERANCE = 0.000001; + private static final double MAX_DISTANCE = 30000.0; public WayblePathResponse createWayblePath(long start, long end) { List path = dijkstra(start, end); Map markerMap = graphInit.getMarkerMap(); int totalDistance = (int) Math.round(calculateDistance(path)); + if (totalDistance >= MAX_DISTANCE) { + throw new ApplicationException(WalkingErrorCase.DISTANCE_LIMIT_EXCEEDED); + } // 노드 간 5초 대기 시간 추가 (횡단 보도, 보행자 상황 등 반영) int totalTime = (int) Math.round(calculateTime(path)) + path.size() * 5; From 1361a688fad1d25f137edba982f6ef5be4388c64 Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 12 Aug 2025 15:22:53 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[fix]=20=EC=9B=A8=EC=9D=B4=EB=B8=94?= =?UTF-8?q?=EC=A1=B4=20=EC=B6=94=EC=B2=9C=20=EA=B2=BD=EB=A1=9C=20=EC=B4=9D?= =?UTF-8?q?=20=EA=B1=B0=EB=A6=AC=20=EA=B3=84=EC=82=B0=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../direction/service/WalkingService.java | 3 +++ .../service/WaybleDijkstraService.java | 23 +++++++++---------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/wayble/server/direction/service/WalkingService.java b/src/main/java/com/wayble/server/direction/service/WalkingService.java index 460c714b..f384e347 100644 --- a/src/main/java/com/wayble/server/direction/service/WalkingService.java +++ b/src/main/java/com/wayble/server/direction/service/WalkingService.java @@ -27,6 +27,8 @@ public class WalkingService { private final GraphInit graphInit; private final WaybleDijkstraService waybleDijkstraService; + private static final double NODE_SEARCH_RADIUS = 1000; + public TMapParsingResponse callTMapApi(TMapRequest request) { try { TMapResponse response = tMapClient.response(request); @@ -52,6 +54,7 @@ public WayblePathResponse findWayblePath( private long findNearestNode(double lat, double lon) { return graphInit.getNodeMap().values().stream() + .filter(node -> HaversineUtil.haversine(lat, lon, node.lat(), node.lon()) <= NODE_SEARCH_RADIUS) .min(Comparator.comparingDouble( node -> HaversineUtil.haversine(lat, lon, node.lat(), node.lon()) )) diff --git a/src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java b/src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java index 422134dc..2e35026e 100644 --- a/src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java +++ b/src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java @@ -7,6 +7,7 @@ import com.wayble.server.direction.entity.type.Type; import com.wayble.server.direction.exception.WalkingErrorCase; import com.wayble.server.direction.init.GraphInit; +import com.wayble.server.direction.service.util.HaversineUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -26,10 +27,13 @@ public WayblePathResponse createWayblePath(long start, long end) { List path = dijkstra(start, end); Map markerMap = graphInit.getMarkerMap(); - int totalDistance = (int) Math.round(calculateDistance(path)); + List polyline = createPolyLine(path); + int totalDistance = (int) Math.round(calculateDistance(polyline)); + if (totalDistance >= MAX_DISTANCE) { throw new ApplicationException(WalkingErrorCase.DISTANCE_LIMIT_EXCEEDED); } + // 노드 간 5초 대기 시간 추가 (횡단 보도, 보행자 상황 등 반영) int totalTime = (int) Math.round(calculateTime(path)) + path.size() * 5; @@ -40,8 +44,6 @@ public WayblePathResponse createWayblePath(long start, long end) { return new WayblePathResponse.WayblePoint(node.lat(), node.lon(), type); }).toList(); - List polyline = createPolyLine(path); - return WayblePathResponse.of(totalDistance, totalTime, wayblePoints, polyline); } @@ -115,17 +117,14 @@ private double calculateTime(List path) { return totalTime; } - private double calculateDistance(List path) { + private double calculateDistance(List polyline) { double totalDistance = 0.0; - for (int i = 0; i < path.size() - 1; i++) { - long from = path.get(i); - long to = path.get(i + 1); - totalDistance += graphInit.getGraph().getOrDefault(from, List.of()).stream() - .filter(edge -> edge.to() == to) - .findFirst() - .map(Edge::length) - .orElse(0.0); + for (int i = 1; i < polyline.size(); i++) { + totalDistance += HaversineUtil.haversine( + polyline.get(i - 1)[1], polyline.get(i - 1)[0], + polyline.get(i)[1], polyline.get(i)[0] + ); } return totalDistance; } From 42b18ffa87e8eacb54a7560d195d8b68466e6e3b Mon Sep 17 00:00:00 2001 From: zyovn Date: Tue, 12 Aug 2025 15:35:51 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[fix]=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/direction/service/WaybleDijkstraService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java b/src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java index 2e35026e..3a5b837c 100644 --- a/src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java +++ b/src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java @@ -28,11 +28,12 @@ public WayblePathResponse createWayblePath(long start, long end) { Map markerMap = graphInit.getMarkerMap(); List polyline = createPolyLine(path); - int totalDistance = (int) Math.round(calculateDistance(polyline)); + double totalDistanceMeters = calculateDistance(polyline); - if (totalDistance >= MAX_DISTANCE) { + if (totalDistanceMeters >= MAX_DISTANCE) { throw new ApplicationException(WalkingErrorCase.DISTANCE_LIMIT_EXCEEDED); } + int totalDistance = (int) Math.round(totalDistanceMeters); // 노드 간 5초 대기 시간 추가 (횡단 보도, 보행자 상황 등 반영) int totalTime = (int) Math.round(calculateTime(path)) + path.size() * 5;