서비스의 주요 기능중 하나는 액티비티의 Polyline을 분석해 실제 주소로 변환하여 해당 Polyline이 지나간 시, 군, 구를 알아내 사용자에게 일종의 도전과제 처럼 지금까지 어떤 지역을 다녀왔는지 알려주는 기능이다.

이를 수행하기 위해 필요한 기능은 우선 문자열로 인코딩된 polyline을 디코딩 하여 리스트의 위도, 경도 좌표로 해석한 뒤 이 위도, 경도 좌표에 해당하는 주소를 kakao map api를 통해 얻는 것이다.

LocationMapper라는 새로운 컴포넌트를 정의한다. 일종의 서비스로직인데 LocationMapper가 담당하는 작업은 외부의 관점에서는 List<Ride>를 파라미터로 넘기면 Ride 오브젝트 polyline에 해당하는 주소를 리턴해준다.

주소는 시, 군, 구 레벨의 값만을 표시하며 각 라이드마다 중복되는 주소가 존재할 수 있기 때문에 리턴되는 주소의 값은 Set 컬렉션에 담는다.

우선 decode 메소드를 이용해 String 타입의 polyline을 디코딩하여 위도, 경도 좌표 오브젝트 LatLng으로 바꾼다. 이를 위해 구글에서 제공하는 라이브러리를 사용한다.

그 다음 LatLng 리스트로 각 좌표에 해당하는 주소를 Kakao api를 이용해 조회해야 하지만 600Km이상의 Polyline에는 약 200개 이상의 포인트가 존재하는듯하다.

Kakao api에서 일일 조회 가능 횟수를 제한하고 있기 때문에 모든 포인트를 조회할 수는 없다. 따라서 연속된 몇개의 포인트를 평균값을 구해 조회하는 방식으로 최적화 했다.

calcuratreAvg() 메소드에 List<LatLng>를 넘기면 정해진 갯수만큼의 평균 좌표를 산정하여 리턴한다.

마지막으로 평균치 까지 구한 좌표의 주소를 구하는 getLocation() 메소드에서 위의 작업을 전부 호출한다.

한 Polyline 내에서도 동일한 주소가 여러개 존재할 수 있기 때문에 리턴값은 Set이다.