728x90

 포스팅을 안보셨다면 먼저 보시는 것을 추천드립니다.

 

안드로이드 스튜디오 구글 맵 마커 묶어보여주기(클러스터 사용하기)

전 포스팅을 안보셨다면 먼저 보시는 것을 추천드립니다. 안드로이드 스튜디오 구글 맵에 마커 넣기 전 포스팅을 안보셨다면 먼저 보시는 것을 추천드립니다. 안드로이드 스튜디오 주소명으로 위도/경도 값 구하기..

1d1cblog.tistory.com

전 포스팅과는 좀 다르게 Loading Activity와 MainActivity를 나눠 구성하였습니다.

 

Loading Activity는 2개의 ArrayList를 MainActivity로 넘기고 있습니다.

- ArrayList<Clinic> clinics : 선별진료소 xml을 파싱하여 병원 정보를 가지고 있는 Clinic 객체 ArrayList

- ArrayList<Location> clinic_address : 파싱한 데이터에서 주소값만 불러와 위도,경도의 값을 가지는 Location 객체만 따로 가지는 Location ArrayList

public class LoadingActivity extends AppCompatActivity {
    final String TAG = "LoadingActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_loading);

        ArrayList<Clinic> clinics = xml_parse();
        ArrayList<Location> clinic_address = new ArrayList<Location>();
        for(int i = 0 ; i < clinics.size(); i++) {
            Log.d(TAG, "convert");
            clinic_address.add(addrToPoint(this, clinics.get(i).getAddress()));
        } // 병원 주소만 위도경보로 변환하여 모아놓음
        Intent intent = new Intent(LoadingActivity.this, MainActivity.class);
        intent.putExtra("clinic", clinics);
        intent.putExtra("clinic_addr", clinic_address);
        startActivity(intent);
    }

    private ArrayList<Clinic> xml_parse() {
        ...
    }
    public static Location addrToPoint(Context context, String addr) {
        ...
    }
}

다음으로 MainActivity입니다. 

 

클러스터를 사용중이라 확대, 축소 시에만 마커가 다시 로딩됩니다.

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
    private GoogleMap mgoogleMap;
    private ClusterManager<MyItem> clusterManager;
    ArrayList<Clinic> clinics;
    ArrayList<Location> clinic_address;
    Context context = this;
    final String TAG = "LogMainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        clinics = (ArrayList<Clinic>)getIntent().getSerializableExtra("clinic");
        clinic_address = (ArrayList<Location>)getIntent().getSerializableExtra("clinic_addr");
        SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        supportMapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(final GoogleMap googleMap) {
        mgoogleMap = googleMap;
        clusterManager = new ClusterManager<>(this,mgoogleMap);

        mgoogleMap.setOnCameraIdleListener(clusterManager);
        mgoogleMap.setOnMarkerClickListener(clusterManager);

        mgoogleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
            @Override
            public void onMapLoaded() {
                Log.d(TAG, "Load");
                LatLng latLng = new LatLng(37.5318247,126.8368475);
                CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15);
                mgoogleMap.moveCamera(cameraUpdate);
            } // 처음 구글맵이 로딩되면 서울시청으로 화면을 고정
        });
        mgoogleMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
            @Override
            public void onCameraMove() {
                VisibleRegion vr = mgoogleMap.getProjection().getVisibleRegion();
                double left = vr.latLngBounds.southwest.longitude;
                double top = vr.latLngBounds.northeast.latitude;
                double right = vr.latLngBounds.northeast.longitude;
                double bottom = vr.latLngBounds.southwest.latitude;
                Log.d(TAG, "left = " + String.valueOf(left) +
                                    "top = " + String.valueOf(top) +
                                    "right = " + String.valueOf(right) +
                                    "bottom = " + String.valueOf(bottom) + "\n");
                if(clusterManager != null) clusterManager.clearItems();
                findMarker(left, top, right, bottom);
            } // 카메라 시점 이동
        });
    } // 구글맵 사용
    public void findMarker(double left, double top, double right, double bottom) {
        for(int i = 0; i < clinic_address.size(); i++) {
            if(clinic_address.get(i).getLongitude() >= left && clinic_address.get(i).getLongitude() <= right) {
                if(clinic_address.get(i).getLatitude() >=bottom && clinic_address.get(i).getLatitude() <= top) {
                    Location location = clinic_address.get(i);
                    MyItem clinicItem = new MyItem(location.getLatitude(), location.getLongitude(),
                                clinics.get(i).getName());
                    clusterManager.addItem(clinicItem);
                }
            }
        }
    } // 경도와 위도 범위 안에 있는 주소정보를 찾아 마커를 추가
}

자료출처 : https://stackoverflow.com/questions/13739075/how-to-get-latitude-longitude-span-in-google-map-v2-for-android

 

How to get Latitude/Longitude span in Google Map V2 for Android

I have a task for move my app to Google Maps Android APIs V2. Now, I need to get Latitude/Longitude span. I used MapView.getLatitudeSpan() and MapView.getLongitudeSpan() in previous version APIs. N...

stackoverflow.com

 

728x90

+ Recent posts