轉(zhuǎn)帖|其它|編輯:郝浩|2011-02-18 13:17:37.000|閱讀 675 次
概述:Windows Phone 7目前雖然沒有正式發(fā)布但是微軟對第三方的支持力度還是很到位的,在前一篇我們一起來看了WP7的開發(fā)環(huán)境的詳解,現(xiàn)在咱們就一起來討論一下WP7上的LBS開發(fā)。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Windows Phone 7目前雖然沒有正式發(fā)布但是微軟對第三方的支持力度還是很到位的,在前一篇我們一起來看了WP7的開發(fā)環(huán)境的詳解,現(xiàn)在咱們就一起來討論一下WP7上的LBS開發(fā)。
一般來說LBS從層級上看一般是兩層,首先是獲得地理位置的GPS引擎,在獲得位置后UI進(jìn)行相應(yīng)的導(dǎo)航提示或者渲梁地圖。
WP7平臺上的GPS引擎在WP7上可以說給我以耳目一新的感覺,已經(jīng)不再需要程序員自行封裝了,微軟在這方面做的很好下面我們用代碼一起來看一下。
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);這個對象初始化的時候需要把精度傳進(jìn)去,這個精度可以是GeoPositionAccuracy.High,GeoPositionAccuracy.Low,GeoPositionAccuracy.Medim雖然沒有看到真機,但是我覺得精度越高對于電池的消耗越大。
watcher.MovementThreshold = 20;這個好理解就是取經(jīng)緯度的間隔,
watcher.StatusChanged += new EventHandler(watcher_StatusChanged);
這個是StatusChanged 的事件當(dāng)GPS引擎狀態(tài)發(fā)生變化的時候會被觸發(fā)。
watcher.PositionChanged += new EventHandler>(watcher_PositionChanged);
這個PositionChanged 這個事件會在位置變化的時候會被觸發(fā)。
那么咱們來詳解一下這兩個事件
void watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
{
Deployment.Current.Dispatcher.BeginInvoke(() => MyStatusChanged(e));
}
那么為什么在這個函數(shù)當(dāng)中不用INVOKE而是用BEGININVOKE來做呢,原因很簡單INVOKE是同步函數(shù)會阻塞住用戶的UI線程換句話說如果用INVOKE來做可能造成用戶界面卡,而BeginInvoke是異步的函數(shù)會在時間片空閑的時間被調(diào)用,這樣做是比較合理的。
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參數(shù)會給咱們傳遞哪個參數(shù)呢沒錯就是這個GeoPositionStatusChangedEventArgs,e.Status有這樣幾個狀態(tài) GeoPositionStatus.Disabled,GeoPositionStatus.Initializing,GeoPositionStatus.NoData和GeoPositionStatus.Ready:那么從名字上咱們就能看出來,Disabled是不可用也就是GPS的信息沒有辦法收到,Initializing是引擎初始化中的狀態(tài),NoData是沒有取得數(shù)據(jù),而Ready是引擎狀態(tài)正常。
void MyPositionChanged(GeoPositionChangedEventArgs e)
{
LatitudeTextBlock.Text = e.Position.Location.Latitude.ToString("0.000");
LongitudeTextBlock.Text = e.Position.Location.Longitude.ToString("0.000");
}
GeoPositionChangedEventArgs這個事件傳遞的參數(shù)GeoPositionChangedEventArgs e,也很易用,經(jīng)度就是e.Position.Location緯度就是e.Position.Location.Longitude。
記得以前在WM時代做一個GPS的引擎可是相當(dāng)?shù)穆闊贿^現(xiàn)在一切變得簡單了,GeoCoordinateWatcher類全部搞定,所以很期待LBS的應(yīng)用在WP7上的表現(xiàn),有了這么強大的引擎估計GPS方面的應(yīng)用在WP7上應(yīng)該會發(fā)展很好。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載