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文件相关推荐

  1. 英伟达“神笔马良”GauGAN发布Windows应用程序,可导出PSD文件

    丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI 大家还记得致敬印象派大师高更的GauGAN吗? 只需简单画几笔,就能生成逼真风景画的那个: 这个能让普通人秒变"神笔马良" ...

  2. java读取gpx文件,从Leaflet导出GPX文件

    我想要做的是让用户通过选择Leaflet中的一些GeoJson功能来创建GPX文件 . 我这样做的方法是创建一个新的GeoJson图层来存储所选的特征,然后用一个名为togpx(https://git ...

  3. 机试题:地图定位、拍照并显示、录制视频并播放

    这两天参加面试,有个公司先出了机试题,然后才能进入下一步,机试题大意是要求实现:地图定位.拍照并显示照片.录制视频并且播放视频三个小功能. 先上我的效果图: 1.地图定位关键代码(ios8后,开启地图 ...

  4. 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 ...

  5. Java在Windows下导出xml文件到Linux服务器上

    最近由于公司项目需要,学习了在Windows平台导出xml文件到Linux服务器上的指定目录下的方法,(注:这里的我的Linux是在本机上装的虚拟机)现在写下来记录一下! 1.首先是项目截图: 2.主 ...

  6. mysql导出kml_谷歌地图如何导出kml文件 导出kml文件教程

    这里以百度地图为例.通过侧边栏切换到地图标注,新建一个文件夹.右键"我的标注"弹出菜单在选择"添加"菜单下的"文件夹" 弹出如下对话框,给文 ...

  7. 216:vue+openlayers 加载GPX数据,导出geojson文件

    第216个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载GPX数据,显示图形, 导出geojson文件. GPX(GPS eXchange Format,GPS交换 ...

  8. 217:vue+openlayers上传GPX文件,导出geojson文件

    第217个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中上传GPX数据,显示图形, 导出geojson文件. GPX(GPS eXchange Format,GPS交换 ...

  9. mysql windows导出sql文件_Windows下使用mysqldump命令导入/导出.sql文件

    1.mysqldump.exe在MySql的安装目录的bin目录下 如图: 2.使用Windwos命令进入MySql安装目录的bin目录下. 如图: 3.使用mysqldump命令导出.sql文件 ( ...

  10. Android 之一 Android Studio 安装、配置等新手入门 + 百度地图定位 + 移动摇杆 的实现

    缘起   之前在玩一款 VR 游戏:一起来捉妖.这款游戏是使用地图进行游戏的.无奈网上找了各种工具,要么付费,要么不好使.想想自己就是个程序猿,于是乎决定自己开发一个.现在游戏基本放弃了,但是为了游戏 ...

最新文章

  1. 动态获得资源的路径大小写问题
  2. 2021 年中国敏捷行业现状调查全面启动
  3. 手机浏览器android2.,QQ浏览器Android 2.6:畅享版云浏览器大变身
  4. 透视映射和射影映射的关系 Perspective and Projectivity
  5. 【转】Eclipse Code Recommenders正式发布 智能代码建议工具
  6. 编写Play 2的模块,第2部分:拦截器
  7. 信号 09 | SIGCLD语义
  8. 【先生】丘成桐:中国人可以做世界一流学者
  9. Bootstrap3 表单静态控件
  10. Android自定义printf/printk/ALOGE函数LOG_TAG
  11. Anroid性能优化系列——Improving Layout Performance(三)
  12. 计算机英语拼读法,常用计算机英语词汇:DVD
  13. APDU调试问题总结
  14. python实现明星专家系统:人脸识别自动比对
  15. 在Centos 5.x或6.x上安装RHEL EPEL Repo
  16. [ISUX译]iOS 9人机界面指南(一):UI设计基础
  17. Apollo搭建使用
  18. 构造方法--带参构造方法
  19. 混合改进策略的黑猩猩优化算法
  20. php做宿舍门禁管理系统项目首选公司,宿舍人脸识别门禁系统,校园宿舍管理系统...

热门文章

  1. windows电脑记事本怎么自由排序?
  2. de4dot脱壳方法
  3. 【算法篇】汉诺塔问题
  4. 【汉诺塔问题】递归算法求解汉诺塔问题
  5. 高效MacBook工作环境配置
  6. 使用onvif协议操作设备
  7. SQLServer 内连接和外连接
  8. mysql自增函数_mysql实现自增函数
  9. 如何进入Dos窗口以及了解常用Dos命令
  10. 号码被标记,各平台取消方法