관리 메뉴

새로운 시작, GuyV's lIfe sTyle.

윈폰7 GPS 에뮬레이터 예제 본문

ⓦindows Phone 7/Development

윈폰7 GPS 에뮬레이터 예제

가이브 2011. 3. 2. 18:43

몇 달 전에 MS에서 윈폰 에뮬레이터용 GPS 에뮬레이터를 Windows Phone Recipe 로 내놓았습니다. 

GPS의 값을 가져오는 클래스인 System.Device.Location.GeoCoordinateWatcher 를 그대로 시뮬레이션 하여 사용할 수 있게 하는 라이브러리인데, 사용해보시면 꽤 쿨~ 한 것을 알 수 있을겁니다.

소스 자료와 설명 등 자세한 자료는 원문 포스팅을 참고해주시구요.

간단하게 이 에뮬레이터로 Google 맵 서비스 중 Static 맵을 이용해 3초마다 현 위치를 뿌려주는 샘플을 만들어보겠습니다.


dll 파일은 윈폰 라이브러리로 등록하시면 되구요. zip파일은 GPS 에뮬레이터라고 보시면 됩니다.
다시 말씀드리지만 소스 자료는 위의 링크에서 받으실 수 있습니다.

먼저 GPS 에뮬의 압축을 풀어서 실행을 해봅시다. GpsEmulator.exe 입니다.
wpf 어플이구요. WCF 서비스로 이 에뮬레이터에서 gps 좌표값을 제공합니다. 빙맵으로 화면을 이쁘게 꾸며놨네요.


첫 실행화면입니다. 대충 위치는 MS본사 같네요. -_-
여튼 여기서 맵에서 더블클릭을 해서 여기저기 라우트 포인트를 찍습니다.


그럼 이렇게 점이 찍혀 연결되고 좌측 라우트 리스트에 추가됩니다.


그리고 좌측 하단에 "Start"버튼을 누르면 상단 그림처럼 선을 따라 이동하면서 현재 화살표 위치의 위/경도 좌표를 뿌려줍니다.

이 좌표 자료를 윈폰 에뮬에서 받으면 됩니다.


이제 윈폰 개발툴을 실행시켜서 새 프로젝트를 만듭니다.
그리고 앞서 받은 GpsEmulatorClient.dll 파일을 참조 추가해줍니다.

윈폰의 디자인은 간단하게 Image 컨트롤 하나를 추가합니다. 기본 Grid에 대충 꽉 채우도록 하죠.



Image 컨트롤 이름은 위 그림처럼 staticMap 이라고 했습니다.

이제 바로 code 로 들어갑니다. (MainPage.xaml.cs)

말씀드렸듯이, 참조 추가한 라이브러리는 기존 실제 장치용이랑 클래스,메서드,속성명 모두 100% 똑같습니다. GpsEmulatorClient 네임스페이스의 GeoCoordinateWatcher 클래스로 사용해야 됩니다. :)

코드에서 네임스페이스 참조를 먼저 해주시구요.

using System.Windows.Media.Imaging;
using System.Windows.Threading;


맵이미지를 계속 로딩할 수는 없으니, 데이터 변경이 있을 때 DispatherTimer를 이용해 3초마다 이미지를 로드해올겁니다. 해외서버라 맵이미지 다운로드 속도도 좀 걸릴 것 같네요.

그리고 클래스 멤버 변수로 '3초마다'에 관련된 변수를 선언합니다.

public partial class MainPage : PhoneApplicationPage
{
short ticks = 0;
short nowTicks = 0;
...

MainPage 생성자에서 로딩 때 해야될 것을 하도록 하죠.

DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(3);
timer.Tick += new EventHandler((s, e) =>
  {
    ticks++;
  });
timer.Start();

GpsEmulatorClient.GeoCoordinateWatcher watcher = new GpsEmulatorClient.GeoCoordinateWatcher();
watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>
     (watcher_PositionChanged);
watcher.Start();

3초마다 타이머가 ticks를 올릴겁니다. 좌표값이 변화가 있을 때 이 값에 따라 맵 자료를 불러올겁니다. 그리고 GPS는 watcher 라는 이름으로 Positionchanged 이벤트를 만들고 켜도록 하죠.

다음은 watcher 이벤트입니다.


void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
        {
            if (nowTicks == 0) nowTicks = ticks;           

            ApplicationTitle.Text = string.Format("{0:#.####} / {1:#.####}",
                e.Position.Location.Latitude,
                e.Position.Location.Longitude);

            if (!nowTicks.Equals(0))
            {
                staticMap.Source = new BitmapImage(new Uri(
                    string.Format("http://maps.google.com/maps/api/staticmap?center={0},{1}&zoom=12&size={2}x{3}&sensor=false",
                    e.Position.Location.Latitude,
                    e.Position.Location.Longitude,
                    staticMap.Width,
                    staticMap.Height), UriKind.Absolute
                    ));
                nowTicks = ticks = 0;
            }




http://maps.google.com/maps/api/staticmap?center={0},{1}&zoom=12&size={2}x{3}&sensor=false

이 주소가 해당 위도,경도 위치 이미지를 width, height 크기로 가져오는 구글 정적 맵입니다.
GPS 에뮬레이터에서 주는 값을 받고 있으니 그대로 넣어주면 되겠죠.

보셨다시피 이 GPS 에뮬레이터를 이용하면 실제 폰에 GPS가 달려서 작동하듯 테스트를 할 수 있습니다. 꽤 유용한 것 같습니다. 배포시에는 생성자만 바꾸어주면 되겠네요. ^^


간단한 예제이지만 시작하시는데는 별 문제 없으실 듯 싶습니다.
혹시 wpf 에뮬이 잘 안돌아가시면 빙맵 apikey 를 받으셔야 할 수도 있습니다.
(Live ID가 회원가입(로그인)이 필요하며 쉽습니다. http://www.bingmapsportal.com/)

다음 그림처럼 API 메뉴에서 키를 등록하세요.



그럼~ 즐프하세요.



반응형
Comments