2014-01-21 3 views
3

Google Map Android clustering Utitlity Google지도 v2 재생 서비스를 사용 중입니다.확대시 축소 및 비 클러스터링시지도 마커 클러스터링

예상 한 동작이 나타나지 않습니다. 아래의 두 이미지에서 볼 수 있듯이 줌인하면 20 개의 클러스터와 왼쪽의 단일 마커를 볼 수 있습니다. 그러나 그 둘이 서로 겹치지 않을 때 클러스터를 볼 수 없습니다. 20 클러스터는 여전히 21이 아니라 20을 말하고 있습니까?

enter image description here

enter image description here

은 예상 된 동작인가요? (21) 대신 클러스터 쇼를 만들 수있는 방법이 있습니까 20 +

답변

11

DefaultClasterRenderer#onBeforeClusterRendered()에 지정된 기본 동작입니다 : 마커에 대한 텍스트가 bucket보다는 정확한 수에 따라 선택

/** 
* Called before the marker for a Cluster is added to the map. 
* The default implementation draws a circle with a rough count of the number of items. 
*/ 
protected void onBeforeClusterRendered(Cluster<T> cluster, MarkerOptions markerOptions) { 
    int bucket = getBucket(cluster); 
    BitmapDescriptor descriptor = mIcons.get(bucket); 
    if (descriptor == null) { 
     mColoredCircleBackground.getPaint().setColor(getColor(bucket)); 
     descriptor = BitmapDescriptorFactory.fromBitmap(mIconGenerator.makeIcon(getClusterText(bucket))); 
     mIcons.put(bucket, descriptor); 
    } 
    // TODO: consider adding anchor(.5, .5) (Individual markers will overlap more often) 
    markerOptions.icon(descriptor); 
} 

cluster

항목의 대한 빠른 수정으로 설명 생성을 수정하는 것입니다 뭔가 같은 :

descriptor = BitmapDescriptorFactory.fromBitmap(mIconGenerator. 
               makeIcon(cluster.getSize()); 

물론 ClasterRenderer 사용자 정의를 구현하고 ClusterManager에 제공 할 수 있습니다. 이런 식으로 당신은 당신의 마커의 렌더링을 담당 할 것입니다,하지만 당신은 단지 "20+""21"에을 변경하려면 - 내가 먼저 접근 방식으로 갈 것

편집 :

이 질문에 의견 요청 된 주소 : 그룹화 항목의 거리 임계 값을 늘리거나 줄이려면 default algorithm을 클러스터링에 사용하도록 수정할 수 있습니다.

public static final int MAX_DISTANCE_AT_ZOOM = 100; // essentially 100 dp. 

을하지만 올바른 수정 계정 마커 비트 맵의 ​​크기가 아니라 상수 값을 고려하는 것입니다 : 그냥 (귀하의 경우 작아야한다)이 일정하게 재생합니다. 나는 Mr. Broadfood 매니아에 숙제 :

private Bounds createBoundsFromSpan(Point p, double span) { 
    // TODO: Use a span that takes into account the visual size of the marker, not just its 
    // LatLng. 
    double halfSpan = span/2; 
    return new Bounds(
      p.x - halfSpan, p.x + halfSpan, 
      p.y - halfSpan, p.y + halfSpan); 
} 
+0

빠른 파문 질문이 유틸리티를 사용 해보신 경험이있는 분. 나는 현재 줌 레벨에서 서로 꼭대기에 있지 않은 그룹화 마커를 발견했다. 이 유틸리티에 대한 문서는 거의없는 것 같습니다. 그룹/클러스터 전에 얼마나 가까운 마커의 범위를 설정할 수 있습니다 – erik

+0

내 대답이 업데이트 –

+0

다시 감사드립니다. 파벨, Cluster/ClusterItem (s) 선택 상태 생성 및 처리 경험이 있습니까? 렌더는 보이는 아이콘을 생성하고, 주어진 항목이나 클러스터가 선택 될 때 뷰를 변경하고 다이나믹 이미지를 해당 뷰로 전달할 수 있고 모든 선택되지 않은 항목을 선택 취소/원래 상태로 되돌릴 수 있기를 원합니다. .. 나는 도서관을 들여다 보았고 선택/비 선택 상태가 어디인지를 알 수없는 것 같습니다. – erik

1

나는이 오래된 질문 실현,하지만 여전히 파벨의 훌륭한 대답을 사용하는 사람들을 위해, 또한 코드의 두 라인을 변경할 수 있는지 확인하는 것이 왼쪽 맡기

그래서 같은
BitmapDescriptor descriptor = mIcons.get(cluster.getSize()); 
... 
mIcons.put(bucket, descriptor); 

교체 버킷 :

그렇지
BitmapDescriptor descriptor = mIcons.get(cluster.getSize()); 
... 
mIcons.put(cluster.getSize(), descriptor); 

병합 할 때 클러스터가 분리 inaccur 결과/가까운 버킷 크기로 반올림 될 버킷 크기를 먹었다.

데이터의 정확한 값에주의를 기울이지 않는다면 분명한 해결 방법이 있지만 매우 쉽게 놓칠 수 있습니다.어려움을 겪고있는 사람들을위한

:

구글의 렌더링 알고리즘을 유지하는 것은 (정답에 연결로), 기본 렌더러를 다운로드 코드를 수정하고 대한 사용자 정의 렌더러로 설정하는 동안 파벨의 답변을 구현하는 가장 간단한 방법 귀하의 ClusterManager. 라이브러리는 외부 수정/덮어 쓰기에 익숙하지 않으며이 세그먼트를 덮어 쓰는 것만 큼 커다란 고통을 겪습니다. 다른 많은 개인적인 메서드와 변수를 사용하기 때문입니다.

1

최소 클러스터 크기를 변경할 수 있습니다. 기본적으로 최소 클러스터 크기는 다음과 같이 map-utils 라이브러리에 정의되어 있습니다.

/** 
    * If cluster size is less than this size, display individual markers. 
    */ 
    private int mMinClusterSize = 4; 

    /** 
    * Determine whether the cluster should be rendered as individual markers or a cluster. 
    */ 
    protected boolean shouldRenderAsCluster(Cluster<T> cluster) { 
     return cluster.getSize() > mMinClusterSize; 
    } 

또는 당신은 다음과 같이 확장 된 DefaultClusterRenderer 클래스에 shouldRenderAsCluster 방법을 재정의 할 수 있습니다 : 다음과 같이 사용자 정의 렌더러에 .. 를 동일한 작업을 수행하기 위해 고군분투 사람을

@Override 
protected boolean shouldRenderAsCluster(Cluster cluster) { 
    // Always render clusters. 
    return cluster.getSize() > 1; 
} 
0

가 오버라이드 (override)에게이 두 가지 기능을 @Override protected int getBucket (클러스터 클러스터) { return cluster.getSize(); }

@Override 
protected String getClusterText(int bucket) { 
    return String.valueOf(bucket); 
} 
관련 문제