Windows Phone 地图定位 及导出GPX文件
1 概述
通过ArcGIS Runtime for WindowsPhone SDK开发手机地图应用,能够定位所在位置,并将多个定位位置信息导出为GPX文件,供其他软件,如ArcMap、Google Earth等调用。本文将介绍如何实现地图定位,以及导出GPX文件的功能。
2 GeoCoordinateWatcher
Windows Phone SDK提供了GeoCoordinateWatcher类实现定位相关功能,需要引入System.Device.dll库,添加System.Device.Location命名空间。
2.1 参数设置
使用GeoCoordinateWatcher,需要创建一个实例,并设置定位精度、移动间距等基本属性,另外监听状态变化、结果变化等事件。如下代码所示:
if (_watcher == null)
{_watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High); // 使用高定位精度 _watcher.MovementThreshold = 50; // 最小移动间距,单位米,大于该间距的点才会触发PositionChanged事件_watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(watcher_StatusChanged);_watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);
}
2.2 启动定位
启动定位功能,即调用GeoCoordinateWatcher的Start方法,如下:
_watcher.Start();
2.3 定位状态
监听定位状态变化事件,如果出错可提示用户,如下:
void watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
{switch (e.Status){case GeoPositionStatus.Disabled: if (_watcher.Permission == GeoPositionPermission.Denied){ txtStatus.Text = "应用程序无权访问定位服务";}else{txtStatus.Text = "设备不支持定位服务";}break;case GeoPositionStatus.Initializing: break;case GeoPositionStatus.NoData: txtStatus.Text = "获取定位数据失败"; break;case GeoPositionStatus.Ready:txtStatus.Text = "GPS已经就绪";break;}
}
2.4 定位结果
对定位结果的处理,需要在定位位置变化事件中进行,如下所示:
void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{try{txtStatus.Text = "";MapPoint point = new MapPoint(e.Position.Location.Longitude, e.Position.Location.Latitude);ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator();MapPoint ptCurrent = mercator.FromGeographic(point) as MapPoint;//更新GPS定位点位置_gLocation.Geometry = ptCurrent;//更新轨迹线if (_gpsPoints == null){_gpsPoints = new PointCollection();_gpsPoints.Add(ptCurrent);}else{_gpsPoints.Add(ptCurrent);Polyline line = new Polyline();line.Paths.Add(_gpsPoints);_gTrackLine.Geometry = line;}#region 记录GPS定位信息GpsInfo gpsInfo = new GpsInfo();gpsInfo.Altitude = e.Position.Location.Altitude;gpsInfo.Course = e.Position.Location.Course;gpsInfo.HorizontalAccuracy = e.Position.Location.HorizontalAccuracy;gpsInfo.Latitude = e.Position.Location.Latitude;gpsInfo.Longitude = e.Position.Location.Longitude;gpsInfo.Speed = e.Position.Location.Speed;gpsInfo.VerticalAccuracy = e.Position.Location.VerticalAccuracy;gpsInfo.Time = e.Position.Timestamp.DateTime;_gpxWriter.AddGpsInfo(gpsInfo);#endregion_gpsLayer.Refresh();map.ZoomToResolution(2.38865713397468, ptCurrent);//定位到16级比例尺 }catch (Exception ex){MessageBox.Show("显示定位信息错误");}
}
其中ESRI.ArcGIS.Client.Projection.WebMercator是用于将GPS获得的WGS 84经纬度坐标转换为Web Mercator投影坐标,这需要根据坐标系的具体情况来选择,如果地图坐标系本身就是WGS84,则无需转换,如果地图是Web Mercator,则需要进行转换,如果地图是其他坐标系,如Xian1980,或CGCS2000等,则需要调用ArcGIS Server的Geometry Service进行在线转换。
2.5 停止定位
当需要停止定位的时候,直接调用Stop方法即可,如下:
if (_watcher != null)
{_watcher.Stop();txtStatus.Text = "";_gpsLayer.Graphics.Clear();
}
3 导出GPX文件
在上文定位结果处理中,已经将每次位置记录存储为GpsInfo对象,便于进行统一的导出处理。
3.1 GpsInfo
GpsInfo对象只是简单的属性字段集合,用于记录GPS设备获取的数据信息。其属性如下:
public class GpsInfo{private double _longitude = 0;public double Longitude{get { return _longitude; }set { _longitude = value; }}private double _latitude = 0;public double Latitude{get { return _latitude; }set { _latitude = value; }}private double _altitude = 0;public double Altitude{get { return _altitude; }set { _altitude = value; }}private double _speed = 0;public double Speed{get { return _speed; }set { _speed = value; }}private double _course = 0;public double Course{get { return _course; }set { _course = value; }}private double _horizontalAccuracy = 0;public double HorizontalAccuracy{get { return _horizontalAccuracy; }set { _horizontalAccuracy = value; }}private double _verticalAccuracy = 0;public double VerticalAccuracy{get { return _verticalAccuracy; }set { _verticalAccuracy = value; }}private DateTime _time = new DateTime();public DateTime Time{get { return _time; }set { _time = value; }}}
3.2 GpxWriter
GpxWriter则提供了将GpsInfo写入GPX文件的功能,代码如下:
public class GpxWriter{private string _gpxFile = "";private IList<GpsInfo> _lstGpsInfo = null;private XmlWriterSettings _settings = null;public GpxWriter(string gpxFile){_settings = new XmlWriterSettings();_settings.Indent = true;_settings.Encoding = new UTF8Encoding(false);_settings.NewLineChars = Environment.NewLine;_lstGpsInfo = new List<GpsInfo>();_gpxFile = gpxFile;}public void AddGpsInfo(GpsInfo gpsInfo){_lstGpsInfo.Add(gpsInfo);}public void WriteToGpx(){try{if (_lstGpsInfo == null || _lstGpsInfo.Count == 0) return;IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();if (myIsolatedStorage.FileExists(_gpxFile) == true){myIsolatedStorage.DeleteFile(_gpxFile);}using (IsolatedStorageFileStream stream = myIsolatedStorage.OpenFile(_gpxFile, FileMode.CreateNew)){using (XmlWriter xmlWriter = XmlWriter.Create(stream, _settings)){//写xml文件开始<?xml version="1.0" encoding="utf-8" ?>xmlWriter.WriteStartDocument();//写根节点xmlWriter.WriteStartElement("gpx", "http://www.topografix.com/GPX/1/0");//给节点添加属性xmlWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");xmlWriter.WriteAttributeString("xmlns", "mbx", null, "http://www.motionbased.net/mbx");xmlWriter.WriteAttributeString("xsi", "schemaLocation", null, "http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.motionbased.net/mbx http://www.motionbased.net/site/schemas/mbx/0.0.1/mbx.xsd");xmlWriter.WriteAttributeString("creator", "YELLOW EAST http://weibo.com/yelloweast");xmlWriter.WriteAttributeString("version", "1.0");//写内容根节点xmlWriter.WriteStartElement("trk");//写内容根节点xmlWriter.WriteStartElement("trkseg");//写GPS信息节点foreach (GpsInfo gpsInfo in _lstGpsInfo){xmlWriter.WriteStartElement("trkpt");//给节点添加属性xmlWriter.WriteAttributeString("lat", gpsInfo.Latitude.ToString());xmlWriter.WriteAttributeString("lon", gpsInfo.Longitude.ToString());//添加子节点xmlWriter.WriteElementString("ele", gpsInfo.Altitude.ToString());xmlWriter.WriteElementString("time", gpsInfo.Time.ToShortDateString() + " " + gpsInfo.Time.ToLongTimeString());xmlWriter.WriteElementString("course", gpsInfo.Course.ToString());xmlWriter.WriteElementString("speed", gpsInfo.Speed.ToString());xmlWriter.WriteEndElement();//trkpt}xmlWriter.WriteEndElement();//trksegxmlWriter.WriteEndElement();//trkxmlWriter.WriteEndElement();//gpxxmlWriter.WriteEndDocument();}}_lstGpsInfo.Clear();//清空历史记录}catch (Exception ex){System.Windows.MessageBox.Show("写GPX文件错误:" + ex.Message);}}}
在调用的时候,只需要指定gpx文件名,然后调用相关的方法,例如变量定义:
private GpxWriter _gpxWriter = null;
初始化:
DateTime now = DateTime.Now;string gpxName = String.Format("{0}-{1}-{2}_{3}-{4}-{5}.gpx", now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second);_gpxWriter = new GpxWriter(gpxName);
导出GPX文件:
_gpxWriter.WriteToGpx();
Windows Phone 地图定位 及导出GPX文件相关推荐
- 英伟达“神笔马良”GauGAN发布Windows应用程序,可导出PSD文件
丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI 大家还记得致敬印象派大师高更的GauGAN吗? 只需简单画几笔,就能生成逼真风景画的那个: 这个能让普通人秒变"神笔马良" ...
- java读取gpx文件,从Leaflet导出GPX文件
我想要做的是让用户通过选择Leaflet中的一些GeoJson功能来创建GPX文件 . 我这样做的方法是创建一个新的GeoJson图层来存储所选的特征,然后用一个名为togpx(https://git ...
- 机试题:地图定位、拍照并显示、录制视频并播放
这两天参加面试,有个公司先出了机试题,然后才能进入下一步,机试题大意是要求实现:地图定位.拍照并显示照片.录制视频并且播放视频三个小功能. 先上我的效果图: 1.地图定位关键代码(ios8后,开启地图 ...
- oracle导出脚本文件怎么打开,Windows下的Oracle导出脚本 -电脑资料
Windows下的Oracle导出脚本 导出脚本内容: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
- Java在Windows下导出xml文件到Linux服务器上
最近由于公司项目需要,学习了在Windows平台导出xml文件到Linux服务器上的指定目录下的方法,(注:这里的我的Linux是在本机上装的虚拟机)现在写下来记录一下! 1.首先是项目截图: 2.主 ...
- mysql导出kml_谷歌地图如何导出kml文件 导出kml文件教程
这里以百度地图为例.通过侧边栏切换到地图标注,新建一个文件夹.右键"我的标注"弹出菜单在选择"添加"菜单下的"文件夹" 弹出如下对话框,给文 ...
- 216:vue+openlayers 加载GPX数据,导出geojson文件
第216个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载GPX数据,显示图形, 导出geojson文件. GPX(GPS eXchange Format,GPS交换 ...
- 217:vue+openlayers上传GPX文件,导出geojson文件
第217个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中上传GPX数据,显示图形, 导出geojson文件. GPX(GPS eXchange Format,GPS交换 ...
- mysql windows导出sql文件_Windows下使用mysqldump命令导入/导出.sql文件
1.mysqldump.exe在MySql的安装目录的bin目录下 如图: 2.使用Windwos命令进入MySql安装目录的bin目录下. 如图: 3.使用mysqldump命令导出.sql文件 ( ...
- Android 之一 Android Studio 安装、配置等新手入门 + 百度地图定位 + 移动摇杆 的实现
缘起 之前在玩一款 VR 游戏:一起来捉妖.这款游戏是使用地图进行游戏的.无奈网上找了各种工具,要么付费,要么不好使.想想自己就是个程序猿,于是乎决定自己开发一个.现在游戏基本放弃了,但是为了游戏 ...
最新文章
- 动态获得资源的路径大小写问题
- 2021 年中国敏捷行业现状调查全面启动
- 手机浏览器android2.,QQ浏览器Android 2.6:畅享版云浏览器大变身
- 透视映射和射影映射的关系 Perspective and Projectivity
- 【转】Eclipse Code Recommenders正式发布 智能代码建议工具
- 编写Play 2的模块,第2部分:拦截器
- 信号 09 | SIGCLD语义
- 【先生】丘成桐:中国人可以做世界一流学者
- Bootstrap3 表单静态控件
- Android自定义printf/printk/ALOGE函数LOG_TAG
- Anroid性能优化系列——Improving Layout Performance(三)
- 计算机英语拼读法,常用计算机英语词汇:DVD
- APDU调试问题总结
- python实现明星专家系统:人脸识别自动比对
- 在Centos 5.x或6.x上安装RHEL EPEL Repo
- [ISUX译]iOS 9人机界面指南(一):UI设计基础
- Apollo搭建使用
- 构造方法--带参构造方法
- 混合改进策略的黑猩猩优化算法
- php做宿舍门禁管理系统项目首选公司,宿舍人脸识别门禁系统,校园宿舍管理系统...