에몽이

구글 마커 클러스터링 본문

android

구글 마커 클러스터링

ian_hodge 2016. 12. 24. 15:17

지도에 많은 마커를 찍어야 하는 경우가 있는데, 무작정 마커를 찍다보면 
사용자가 보기 불편한 뷰가 나올 수 있습니다.

출처 : https://developers.google.com/maps/articles/toomanymarkers

이를 해결하기 위해 클러스터링 기법을 사용합니다. 특정한 기준(보통 가까운 거리)에 따라 마커들을 하나의 무리(cluster)로 만들어 주는 것이죠.

출처 : https://developers.google.com/maps/articles/toomanymarkers

안드로이드에서 지도를 사용할 때 흔히 구글맵, 다음지도를 많이 사용하지만, 클러스터링 기능은 현재 구글맵에서만 가능합니다. (다음지도는 웹만 지원합니다.)


먼저 새로운 안드로이드 프로젝트를 생성하고, 기본 액티비티로 MapActivity를 선택하였습니다. 주제가 클러스터링이니 구글맵에 관련한 코드나 Key등록 방법 등은 건너 뜁니다. (Github)


Google Maps Android API 유틸리티 라이브러리 추가하기

클러스터링 기능은 구글맵 기본 내장 기능이 아닙니다. 구글에서 제공하는 유틸리티 라이브러리를 추가해서 사용해야 합니다.

app gradle에 dependencies를 추가합니다.

28번 줄 추가

Gradle Sync를 하면 라이브러리가 설치됩니다.


지도에 띄울 마커 클래스 설계

클러스터링을 구현하기에 앞서 마커가 뿌려줄 데이터를 담고 있는 모델 클래스가 필요합니다. 이번 예제에서는 간단하게 집(House)을 모델로 해보겠습니다.

House 모델 클래스

House는 위치좌표(location)와 주소(address) 두 가지의 속성을 가지고있는 간단한 클래스입니다.

이제 House 클래스의 Object 하나가 지도 위 클러스터에 포함되는 하나의 아이템이 될텐데, 그럴려면 ClusterItem 인터페이스를 구현해야합니다.

ClusterItem 인터페이스를 구현했다.

getPosition 메서드를 오버라이딩해서 지도 위에 찍힐 마커로서 위치해야 할 곳의 좌표값을 리턴해줍니다. House 클래스는 자신의 위치 좌표를 속성으로 갖고있었으니 그대로 리턴합니다.


참고로 Realm과 사용할 경우 RealmObject를 상속하게되면 맘대로 커스텀이안되서 ClusterItem을 구현하지 못하는데, 그냥 ClusterItem용 클래스를 하나 더 만들어서 해결했습니다. Best Practice는 아직 잘 모르겠습니다. 아시는 분은 공유해주세요 ㅠㅠ


ClusterManager

클러스터링을 할 때는 구글맵에 직접 마커를 찍지 않습니다. 그 대신ClusterManager에 House와 같은 Cluster Item Object를 추가하면 알아서 마 커를 찍어주고 클러스터링까지 해줍니다.

그리고 한 가지 중요한 점은 Map의 OnCameraChangeListener로 ClusterManager를 지정해줘야 클러스터링이 실행됩니다.
ClusterManager가 내부에서 리스너를 구현해놨기때문에 그냥 넣기만 하면 됩니다.

43 ~ 51줄 보세요

47~51번 줄은 임의의 마커 10개를 ClusterManager에 추가한 것입니다.

실행 화면

Algorithm과 Renderer

클러스터링 기능은 알고리즘렌더러 이렇게 두 가지로 나눠져있습니다.

알고리즘은 클러스터를 특정 위치에 생성하고 마커를 클러스터에 적절히 넣어주는 역할을 합니다.

렌더러는 클러스터를 이쁘게 출력해주는 역할을 합니다.

알고리즘과 렌더러는 ClusterManager의 setAlgorithm과 setRenderer 메서드로 커스텀 클래스를 등록할 수 있으며 등록하지 않은 경우에는 유틸리티 라이브러리를 설치할 때 딸려온 DefaultClusterRenderer와 NonHierarchicalDistanceBasedAlgorithm을 기본으로 사용합니다.

DefaultClusterRenderer는 위 실행화면에서 보았듯이 파란색 원에 마커 개수를 표시하는 형태로 출력해줍니다.(코드)

NonHierarchicalDistanceBasedAlgorithm은 이름 그대로 거리 기반으로 대충 가운데 위치에 클러스터를 만들어 줍니다. (코드)

이 두 놈을 그냥 사용하여도 상관은없지만 커스텀해서 사용하면 만족도가 20배 쯤은 높아집니다.


출처:https://medium.com/flearning-edu/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B5%AC%EA%B8%80%EB%A7%B5-%EB%A7%88%EC%BB%A4-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81-%ED%95%B4%EB%B3%B4%EA%B8%B0-part-1-514bbd351378#.wlq0q03v6


Comments