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