안드로이드 구글맵 v2 클러스터 예제를 만들어 보았습니다.

zoomlevel을 내렸을 경우에는 해당 인근의 데이터는 모아서 숫자로 보여주며

올렸을 경우에는 원래 데이터가 있던 위치에 표시되는 지도를 확인 할수 있습니다.


실행 화면

  (Zoom level down)


Java 코드 작업

1. 클러스터 라이브러리를 사용하기 위한 작업을 Gradle에서 추가합니다.

dependencies {
    /* 중략 */
    compile 'com.google.android.gms:play-services-maps:10.2.1'
    compile 'com.google.android.gms:play-services-location:10.2.1'
    compile 'com.google.maps.android:android-maps-utils:0.5'
}


2. ClusterItem 인터페이스 클래스를 작성해줍니다.

import com.google.android.gms.maps.model.LatLng;
import com.google.maps.android.clustering.ClusterItem;

public class PositionItem implements ClusterItem {

    private final LatLng mPosition;
    public int bg;

    public PositionItem(double lat, double lng, int bg) {
        mPosition = new LatLng(lat, lng);
        this.bg = bg;
    }

    @Override
    public LatLng getPosition() {
        return mPosition;
    }

    @Override
    public String getTitle() {
        return null;
    }

    @Override
    public String getSnippet() {
        return null;
    }
}<


3. 맵 호출 부분 작성.

mMap.getMapAsync(new OnMapReadyCallback() {
	@Override
	public void onMapReady(final GoogleMap googleMap) {
		if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
			boolean permission = mParentsAct.hasAllPermissionsGranted();
			if (!permission) {
				return;
			}
		}
		try {
			MapsInitializer.initialize(getActivity());
		} catch (Exception e) {
		}

		googleMap.getUiSettings().setMyLocationButtonEnabled(true);
		googleMap.getUiSettings().setZoomControlsEnabled(true);
		googleMap.setMyLocationEnabled(true);

		setCluster(googleMap);
	}
});


4. setCluster() 메소드 작성.

private void setCluster(final GoogleMap googleMap) {
	final List<PositionItem> mPosi = /* 좌표정보 데이터 리스트 */;
	if(mPosi != null) {
		if (mPosi.size() > 0) {
			mClusterManager = new ClusterManager<PositionItem>(getActivity(), googleMap);
			googleMap.setOnCameraIdleListener(mClusterManager);
			googleMap.setOnMarkerClickListener(mClusterManager);
			
			LatLngBounds.Builder builder = LatLngBounds.builder();	// Bounds 모든 데이터를 맵 안으로 보여주게 하기 위한
			LatLngBounds bounds = addItems(builder, mPosi);         // 클러스터 Marker 추가
			googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, ZoomLevel));
			float zoom = googleMap.getCameraPosition().zoom - 0.5f;
			googleMap.animateCamera(CameraUpdateFactory.zoomTo(zoom));

			mClusterManager.setRenderer(new OwnIconRendered(mAppData, googleMap, mClusterManager));

			// 내용 클릭시
			googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
				@Override
				public void onInfoWindowClick(Marker marker) {
				}
			});

			// 클러스터 클릭시 펼치기
			mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<PositionItem>() {
				@Override
				public boolean onClusterClick(Cluster<PositionItem> cluster) {
					LatLngBounds.Builder builder_c = LatLngBounds.builder();
					for (ClusterItem item : cluster.getItems()) {
						builder_c.include(item.getPosition());
					}
					LatLngBounds bounds_c = builder_c.build();
					googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds_c, ZoomLevel));
					float zoom = googleMap.getCameraPosition().zoom - 0.5f;
					googleMap.animateCamera(CameraUpdateFactory.zoomTo(zoom));
					return true;
				}
			});
		}
	}
}

// 마커 추가
private void addItems(List<PositionItem> mPosi) {
	for (PositionItem item : mPosi) {
		mClusterManager.addItem(item);
	}
}

// 마커 커스텀 class
class CustomIconRenderer extends DefaultClusterRenderer<PositionItem> {
	public CustomIconRenderer(Context context, GoogleMap map, ClusterManager<PositionItem> clusterManager) {
		super(context, map, clusterManager);
	}

	@Override
	protected void onBeforeClusterItemRendered(PositionItem item, MarkerOptions markerOptions) {
		int id = R.drawable.rect_memo1;
		if(item.bg == 1) {					// drawable 변경
		} else if (item.bg == 2) {
		} else if (item.bg == 3) {
		} else if (item.bg == 4) {
		}
		Drawable d = ContextCompat.getDrawable(getActivity(), id);
		BitmapDescriptor markerIcon = getMarkerIconFromDrawable(d);

		markerOptions.icon(markerIcon);
		markerOptions.snippet(item.getSnippet());
		markerOptions.title(item.getTitle());
		super.onBeforeClusterItemRendered(item, markerOptions);
	}
}


+ Recent posts