대량 좌표의 클러스터 처리 관련 문의드립니다

안녕하세요 :slight_smile:

대량의 정보를 가지고 마커를 찍어주었으나 비효율적이며
서버에서 연산 후, 클러스터링 한 데이터를 내려주는 방법이 효율적이라는 글을 보았습니다.

카카오에서는 많은 좌표를 가지고 중심을 잡고 클러스터를 보여주게 되어있던데
클러스터를 띄워주는 중심 좌표는 어떻게 추출하였는지 궁금합니다.

제가 가지고 있는 좌표들을 가지고 '클러스터에 텍스트표시’방법으로 구현도중 어려움이 있어 문의드리겠습니다.
감사합니다

map.setBounds() 함수를 이용하면 됩니다.
https://apis.map.kakao.com/web/documentation/#Map_setBounds

bounds는 LatLngBounds를 의미합니다.
https://apis.map.kakao.com/web/documentation/#LatLngBounds

https://apis.map.kakao.com/web/sample/keywordList/
위 예제의 displayPlaces 함수를 보시면
bounds를 어떻게 생성하고 사용하는지 참고할 수 있습니다.

답변감사합니다.

제가 질문한 것이 잘 전달이 된 것이 맞는지 확인요청 드리겠습니다


해당 글 관련확인 후 추가 적인 질문이며

대용량 데이터의 경우 클러스터에 텍스트 표시방법으로 구현 중에 있습니다

아… 네 이제 이해했습니다.
결국 카카오 지도 API에 구현된 클러스터링 방식을 질문하신 것이었군요.

클러스터링 방식은 여러가지가 있고
상황에 따라 여러가지를 섞어 쓸 수 있는 것으로 알고 있습니다.

카카오의 클러스터러가 클러스터링 하는 방식은
매우 단순한 알고리즘으로 되어 있습니다.

마커들의 배열을 받는데
마커들을 순차적으로 돌면서 클러스터를 생성합니다.

var clusters = [] // 구성된 클러스터들을 가지고 있을 배열
for marker of markers
    if marker.getPosition() 이 이미 구성된 clusters 들 중 하나의 영역에 포함되었다면 :
        (마커가 포함된 cluster).addMarker(marker)
    else clusters에 존재하는 모든 cluster에 속하지 않는다면 :
        var newCluster = new Cluster()
        newCluster.addMarker(marker)
        clusters.push(newCluster)

배열 낮은 인덱스부터 돌기 때문에
대부분 배열 앞쪽의 마커들이 클러스터링의 seed가 됩니다.
이 방식은 markers 배열을 구성하는 단계에서 가중치가 높은 marker를 앞쪽에 배치하면
좋은 클러스터링 형상을 얻을 수 있습니다.
다만 생성 시간이 n^2 일 가능성이 있으므로
이 부분에서는 효율적인 알고리즘이라고 볼 수는 없습니다.

이 모든 과정이 클라이언트 사이드에서 진행되고 있으므로
마커의 갯수가 많게 되면 클라이언트의 부하가 많아질 것이 분명합니다.
때문에 서버에서 계산하거나 혹은 미리 클러스터링 된 데이터를 받아서
클라이언트에 넘겨주면 클러스터러를 사용하지 않아도 되며
좋은 성능을 보장할 수 있습니다.

클러스터링 알고리즘은
여러가지 방식이 있으므로
직접 구현하신다면
가지고 계신 데이터 특성에 따라 효율적인 방식을 채택해 구현하시면 될 것이라 생각합니다.

혹시 이 답변도 도움이 되지 않았다면
내용을 바꿔서 다시 질문 부탁드릴게요.

네 감사합니다!
원하는 답변이였습니다~!

1개의 좋아요