diff --git a/src/main/java/com/fitlink/service/FacilityRouteService.java b/src/main/java/com/fitlink/service/FacilityRouteService.java index 39864cb..31dbe93 100644 --- a/src/main/java/com/fitlink/service/FacilityRouteService.java +++ b/src/main/java/com/fitlink/service/FacilityRouteService.java @@ -5,8 +5,10 @@ public interface FacilityRouteService { RouteResponseDTO getRoute( - float originLat, float originLng, - float destLat, float destLng, + float originLat, + float originLng, + float destLat, + float destLng, String type ); -} \ No newline at end of file +} diff --git a/src/main/java/com/fitlink/service/FacilityRouteServiceImpl.java b/src/main/java/com/fitlink/service/FacilityRouteServiceImpl.java index 9bf362d..a2c7f05 100644 --- a/src/main/java/com/fitlink/service/FacilityRouteServiceImpl.java +++ b/src/main/java/com/fitlink/service/FacilityRouteServiceImpl.java @@ -12,11 +12,12 @@ public class FacilityRouteServiceImpl implements FacilityRouteService { @Override public RouteResponseDTO getRoute( - float originLat, float originLng, - float destLat, float destLng, + float originLat, + float originLng, + float destLat, + float destLng, String type ) { - return switch (type) { case "walk" -> tmapRouteService.getPedestrianRoute(originLat, originLng, destLat, destLng); case "car" -> tmapRouteService.getCarRoute(originLat, originLng, destLat, destLng); diff --git a/src/main/java/com/fitlink/service/TmapRouteService.java b/src/main/java/com/fitlink/service/TmapRouteService.java index 93cdd00..a383443 100644 --- a/src/main/java/com/fitlink/service/TmapRouteService.java +++ b/src/main/java/com/fitlink/service/TmapRouteService.java @@ -101,7 +101,7 @@ public RouteResponseDTO getTransitRoute(float oLat, float oLng, float dLat, floa } /* --------------------------- - * POST 호출 공통 + * POST 공통 * --------------------------- */ private TmapRouteDTO post(String url, String body) { @@ -121,13 +121,12 @@ private TmapRouteDTO post(String url, String body) { } catch (Exception e) { System.err.println("DTO 변환 오류: " + e.getMessage()); - e.printStackTrace(); return null; } } /* --------------------------- - * Walk / Car 공통 변환 + * Walk / Car 변환 * --------------------------- */ private RouteResponseDTO convertWalkCar(String type, TmapRouteDTO dto) { @@ -137,6 +136,7 @@ private RouteResponseDTO convertWalkCar(String type, TmapRouteDTO dto) { .distance(0) .duration(0) .path(new ArrayList<>()) + .waypoints(new ArrayList<>()) .build(); } @@ -145,9 +145,12 @@ private RouteResponseDTO convertWalkCar(String type, TmapRouteDTO dto) { int minutes = seconds / 60; List> path = new ArrayList<>(); + List waypoints = new ArrayList<>(); dto.getFeatures().forEach(feature -> { + var geo = feature.getGeometry(); + var prop = feature.getProperties(); if (geo == null || geo.getType() == null) return; @@ -161,8 +164,24 @@ private RouteResponseDTO convertWalkCar(String type, TmapRouteDTO dto) { case "Point" -> { if (geo.getPoint() != null) { + var c = geo.getPoint(); - path.add(List.of(c.get(1), c.get(0))); + double lat = c.get(1); + double lng = c.get(0); + + path.add(List.of(lat, lng)); + + // ★ turnType이 있으면 경유지로 추가 + if (prop != null && prop.getTurnType() != null) { + + waypoints.add( + new RouteResponseDTO.Waypoint( + lat, + lng, + prop.getDescription() + ) + ); + } } } @@ -170,8 +189,7 @@ private RouteResponseDTO convertWalkCar(String type, TmapRouteDTO dto) { if (geo.getMulti() != null) geo.getMulti().forEach(line -> line.forEach(coord -> - path.add(List.of(coord.get(1), coord.get(0))) - )); + path.add(List.of(coord.get(1), coord.get(0))))); } } }); @@ -181,6 +199,7 @@ private RouteResponseDTO convertWalkCar(String type, TmapRouteDTO dto) { .distance(distance) .duration(minutes) .path(path) + .waypoints(waypoints) .build(); } @@ -194,30 +213,9 @@ private RouteResponseDTO convertTransit(TransitRouteDTO dto) { int totalDuration = it.getDuration() / 60; - List steps = new ArrayList<>(); - - for (TransitRouteDTO.Leg leg : it.getLegs()) { - - String instruction = switch (leg.getMode()) { - case "WALK" -> "도보 이동"; - case "BUS" -> leg.getRoute() + " 버스 이동"; - case "SUBWAY" -> leg.getRoute() + " 지하철 이동"; - default -> "이동"; - }; - - steps.add( - new RouteResponseDTO.RouteStep( - leg.getMode().toLowerCase(), - instruction, - leg.getSectionTime() / 60 - ) - ); - } - return RouteResponseDTO.builder() .type("transit") .duration(totalDuration) - .routes(steps) .build(); } } diff --git a/src/main/java/com/fitlink/web/dto/RouteRequestDTO.java b/src/main/java/com/fitlink/web/dto/RouteRequestDTO.java index c80b1f8..fbfb968 100644 --- a/src/main/java/com/fitlink/web/dto/RouteRequestDTO.java +++ b/src/main/java/com/fitlink/web/dto/RouteRequestDTO.java @@ -3,6 +3,8 @@ import lombok.Getter; import lombok.Setter; +import java.util.List; + @Getter @Setter public class RouteRequestDTO { private float originLat; @@ -10,4 +12,14 @@ public class RouteRequestDTO { private float destLat; private float destLng; private String type; // walk, car, transit + + // 경유지 (위도/경도 리스트) + private List waypoints; + + @Getter @Setter + public static class Waypoint { + private float lat; + private float lng; + } + } \ No newline at end of file diff --git a/src/main/java/com/fitlink/web/dto/RouteResponseDTO.java b/src/main/java/com/fitlink/web/dto/RouteResponseDTO.java index e60e257..9d87d33 100644 --- a/src/main/java/com/fitlink/web/dto/RouteResponseDTO.java +++ b/src/main/java/com/fitlink/web/dto/RouteResponseDTO.java @@ -10,17 +10,18 @@ @Builder public class RouteResponseDTO { - private String type; - private int duration; - private int distance; // 도보/자동차만 - private List> path; // 도보/자동차만 - private List routes; // 대중교통만 + private String type; // walk / car / transit + private int duration; // minutes + private int distance; // meters (walk/car only) + private List> path; + + private List waypoints; // ★ 자동 추출된 안내 포인트 @Data @AllArgsConstructor - public static class RouteStep { - private String mode; - private String instruction; - private int duration; + public static class Waypoint { + private double lat; + private double lng; + private String description; // 예: "좌회전", "횡단보도 건너기" } } diff --git a/src/main/java/com/fitlink/web/dto/TmapRouteDTO.java b/src/main/java/com/fitlink/web/dto/TmapRouteDTO.java index a54a788..ca5d7a2 100644 --- a/src/main/java/com/fitlink/web/dto/TmapRouteDTO.java +++ b/src/main/java/com/fitlink/web/dto/TmapRouteDTO.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; + import java.util.List; @Data @@ -20,17 +21,11 @@ public static class Feature { @Data public static class Geometry { - private String type; - // Point -> [lng, lat] - private List point; - - // LineString -> [[lng, lat], [lng, lat] ...] - private List> line; - - // MultiLineString -> [[[lng, lat], ...], [...]] - private List>> multi; + private List point; // [lng, lat] + private List> line; // [[lng,lat], ...] + private List>> multi; // [[[lng,lat]...]] @JsonAnySetter public void handle(String key, Object value) { @@ -38,20 +33,17 @@ public void handle(String key, Object value) { if (value instanceof List list) { - // 1) Point : [lng, lat] if (!list.isEmpty() && list.get(0) instanceof Number) { this.point = (List) value; return; } - // 2) LineString : [[lng,lat], [lng,lat]] if (!list.isEmpty() && list.get(0) instanceof List sub && sub.size() == 2 && sub.get(0) instanceof Number) { this.line = (List>) value; return; } - // 3) MultiLineString : [[[lng,lat],...], ...] if (!list.isEmpty() && list.get(0) instanceof List sub2 && sub2.get(0) instanceof List) { this.multi = (List>>) value;