개요
프로젝트에서 배송 거리 및 소요시간을 계산하기 위해서 Open Route Service API를 활용하기로 했다.
Open Route Service(ORS)
위치 기반 서비스를 제공하는 오픈 소스 경로 계획 API 플랫폼
주요 기능:
- 경로 계획 (Routing): 자동차, 자전거, 도보 등 다양한 이동 수단에 대한 경로 계산.
- 거리 매트릭스 (Distance Matrix): 여러 지점 간의 거리 및 이동 시간 계산.
- 지오코딩 (Geocoding): 주소를 좌표로 변환하거나 좌표를 주소로 변환.
- POI 검색 (Places): 특정 범위 내 관심 지점(Point of Interest) 검색.
- 지형 분석 (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();
}
- opnerouteservice api 주소 "https://api.openrouteservice.org/v2/directions/driving-car"로 api key, 출발지 위경도, 도착지 위경도를 보낸다.
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 |