介于网上很少关于windows phone 8版本的gps定位功能概述!~小弟这会给你奉献上代码!!!哈哈哈!!!直接看代码吧!!
public partial class MainPage : PhoneApplicationPage
{
Geolocator geolocator = null;
bool tracking = false;
// 构造函数
public MainPage()
{
InitializeComponent();
// 将 listbox 控件的数据上下文设置为示例数据
DataContext = App.ViewModel;
//ServerDataSource ddddd = new ServerDataSource();
//ddddd.TestRequest();
TrackLocation();
}
private void TrackLocation()
{
if (!tracking)
{
geolocator = new Geolocator();
geolocator.DesiredAccuracy = PositionAccuracy.High;
geolocator.MovementThreshold = 100;
geolocator.StatusChanged += geolocator_StatusChanged;
geolocator.PositionChanged += geolocator_PositionChanged;
tracking = true;
//TrackLocationButton.Content = "停止跟踪位置变化";
}
else
{
geolocator.PositionChanged -= geolocator_PositionChanged;
geolocator.StatusChanged -= geolocator_StatusChanged;
geolocator = null;
tracking = false;
//TrackLocationButton.Content = "开始跟踪位置变化";
this.TxtGeolocator.Text = "已停止";
}
}
// 位置变化事件处理
void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
// 只有当程序在前台运行时才更新界面数据
if (App.InBackground == false)
{
Dispatcher.BeginInvoke(() =>
{
//String latitude = args.Position.Coordinate.Latitude.ToString("0.00000000");
//String longitude = args.Position.Coordinate.Longitude.ToString("0.00000000");
double latitude = args.Position.Coordinate.Latitude;
double longitude = args.Position.Coordinate.Longitude;
LocationUtil.GetCityNameOnMap(latitude, longitude, TxtGeolocator);
//BingMapsTask taskBingMap = new BingMapsTask();
});
}
}
// 状态变化事件处理
void geolocator_StatusChanged(Geolocator sender, StatusChangedEventArgs args)
{
string status = "";
switch (args.Status)
{
case PositionStatus.Disabled:
status = "位置服务已被禁止";
break;
case PositionStatus.Initializing:
status = "正在初始化";
break;
case PositionStatus.NoData:
status = "没有数据";
break;
case PositionStatus.Ready:
status = "准备中";
break;
case PositionStatus.NotAvailable:
status = "不可用";
break;
case PositionStatus.NotInitialized:
status = "未进行初始化";
break;
}
Dispatcher.BeginInvoke(() =>
{
TxtGeolocator.Text = status;
});
}
}
以下是LocationUtil类,借助我大诺基亚api实现传入经纬度获取城市信息!!见代码:
public class LocationUtil
{
private static TextBlock TxtGeolocator = null;
/// <summary>
/// URL接口来自诺基亚地图
/// </summary>
/// <param name="slatitude"></param>
/// <param name="slongitude"></param>
/// <returns>xml格式</returns>
public static void GetCityNameOnMap(double slatitude, double slongitude, TextBlock txtCity)
{
TxtGeolocator = txtCity;
String cityname = String.Empty;
string urlString = "http://loc.desktop.maps.svc.ovi.com/geocoder/rgc/1.0?" + "lat=" + slatitude + "&long=" + slongitude + "&output=xml";
httpGet(urlString);
}
public static void httpGet(String url)
{
try
{
//请求地址
//String url = "http://www.cnblogs.com/huizhang212/";
//创建WebRequest类
HttpWebRequest request = HttpWebRequest.CreateHttp(new Uri(url));
request.Headers["Accept-Language"] = "zh-CN,zh;q=0.8";
//设置请求方式GET POST
request.Method = "GET";
//返回应答请求异步操作的状态
request.BeginGetResponse(responseCallback, request);
}
catch (WebException e)
{
//网络相关异常处理
}
catch (Exception e)
{
//异常处理
}
}
private static void responseCallback(IAsyncResult result)
{
try
{
//获取异步操作返回的的信息
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
//结束对 Internet 资源的异步请求
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
//解析应答头
//parseRecvHeader(response.Headers);
//获取请求体信息长度
long contentLength = response.ContentLength;
//获取应答码
int statusCode = (int)response.StatusCode;
string statusText = response.StatusDescription;
//应答头信息验证
using (Stream stream = response.GetResponseStream())
{
//获取请求信息
StreamReader read = new StreamReader(stream);
string msg = read.ReadToEnd();
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
TxtGeolocator.Text = GetCityNameFromXml(msg);
});
}
}
catch (WebException e)
{
//连接失败
}
catch (Exception e)
{
//异常处理
}
}
private static String GetCityNameFromXml(String response)
{
String cityName = String.Empty;
try
{
var doc = XDocument.Parse(response);
XNamespace np = doc.Root.Name.Namespace;
//IEnumerable<XElement> address = root.ElementsAfterSelf("places");
var cityroot = (from p in doc.Descendants(np + "places")
from q in p.Descendants(np + "place")
from a in q.Descendants(np + "address")
from c in a.Descendants(np + "city")
select c).FirstOrDefault();
//XElement elecity = cityroot.FirstOrDefault();
if (cityroot == null)
{
return "广州";
}
else
{
if (cityroot != null)
cityName = cityroot.Value;
IsolatedStorageSettingHelper.AddIsolateStorageObj("GeolocatorCity", cityName);
return cityName;
}
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine("解析错误: {0}", e.Message);
return "广州";
}
}
/// <summary>
/// URL接口来自诺基亚地图
/// </summary>
/// <param name="slatitude"></param>
/// <param name="slongitude"></param>
/// <returns>json格式</returns>
public static Uri Get_CityNameOnMap(double slatitude, double slongitude)
{
string urlString = "http://loc.desktop.maps.svc.ovi.com/geocoder/rgc/1.0?" + "lat=" + slatitude + "&long=" + slongitude + "&output=json";
return new Uri(urlString, UriKind.RelativeOrAbsolute);
}
}
这里有一点要说明一下,那就是诺基亚地图返回来的xml格式比较奇怪哈!!!
var doc = XDocument.Parse(response);
XNamespace np = doc.Root.Name.Namespace;
xmlns
="
nokia:geocoder:gc:1.0
" 这货对xml解释造成一定的阻碍!!!不过以上的代码已经解决了!!!希望对你有帮助!!(*^__^*)