轉帖|其它|編輯:郝浩|2011-02-18 13:17:37.000|閱讀 675 次
概述:Windows Phone 7目前雖然沒有正式發布但是微軟對第三方的支持力度還是很到位的,在前一篇我們一起來看了WP7的開發環境的詳解,現在咱們就一起來討論一下WP7上的LBS開發。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
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(watcher_StatusChanged);
這個是StatusChanged 的事件當GPS引擎狀態發生變化的時候會被觸發。
watcher.PositionChanged += new EventHandler>(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 e)
{
LatitudeTextBlock.Text = e.Position.Location.Latitude.ToString("0.000");
LongitudeTextBlock.Text = e.Position.Location.Longitude.ToString("0.000");
}
GeoPositionChangedEventArgs這個事件傳遞的參數GeoPositionChangedEventArgs e,也很易用,經度就是e.Position.Location緯度就是e.Position.Location.Longitude。
記得以前在WM時代做一個GPS的引擎可是相當的麻煩,不過現在一切變得簡單了,GeoCoordinateWatcher類全部搞定,所以很期待LBS的應用在WP7上的表現,有了這么強大的引擎估計GPS方面的應用在WP7上應該會發展很好。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載