Windows Phone 7上的GPS應用編程詳解

來源:互聯網
上載者:User

Windows Phone 7目前雖然沒有正式發布但是微軟對第三方的支援力度還是很到位的,在前一篇我們一起來看了WP7的開發環境的詳解,現在咱們就一起來討論一下WP7上的LBS開發。

     一般來說LBS從層級上看一般是兩層,首先是獲得地理位置的GPS引擎,在獲得位置後UI進行相應的導航提示或者渲梁地圖。

   WP7平台上的GPS引擎在WP7上可以說給我以耳目一新的感覺,已經不再需要程式員自行封裝了,微軟在這方面做的很好下面我們用代碼一起來看一下。

 private void StartLocationService(GeoPositionAccuracy accuracy)
        {
                        watcher = new GeoCoordinateWatcher(accuracy);
            watcher.MovementThreshold = 20;

                       watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(watcher_StatusChanged);
            watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);

            // Start data acquisition
            watcher.Start();
        }

上面呢就是一段初始化一個GeoCoordinateWatcher對象的代碼,首先watcher = new GeoCoordinateWatcher(accuracy);這個對象初始化的時候需要把精度傳進去,這個精度可以是GeoPositionAccuracy.High,GeoPositionAccuracy.Low,GeoPositionAccuracy.Medim雖然沒有看到真機,但是我覺得精度越高對於電池的消耗越大。

 watcher.MovementThreshold = 20;這個好理解就是取經緯度的間隔,

watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(watcher_StatusChanged);
這個是StatusChanged 的事件當GPS引擎狀態發生變化的時候會被觸發。

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

這個PositionChanged 這個事件會在位置變化的時候會被觸發。

那麼咱們來詳解一下這兩個事件

void watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
        {
            Deployment.Current.Dispatcher.BeginInvoke(() => MyStatusChanged(e));

        }

那麼為什麼在這個函數當中不用INVOKE而是用BEGININVOKE來做呢,原因很簡單INVOKE是同步函數會阻塞住使用者的UI線程換句話說如果用INVOKE來做可能造成使用者介面卡,而BeginInvoke是非同步函數會在時間片閒置時間被調用,這樣做是比較合理的。

 void MyStatusChanged(GeoPositionStatusChangedEventArgs e)
        {
            switch (e.Status)
            {
                case GeoPositionStatus.Disabled:
                                        StatusTextBlock.Text = "location is unsupported on this device";
                    break;
                case GeoPositionStatus.Initializing:
                  
                    StatusTextBlock.Text = "initializing location service," + accuracyText;
                    break;
                case GeoPositionStatus.NoData:
                                        StatusTextBlock.Text = "data unavailable," + accuracyText;
                    break;
                case GeoPositionStatus.Ready:
                   
                    StatusTextBlock.Text = "receiving data, " + accuracyText;
                    break;

            }
        }

那麼這個GeoPositionStatusChanged參數會給咱們傳遞哪個參數呢沒錯就是這個GeoPositionStatusChangedEventArgs,e.Status有這樣幾個狀態 GeoPositionStatus.Disabled,GeoPositionStatus.Initializing,GeoPositionStatus.NoData和GeoPositionStatus.Ready:那麼從名字上咱們就能看出來,Disabled是不可用也就是GPS的資訊沒有辦法收到,Initializing是引擎初始化中的狀態,NoData是沒有取得資料,而Ready是引擎狀態正常。

 void MyPositionChanged(GeoPositionChangedEventArgs<GeoCoordinate> e)
        {
                        LatitudeTextBlock.Text = e.Position.Location.Latitude.ToString("0.000");
            LongitudeTextBlock.Text = e.Position.Location.Longitude.ToString("0.000");
        }

GeoPositionChangedEventArgs這個事件傳遞的參數GeoPositionChangedEventArgs<GeoCoordinate> e,也很易用,經度就是e.Position.Location緯度就是e.Position.Location.Longitude。

記得以前在WM時代做一個GPS的引擎可是相當的麻煩,不過現在一切變得簡單了,GeoCoordinateWatcher類全部搞定,所以很期待LBS的應用在WP7上的表現,有了這麼強大的引擎估計GPS方面的應用在WP7上應該會發展很好。

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/BEYONDMA/archive/2010/10/01/5917898.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.