본문 바로가기

안드로이드

지도에 아이콘 추가, 오버레이

반응형

일반적으로 지구상의 현실 공간을 표현할 때는 레이어로 분리하고 각각의 레이어에는 유사한 속성을 가진 객체들을 넣어두게 된다

구글맵에서는 이런 레이어들을 오버레이라고 부른다

 

구글맵의 지도 전체가 레이어로 구성되어 있는 것은 아니다

구글맵은 지도의 가장 기본적은 정보들은 타일 모양의 이미지로 만들어 놓고 이 이미지들을 보여주게 되며,

내 위치, 카페의 위치, 경로를 표현하는 선 등을 별도의 오버레이로 정의하여 추가할 수 있도록 한다

 

 

메인액티비티에 MarkerOptions 변수 추가

    //    지도 위에 표시되는 아이콘인 마커를 사용하도록 하는 객체
//    GoolgleMap의 setMyLocationEnable 메소드를 안써도 됨
    MarkerOptions myLocationMarker;

 

 

    private void showCurrentLocation(Double latitude, Double longitude) {
        LatLng curPoint = new LatLng(latitude, longitude);
        map.animateCamera(CameraUpdateFactory.newLatLngZoom(curPoint, 15));

        showMyLocationMarker(curPoint);
    }

    private void showMyLocationMarker(LatLng curPoint) {
//        이미지와 글자들을 마커 객체에 설정
        if (myLocationMarker == null) {
            myLocationMarker = new MarkerOptions();
            myLocationMarker.position(curPoint);
            myLocationMarker.title("● 내 위치\n");
            myLocationMarker.snippet("● GPS로 확인한 위치");
            myLocationMarker.icon(BitmapDescriptorFactory.fromResource(R.drawable.mylocation));
            map.addMarker(myLocationMarker);
        } else {
            myLocationMarker.position(curPoint);
        }
    }

 

 

 

package com.example.a78_locationmap;

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.yanzhenjie.permission.Action;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.runtime.Permission;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    SupportMapFragment mapFragment;
    GoogleMap map;

    //    지도 위에 표시되는 아이콘인 마커를 사용하도록 하는 객체
//    GoolgleMap의 setMyLocationEnable 메소드를 안써도 됨
    MarkerOptions myLocationMarker;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//        xml 레이아웃에 추가했던 프래그먼트 객체 참조하고 getMapAsync 메소드 호출
        mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
//        내부적으로 지도를 다루는 GoogleMap 객체를 초기화하는데 비동기 방식으로 처리
        mapFragment.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                Log.d("Map", "지도 준비됨.");
                map = googleMap;

            }
        });

        try {
            MapsInitializer.initialize(this);
        } catch (Exception e) {
            e.printStackTrace();
        }

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startLocationService();
            }
        });


        AndPermission.with(this)
                .runtime()
                .permission(
                        Permission.ACCESS_FINE_LOCATION,
                        Permission.ACCESS_COARSE_LOCATION)
                .onGranted(new Action<List<String>>() {
                    @Override
                    public void onAction(List<String> permissions) {
                        showToast("허용된 권한 갯수 : " + permissions.size());
                    }
                })
                .onDenied(new Action<List<String>>() {
                    @Override
                    public void onAction(List<String> permissions) {
                        showToast("거부된 권한 갯수 : " + permissions.size());
                    }
                })
                .start();
    }

    public void showToast(String message) {
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }


    public void startLocationService() {
        LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        try {
            Location location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if (location != null) {
                double latitude = location.getLatitude();
                double longitude = location.getLongitude();
                String message = "최근 위치 -> Latitude : " + latitude + "\nLongitude:" + longitude;

                Log.d("Map", message);
            }

            GPSListener gpsListener = new GPSListener();
            long minTime = 10000;
            float minDistance = 0;

            manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, gpsListener);

            Toast.makeText(getApplicationContext(), "내 위치확인 요청함",
                    Toast.LENGTH_SHORT).show();

        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }

    class GPSListener implements LocationListener {
        public void onLocationChanged(Location location) {
            Double latitude = location.getLatitude();
            Double longitude = location.getLongitude();

            String message = "내 위치 -> Latitude : " + latitude + "\nLongitude:" + longitude;
            Log.d("Map", message);

            showCurrentLocation(latitude, longitude);
        }

        public void onProviderDisabled(String provider) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    }

    private void showCurrentLocation(Double latitude, Double longitude) {
//        현재 위치의 좌표로 LatLng 객체 생성
        LatLng curPoint = new LatLng(latitude, longitude);

//        지정한 위치의 지도 영역 보여주기
//        animateCamera 메소드는 지도의 Scale을 지정할 수 있으며, 1로 설정되면 가장 멀리서 보는 모습으로 보이며,
//        17이나 18 정도의 값은 도시 지역의 경우 건물 몇개를 한 눈에 볼 수 있을 정도로 확대하여 보여줌
//
//        getMaxZoomLevel 메소드를 사용하면 최대로 설정할 수 있는 축적 값을 확인할 수 있음
//        지역에 따라 다르지만 보통 19 또는 21이 최대 축적 값으로 확인됨
        map.animateCamera(CameraUpdateFactory.newLatLngZoom(curPoint, 15));

        showMyLocationMarker(curPoint);
    }

    private void showMyLocationMarker(LatLng curPoint) {
//        이미지와 글자들을 마커 객체에 설정
        if (myLocationMarker == null) {
            myLocationMarker = new MarkerOptions();
            myLocationMarker.position(curPoint);
            myLocationMarker.title("● 내 위치\n");
            myLocationMarker.snippet("● GPS로 확인한 위치");
            myLocationMarker.icon(BitmapDescriptorFactory.fromResource(R.drawable.mylocation));
            map.addMarker(myLocationMarker);
        } else {
            myLocationMarker.position(curPoint);
        }
    }

}
반응형

'안드로이드' 카테고리의 다른 글

상단 알림으로 알려주기  (0) 2021.11.10
진동과 소리로 알려주기  (0) 2021.11.10
현재 위치의 지도 보여주기  (0) 2021.11.08
GPS로 위치 확인  (0) 2021.11.08
유튜브 영상 재생  (0) 2021.11.06