본문 바로가기

TechLog

WP의 위치 서비스

Windows Phone 7의 위치 서비스는 세 가지 방식을 사용해서 현재 위치 정보를 획득한다. GPS와 기지국 셀을 기반으로 한 위치정보 서비스와 네트워크를 기반으로 한 위치 정보 서비스이다. (GPS와 구별하여 사용하기 위해, GPS 외의 두 가지 방식은 Assisted-GPS라고 한다) GPS 쪽이 정확도가 높기는 하지만 신뢰성이 낮고 소비전력이 크며, A-GPS(기지국이나 네트워크를 사용)는 정확도는 높지 않지만 빠르게 위치 정보를 얻을 수 있으며 신뢰성이 있다. 하지만 GPS와 A-GPS 중 어느 방식을 사용할지 개발자가 직접 지정할 수는 없으며, 개발자는 위치 서비스의 정확도만 옵션으로 지정할 수 있다.

위치 서비스를 사용하려면 GeoCoordinateWatcher 클래스를 사용해야 한다. 이 클래스를 사용하려면 System.Device.Location 네임스페이스를 using 지시자로 정의해 주어야 한다. 그리고 다음 태그가WMAppManifest.xml 파일에 포함되어 있어야 한다.

 

<Capability Name="ID_CAP_LOCATION" />

 

GeoCoordinateWatcher 생성자는 위치 정보의 정확성을 나타내는 GeoPositionAccuracy 열거형 타입을 인자로 받을 수 있으며, 이 열거형 타입은 Default, High 멤버를 갖고 있다. 사용자의 위치 정보가 변화하는 내역을 지속적으로 얻으려면, PositionChanged 이벤트의 핸들러 코드를 작성한 다음 Start 메서드를 호출하면 된다. 다음 코드를 살펴보자.

 

GeoCoordinateWatcher geoWatcher = new GeoCoordinateWatcher();
public MainPage()
{
    InitializeComponent();
    geoWatcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(geoWatcher_PositionChanged);
    geoWatcher.Start();
}

void geoWatcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
    System.Diagnostics.Debug.WriteLine(
        "Latitude: {0}, Longitude {1}",
        e.Position.Location.Latitude,
        e.Position.Location.Longitude);
}

 

PositionChanged 이벤트 핸들러에는 GeoCoordinate 타입의 객체가 전달되며, e.Position.Location 프로퍼티를 통해 접근할 수 있다. 이 GeoCoordinate 타입 객체는 Latitude, Longitude, Altitude, HorizontalAccuracy, VerticalAccuracy, Course, Speed, IsUnknown(경위도의 값이 숫자가 아니면 true 반환한다) 프로퍼티를 갖고 있다. 만약 프로그램이 위치 정보에 대한 접근 권한이 없으면 경위도는 Double.NaN 값을 반환한다. GeoCoordinateWatcher 클래스는 가속도계와는 달리 작업자 스레드를 사용하지 않으므로, 이벤트 핸들러에서 Dispatcher 타입을 사용한 처리를 하지 않아도 된다.

또한 GeoCoordinate 타입 객체는 GetDistanceTo 메서드를 갖고 있는데, 이 메서드를 통해 특정 위치를 나타내는 GeoCoordinate 객체간의 거리를 얻을 수 있다. System.Device.Location 네임스페이스를 살펴보면 위치 정보에 관련된 다른 클래스도 찾아볼 수 있다.