그래서 d3.js, polymaps 및 Coffeescript를 사용하는 프로젝트에 대해 일부 맵 마커 클러스터링을 수행하려고합니다. d3.js의 SVG 요소를 클러스터링하면 예기치 않은 결과가 발생합니다.
저는 기본 데이터에 기초하여 상기 클러스터를 계산하고 .DATA (클러스터)로서 D3에클러스터의 위치 확인을 보인다 클러스터 배열을 전달한다. 초기 확대/축소 수준에서의 클러스터링은 괜찮은 것으로 보이고 내 지식에 기반하여 100 % 정확합니다. 확대/축소 수준을 변경하면 모든 것이 한 눈에 잘 보이지만 서클 위로 마우스를 가져 가면 설명이 현재 위치와 일치하지 않는 것처럼 보입니다. 경로가 이전 위치와 일치하지 않는 것 같습니다. 지금이다.
전체 코드가 포함 된 http://bl.ocks.org/3161013에 예제를 작성했습니다.
클러스터링과 SVG 업데이트의 두 가지 주요 실패 지점이 있습니다.
클러스터링을위한 코드는 매우 간단하며 Mark Tuupola의 코드를 기반으로하지만 php 대신 coffeescript를 사용합니다.
cluster: (elements, distance) ->
currentElements = elements.slice(0)
pixelDistance = @pixelDistance()
distLat = distance * pixelDistance.lat
distLon = distance * pixelDistance.lon
clustered = []
while currentElements.length > 0
stop = currentElements.shift()
cluster = []
cluster.push stop
i = 0
while i < currentElements.length
if Math.abs(currentElements[i].lat - stop.lat) < distLat and Math.abs(currentElements[i].lon - stop.lon) < distLon
aStop = currentElements.splice i,1
cluster.push aStop[0]
i--
i++
clustered.push cluster
clustered
SVG 업데이트 코드는 상당히 직설적 인 d3 코드처럼 보입니다. 지도가 이동하면이 업데이트 메서드가 호출됩니다. 확대/축소가 변경되거나 미리 클러스터링 된 데이터가 변경된 경우에는 다시 클러스터하고 레이아웃합니다. 그렇지 않으면 기존 포인트를 변환합니다.
내가 여기에 놓치기 쉬운 것이있을 것 같은 느낌이 들지만, 나는 아직 상당히 d3에 익숙합니다.