본문 바로가기

자바 심화/TIL

Open Route Service API 사용

개요

프로젝트에서 배송 거리 및 소요시간을 계산하기 위해서 Open Route Service API를 활용하기로 했다.

 

Open Route Service(ORS)

위치 기반 서비스를 제공하는 오픈 소스 경로 계획 API 플랫폼

 

주요 기능:

 

  1. 경로 계획 (Routing): 자동차, 자전거, 도보 등 다양한 이동 수단에 대한 경로 계산.
  2. 거리 매트릭스 (Distance Matrix): 여러 지점 간의 거리 및 이동 시간 계산.
  3. 지오코딩 (Geocoding): 주소를 좌표로 변환하거나 좌표를 주소로 변환.
  4. POI 검색 (Places): 특정 범위 내 관심 지점(Point of Interest) 검색.
  5. 지형 분석 (Isochrones): 특정 위치로부터 주어진 시간이나 거리에 도달할 수 있는 영역 계산.

장점:

 

  • 무료 및 오픈 소스: 상업용 대안보다 비용이 저렴하고 커스터마이징 가능.
  • REST API 지원: 다양한 프로그래밍 언어에서 쉽게 통합 가능.
  • 글로벌 커버리지: 전 세계 지도를 지원함.

 

API  사용방법

1. Open Route Service 홈페이지에 접속 및 계정 생성

 

  • Github를 사용해 회원가입을 진행했다.

2. 이메일로 계정 활성화 및 사용 동의

 

 

3. 대시보드에서 Token 발급

  • 무료 등급 토큰을 발급 받은 후 key를 복사한다.

4. Key를 사용해 Open Route Service API에 요청

 

 

실습 사용 코드

1. API 호출

private String callApi(String url, Double departureLat, Double departureLong, Double arrivalLat, Double arrivalLong) {
    String apiUrl = String.format("%s?api_key=%s&start=%f,%f&end=%f,%f", url,
            apiKey, departureLong, departureLat, arrivalLong, arrivalLat);
    ResponseEntity<String> response = restTemplate.getForEntity(apiUrl, String.class);
    return response.getBody();
}

 

2. 계산 결과 파싱

private double extractDistanceFromGeoJson(String response) {
    try {
        JSONObject jsonResponse = new JSONObject(response);
        JSONArray features = jsonResponse.getJSONArray("features");
        JSONObject properties = features.getJSONObject(0).getJSONObject("properties");
        return properties.getJSONArray("segments").getJSONObject(0).getDouble("distance");
    } catch (Exception e) {
        log.error("에러 발생: {}", e.getMessage(), e);
        return 0;
    }
}

private double extractDurationFromGeoJson(String response) {
    try {
        JSONObject jsonResponse = new JSONObject(response);
        JSONArray features = jsonResponse.getJSONArray("features");
        JSONObject properties = features.getJSONObject(0).getJSONObject("properties");
        return properties.getJSONArray("segments").getJSONObject(0).getDouble("duration");
    } catch (Exception e) {
        log.error("에러 발생: {}", e.getMessage(), e);
        return 0;
    }
}
  • JsonObject와 JsonArray를 사용해 API의 계산 결과에서 이동 거리와 소요 시간을 파싱한다.

 

3. 경로 저장

public HubRoute calculateAndSaveHubRoute(UUID departureHubUUID, UUID arrivalHubUUID) {
    HubRoute existingRoute = hubRouteRepository
            .findByDepartureHubUUIDAndArrivalHubUUIDAndIsDeletedIsFalse(departureHubUUID, arrivalHubUUID)
            .orElse(null);

    if (existingRoute != null) {
        return existingRoute;
    }

    Hub departureHub = hubRepository.findByHubUUID(departureHubUUID)
            .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_HUB, departureHubUUID.toString()));
    Hub arrivalHub = hubRepository.findByHubUUID(arrivalHubUUID)
            .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_HUB, arrivalHubUUID.toString()));

    String url = "https://api.openrouteservice.org/v2/directions/driving-car";
    String response = callApi(url, departureHub.getLatitude(), departureHub.getLongitude(),
            arrivalHub.getLatitude(), arrivalHub.getLongitude());

    double distance = extractDistanceFromGeoJson(response);
    double duration = extractDurationFromGeoJson(response);

    HubRoute hubRoute = HubRoute.create(departureHubUUID, arrivalHubUUID, (int) duration, distance);

    return hubRouteRepository.save(hubRoute);
}
  • 출발지 허브 ID, 도착지 허브 ID, 소요 시간과 거리를 DB에 저장한다.

 

정리

  • 오픈 소스 API를 통해 직접 계산하기 어려운 이동 거리와 소요 시간을 얻을 수 있어서 편했다.
  • 외부 API나 AI를 활용해서 필요한 기능이나 데이터를 구현하는 방법에 익숙해지는 것이 좋을 거 같다.

'자바 심화 > TIL' 카테고리의 다른 글

모니터링(Monitoring)  (1) 2024.12.19
프로젝트 회고  (0) 2024.12.18
프로젝트 문제 해결(역직렬화, git 에러)  (0) 2024.12.12
DDD(Domain-Driven Design)  (1) 2024.12.09
SAGA 패턴  (1) 2024.12.07