본문 바로가기

GIS/일반지식

[GIS 용어] 클러스터링이란 무엇인가(declutter와의 차이점)

용어부터 몇 가지 잡고 가자.

카카*맵을 켜서 판교를 보면 무슨 it단지, 무슨 it단지가 뜬다. 그걸 다시 확대하면 각 단지를 이루는 a빌딩, b빌딩이 뜰 것이고, 다시 확대하면 빌딩에 있는 스타벅*, it회사 뭐시기, 세븐일레*같은 게 뜬다. 건물만 뜨는가? 아니다. 도로명도 뜰 것이고, 공원도 뜰 것이다. 이처럼 지도에서 특정 지점이 유의미한 위치일 경우 표시되는 아이콘 혹은 텍스트를 marker 혹은 poi라고 부른다. 여기서는 마마커(marker)라고 부르겠다.

그리고 지도는 사용자가 마우스 휠을 돌리면 지도가 축적이 축소되거나 확대되는데, 이 정도를 줌(zoom)이라 부르자.

 

마커는 줌에 따라 다르게 표출되어야 한다. 그렇지 않으면, 유저는 전국 8도를 볼 정도로 줌을 줄였는데, 그 작은 공간에 온갖 상점, 도로, 건물들로 지도가 보이지않을 정도로  빼곡히 덮어버릴테니까.

따라서 줌에 따라 마커를 줄이거나 늘리는 방법이 필요한데, 다양한 것이 있지만 여기서는 cluster을 포함하여 크게 세 가지 기술을 소개하겠다. 각 기술은 구현 결과와 동작원리라는 두 가지 측면에서 다룰 수 있다.

 

declutter


마커 간에 거리에 따라 마커를 숨기거나 표출하는 기능이다.

동작 원리는 먼저 표출된 마커가 새로 표출될 마커와 최소 거리보다 가까운 경우, 둘중 하나의 표출을 숨기거나 위치를 옮기는 방식이다. (openlayers의 경우, 새로 표출될 마커의 표출을 변경한다. 추측컨데, 기존에 표출된 마커를 변경하는게 더 까다로워서 아닐까?)

단순히 최소 거리에 따라 표출을 변경하는 방식이니 표출되고 숨겨지는 마커 간에 어떤 계층 관계도 존재하지 않는다.

 

예컨대, 한국에 있는 g사의 편의점을 모두 표출하는 지도가 있다고 치자. a1~a100000까지 십만 개가 있다고 칠 때, 줌에 따라 겹치는 마커를 숨길 때, 숨겨지는 마커나 표출되는 마커나 동등한 편의점일 뿐이다. 표출되는 편의점이 특별히 다른 편의점보다 대표성을 띄지도 않고 상위의 행정 단위라 볼 수도 없다.

 

이처럼 declutter 로직은 마커 간에 계층이 존재하지 않을 때 적합하다. 그렇지 않고 만약 "포항시  맛집1"과 "포항시"라는 마커가 있을 때, 줌을 줄여서 declutter 로직으로 포항시 맛집1이 표출된다면 사용자에게 자연스러워 보이지 않을 것이다.

 

클러스터링(clustering)


gis에서 통념상 일컫는 클러스터링은 그룹화된 상위 마커를 표출하고 경우에 따라 해당 마커의 하위 마커를 표출하는 기능이다. 예를 들어 전 세계의 놀이공원을 보여주는 지도가 있다고 가정하자. 줌 레벨이 온 대륙이 보이는 세계전도 수준이라면 각 나라의 놀이공원 마커를 보여주기 어려울 것이다. 이 때 적합한 방안은 각 국가 이름만 마커로 표출한 후, 특정 국가를 클릭하면 해당 국가를 포커싱하며 하위의 놀이공원을 보여주는 방식이다. 

이처럼 클러스터링은 하위 계층 마커의 그룹을 포괄하는 대표성을 지닌 마커를 표출하는 기능, 그리고 해당 마커를 클릭하거나 포커싱 하는 등의 상호작용에 하위 계층 마커를 표출하는 기능을 일컫는다.

 

한편 gis의 타일 레이어 지도에서는 레벨에 따른 각 마커와 함께 이미지로 보내는 경우가 많다. 어떻게 보면 줌 레벨이 확대됨에 따라 특정 마커를 하위 계층의 마커로 대체하니 클러스터링의 의미를 부분적으로 가지고 있는 셈이다. 하지만, 개발 쪽에서 부르는 클러스터링은 일반적으로 이것과 구분되는데, 그건 줌 레벨에 따라 피처(feature)를 그룹화하는 로직이다.

 

이 경우에는 지도 레이어와는 별도로 각 마커를 feature라 부르는 위치 데이터를 이용해서 클라이언트 단에서 openlayers 같은 라이브러리로 직접 표출한다. 이 때, zoom level을 이벤트 트리거로 특정 수준에서 그룹화된 마커를 표출하고 사용자의 상호작용에 따라 하위 마커를 표출한다. 즉, 좁은 의미에서 클러스터링은 단순히 줌 레벨에 따라 마커와 함께 이미지를 보내는 방식과는 구분하여, 클라이언트 단에서 직접 피처 리스트로 그룹화된 마커를 생성하고 상호작용 기능을 추가하는 것을 의미한다.