ch7 맵, 지오코딩, 그리고 위치기반 서비스
- 위치기반 서비스 이용하기
- LocationManager : 위치기반 서비스에 대한 고리를 제공
- LocationProvider : 장치의 현재 위치를 결정하는데 사용되는 서로 다른 각각의 위치검색 기술을 표현
- 테스트 공급자를 이용해 에뮬레이터 설정하기
- 에뮬레이터 위치 공금자의 위치 업데이트 하기
- 이클립스 DDMS Location Control을 사용
- Manual : 특정 위도/경도를 지정
- KML : 지점간 경로를 xml 형태로 기록하여 이동경로를 표현 (참고: http://mygeoposition.com/)
- GPX :
- 위치 공급자 선택하기
- getProvider를 호출
String providerName = LocationManager.GPS_PROVIDER;
LocationProvider gpsProvider;
gpsProvider = locationManager.getProvider(providerName);
- 이용할 수 있는 공급자 찾기
- LocationManager.GPS_PROVIDER
- LocationManager.NETWORK_PROVIDER
장치에 이용할 수 있는 공급자 리스트를 얻기 위해서는 getProviders를 호출
List<String> providers = locationManager.getProviders(True);
- 요구 기준에 기반해 공급자 찾기
- Criteria Class : 사용자의 요구사항에 적합한 위치공급자의 기준을 명시
setAccuracy(Criteria.ACCURACY_COARSE / Criteria.ACCURACY_FINE) : 정확도
setPowerRequirement(Criteria.POWER_LOW / ) :전력소비량
setAltitudeRequired(true / false) : 고도데이터 사용 유무
setBearingRequired(true / false) : 방위데이터 사용 유무 ***확인
setSpeedRequired(true / false) : 속도데이터 사용 유무
setCostAllowed(true / false) : 비용 들지 여부
- LocationManager.getBestProvider(criteria, {true|false})
요구사항에 가장 부합하는 위치공급자를 리턴.
boolean 현재 사용 가능한 공급자로 결과를 제한
- LocationManager.getProvider(criteria, {true|false})
요구사항에 부합하는 위치공급자를 리스트형태로 리턴.
- 내 위치찾기
LBS(Location Based Services)에 대한 접근은 Location Manager를 이용.
Location Manager 접근위해 getSystemService()를 이용해 LOCATION_SERVICE의 인스턴스를 요청
LocationManager locationManager;
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
use-permission을 Manifast파일에 추가
<use-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<use-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
위치정보는 getLastKnownLocation메서드에 Location Provider를 전달함으로써 찾을 수 있다.
String provider = LocationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(provider);
* getLastKnownLocation : location provider에 현재위치를 업데이트하도록 요청하지는 않음.
* 리턴받은 location객체는 위도, 경도, 방위, 고도, 속도, 위치 수정이 이뤄진 시간 등을 포함할 수 있고 get메소드를 사용해 얻을 수 있다.
- 움직임 추적
- locationManager.requestLocationUpdates(provider, 밀리초, 거리, LocationListener)
위치가 바뀔 때 마다 업데이트된 위치 정보를 얻음.
- locationManager.removeUpdates(LocationListener)
위치정보 업데이트를 중단함.
- 근접 경보 사용하기
사용자가 특정 위치로 이동하거나 그 위치에서 벗어날 때 어플리케이션이 반응하도록하는 기능.
근접 경보 발생시 intent를 생성. 보통은 broadcast intent를 생성.
발생시킬 intent를 지정하려면
Intent intent = new Intent(MY_ACTIVITY);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, -1, intent, 0);
- 지오코더 사용하기
주소와 경도/위도 맵 좌표간의 정보를 서로 변환.
Geocoder class는 두가지 지오코딩 기능을 제공
Forward Geocoding : 특정 주소의 위도와 경도를 찾는다
Reverse Geocoding : 주어진 위도와 경도에 대한 주소를 찾는다
Geocoder goecoder = new Geocoder(getApplicationContext(), Locale.getDefault());
- 역방향 지오코딩
대상 위도와 경도를 지오코더의 getFromLocation메소드에 전달,
일치하는 주소 리스트 리턴하거나 없을경우 null 리턴.
- 순방향 지오코딩
getFromLocationName메소드 호출.
List<Address> 형태의 결과 값을 리턴.
- 맵기반 액티비티 만들기
- MapView와 MapActivity소개
MapView : 실제 맵 뷰
MapActivity : 맵 뷰를 포함할 수 있는 새로운 activity를 만들기 위해 상속받아야할 class.
Overlay :맵에 주석을 다는데 사용되는 class
MapController : 맵을 제어. 중심 위치와 확대 단계를 설정.
MyLocationOverlay : 현재 위치와 장치의 방향을 표시하는데 사용
ItemizedOverlay, OverlayItem : 둘이 함께 사용되어 drawable 및 그와 연관된 텍스트를 이용해 표시되는 map marker를 만듦
- 맵기반 액티비티 만들기
MapActivity를 상속받은 새로운 액티비티 생성.
액티비티에서 보여줄 레이아웃에는 MapView 추가. (apiKey를 포함)
도로정보를 화면 출력 시 isRoutDisplayed를 재정의.
Manifast 파일
<use-library android:name="com.google.android.maps"/> 추가
<use-permission android:name="android.permission.INTERNET"/> 추가
- 맵뷰 구성하고 사용하기
mapView.setSatellite(true) : 위성 뷰
mapView.setStreetView(true) : street뷰
mapView.setTraffic(true) : 예상 교통량
map Zoom Controls 사용을 위해
View zoomControls = mapView.getZoomControls();
mapView.addView(zoomControls, MapView.LayoutParams);
mapView.displayZoomControls(true);
- 맵 컨트롤러 사용하기
MapView를 이동/확대 시.
getController를 이용해 MapView Controller 레퍼런스를 얻는다.
MapViewController mc = MapView.getController();
Location객체에 저장된 위도 경도 값을 이용하려면 GeoPoint에 백만단위로 변환한 뒤 저장
Double lat = 37.123 * 1E6;
Double lng = 123.123 * 1E6;
GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue());
MapView 중심을 다시 잡거나 확대하려면
MapController.setCenter(point); //point위치가 화면 중앙에 오도록 설정.
MapController.setZoom(1); : 1~21
새로운 위치로 이동시MapController.animateTo(point)를 이용해 부드러운 화면 이동 처리
- 오버레이 만들고 사용하기
- 새 오버레이 만들기
Overlay를 상속받는 새로운 클래스 생성.
draw메소드를 재정의해 화면에 보여질 데이터 표기.
onTap을 재정의해 사용자 클릭에 반응한다.
- 프로젝션 소개
Projection 클래스는 위도/경도 좌표와 x/y화면 픽셀 좌표간을 바꿀 수 있도록 해준다.
Projection projection = mapView.getProjection();
GeoPoint를 Point로 혹은 그 반대로 바꾸려면 fromPixel, toPixel메소드 이용
- 오버레이 추가하고 제거하기
MapView는 현재 표시되는 오버레이들의 리스트를 갖고 있다.
getOverlays를 호출해 이에 대한 레퍼런스를 얻는다
List<Overlay> overlays = mapView.getOverlays();
맵뷰에 오버레이를 추가하려면
overlays.add(새로추가할Overlay);
mapView.postInvalidate(); //맵 위의 변경사항을 업데이트
- MyLocationOverlay소개
현재 위치와 방향을 MapView위에 보여주도록 설계된 오버레이
MyLocationOverlay를 사용하려면
List<Overlay> overlays = mapView.getOverlays();
MyLocationOverlay mylocationoverlay = new MyLocationOverlay(this, mapView);
overlays.add(mylocationoverlay);
나침반과 마커 모두를 활성화 하기위해서는
mylocationoverlay.enableCompass();
mylocationoverlay.enableMyLocation(mapView.getMapController());
- ItemizedOverlay와 OverlayItem소개
MapView에 간단한 마커기능을 제공
맵에 ItemizedOverlay 마커레이어 추가하려면
ItemizedOverlay<OverlayItem>을 상속받는 클래스 만든다.
size 메소드를 재정의해 표시할 마커 수 리턴.
createItem 메소드 재정의해 각 마커의 인덱스에 기반한 새로운 OverlayItem생성.
클래스 생성자에서 populate()를 호출해 각 OverlayItem이 생성되도록 만든다.
맵에 ItemizedOverlay를 추가하려면
List<Overlay> overlays = mapView.getOverlay();
MyItemizedOverlay markers = new MyItemizedOverlay(이미지);
overlays.add(markers);
^^ : 깔끔하고 핵심적인 정리 보기 좋습니다. 지오코더를 사용한 주소값을 잘 가져오나요?