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);

 

 

7장예제      kml예제