地图坐标转换 -- 火星坐标与GPS坐标
第一次处理地理位置的数据的人,没什么经验,往往掉入很多坑浪费不少时间。我也是刚刚从坑里爬出来。这篇博文主要是把入门GPS轨迹分析的经验总结一下,以方便大家少走些弯路。
(1)可视化 GPS 路径
刚拿到一堆GPS轨迹数据,想看看它长什么样?于是先想办法把它们可视化出来。有很多地图的API可以用,如果不是想搞演示,只是为了快速随便看一眼的话,推荐用百度的在线示例API http://developer.baidu.com/map/jsdemo.htm#c1_3 里面有比较详细的例子,很丰富的操作,修改代码也比较简单。 当然也可以把源代码copy下来在本地操作。
(2) 坐标格式
一般从GPS得到的数据是经纬度。经纬度有多种表示方法。
1.) ddd.ddddd, 度 . 度的十进制小数部分(5位)例如:31.12035º
2.) ddd.mm.mmm,度 . 分 . 分的十进制小数部分(3位)例如 31º10.335'
3.) ddd.mm.ss, 度 . 分 . 秒 例如 31º12'42"
在应用程序中基本都用格式1),所以首先要确定你的原始数据格式是否是格式1),如果不是,需要转换,方法比较简单。 一个从2)转换成1)的程序如下:
public Point(double longitude, double latitude ){ int degree = (int)(longitude);this.longitude = (longitude - degree) * 100 / 60 + degree;degree = (int)(latitude);this.latitude = (latitude - degree) *100 / 60 + degree;}
(3)坐标纠偏
刚拿到GPS轨迹数据的时候,直接print到地图上,发现路线比较奇怪,没有和道路完全吻合,很像偏移了一些,甚至会穿越没有道路的地方。 起初以为是GPS精度的问题。后来经人提醒,GPS坐标是有好几套标准的。 有兴趣的同学可以资料例如 http://yanue.net/post-121.html , 这里简单的说明什么是坐标偏移:
天朝为了保卫国家安全,对真实坐标系统进行人为的加偏处理,把真实的坐标加密成虚假的坐标,称为火星坐标。这种偏移是非线性的,偏移方向也不确定。 除了火星坐标系统,不同的地图数据商也可能使用自己的坐标系统,例如百度。 国内各地图API坐标系统比较详情请见http://www.cnblogs.com/Tangf/archive/2012/03/15/2398397.html 。 所以天朝所有准许上市的地图类产品都不是真实坐标系统。要想在某个地图API上正确的显示GPS轨迹,必须要先把数据转换成它的坐标系统。
这里还是以百度地图为例。假如我有原始(真实的)GPS数据,要在百度地图上正确显示,就需要先变成百度坐标系。 坐标转换的API说明在 http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition 可以看到,这个API支持从很多种不同的坐标系统转换到百度坐标系(但是不支持转换到百度坐标系以外的模式,吐槽一下)。 自己写个程序批量地转换,速度有点慢,一次只能发10个点左右。 在线演示在http://developer.baidu.com/map/jsdemo.htm#c1_3
把其中的坐标改成你自己的数据,再找到这行代码:
convertor.translate(pointArr, 3, 5, translateCallback)
其中的3,5表示从火星坐标转换到百度坐标; 如果改成1 , 5 则是从原始坐标转换到百度坐标,点击运行。
在我自己的数据上的效果如下:
很明显经过处理之后,路径才是正确的。
另外,高德地图采用的是火星坐标,也可以玩玩 http://lbs.amap.com/api/javascript-api/example/marker/marker-content/
原始坐标和火星坐标是可以相互转换的,需要一个小型辅助数据库,这里就不贴代码了,如有需要请留言。
这里附上百度坐标和火星坐标的c#转换代码:
public static Point Baidu2Mars(Point a){Point b = new Point();double x = a.longitude - 0.0065;double y= a.latitude - 0.006;double z = Math.Sqrt(x * x + y * y) - 0.00002 * Math.Sin(y * Math.PI / 180);double theta = Math.Atan2(y, x) - 0.000003 * Math.Cos(x * Math.PI / 180);b.longitude = z * Math.Cos(theta);b.latitude = z * Math.Sin(theta);return b;}public static Point Mars2Baidu(Point a){Point b = new Point();double x = a.longitude;double y= a.latitude;double z = Math.Sqrt(x * x + y * y) + 0.00002 * Math.Sin(y * Math.PI / 180);double theta = Math.Atan2(y, x) + 0.000003 * Math.Cos(x * Math.PI / 180);b.longitude = z * Math.Cos(theta) + 0.0065;b.latitude = z * Math.Sin(theta) + 0.006;return b;}
最后顺便贴一个求两个GPS点间距离的代码:
public static double Degree2Radian(double degree){double radian = degree * Math.PI / 180;return radian;}//http://www.movable-type.co.uk/scripts/latlong.htmlpublic static double Distance(Point a, Point b){double R = 6371000;double phi1 = Degree2Radian(a.latitude);double phi2 = Degree2Radian(b.latitude);double deltaPhi = Degree2Radian(a.latitude - b.latitude);double deltaLam = Degree2Radian(a.longitude - b.longitude);double aa = Math.Sin(deltaPhi / 2) * Math.Sin(deltaPhi / 2) + Math.Cos(phi1) * Math.Cos(phi2) * Math.Sin(deltaLam / 2) * Math.Sin(deltaLam / 2);double c = 2 * Math.Atan2(Math.Sqrt(aa), Math.Sqrt(1 - aa));double d = R * c;return d;}
http://www.cnblogs.com/sylvanas2012/p/5342530.html
@ 虚席名
http://www.lai18.com/content/689706.html
这篇文章里有转换代码和对应的数据库。你先试试~
我的那份数据库是师兄整理的,现在想想如果放在网上有点不合适
地图坐标转换 -- 火星坐标与GPS坐标相关推荐
- java gps 距离计算_Java教程之地图中计算两个GPS坐标点的距离
原标题:Java教程之地图中计算两个GPS坐标点的距离 在日常开发中,我们难免要计算两个左边之间的距离,但是地图软件api的接口普遍要求我们必须要先将坐标点传递到他们服务器,然后计算出一个距离返还给我 ...
- 实现高德坐标转GPS坐标
vue 实现高德坐标转GPS坐标 首先介绍一下常见的几种地图的坐标类型: WGS-84:这是一个国际标准,也就是GPS坐标(Google Earth.或者GPS模块采集的都是这个类型). GCJ-02 ...
- gps转百度地图坐标 java,GPS坐标与百度地图坐标转换
空间坐标公式: image.png 上述四个方程式中待测点坐标x. y. z 和Vto为未知参数,其中di=c△ti (i=1.2.3.4). di (i=1.2.3.4) 分别为卫星1.卫星2.卫星 ...
- 高德地图轨迹回放、点的弹跳效果、浏览器环境监测、设置地图的主题样式、GPS坐标转为高德坐标、地图加载提示、地图DOM事件、修改图层等API接口
1.轨迹回放 https://lbs.amap.com/api/javascript-api/example/marker/replaying-historical-running-data 2.点的 ...
- 高德地图GCJ-02火星坐标系与GPS的WGS-84坐标系转换公式(Java)
在国内,我们使用高德地图所获取的经纬度由于保密原因实际上经过了加偏处理 所以需要从国测局(GCJ02)坐标转换成基于WGS-84坐标系的GPS坐标 可在Android项目中直接使用,已经经过本人检验, ...
- 百度坐标转gps坐标_论文推荐 | 明锋:GPS坐标时间序列分析研究
<测绘学报> 构建与学术的桥梁 拉近与权威的距离 GPS坐标时间序列分析研究 明锋 地理信息工程国家重点实验室, 西安测绘研究所, 陕西 西安 710054 收稿日期:2019-01-02 ...
- 高德坐标转GPS坐标 CV版
WGS-84:是国际标准,GPS坐标(Google Earth使用.或者GPS模块) GCJ-02:中国坐标偏移标准,Google Map.高德.腾讯使用 BD-09:百度坐标偏移标准,Baidu M ...
- Mysql 高德转天地图经纬度sql ,高德地图GCJ-02火星坐标系与GPS的WGS-84坐标系转换
-- mysql高德转天地图 SELECT -- 经度 xlongitude * 2 -(xlongitude +(((300.0 + (xlongitude - 105.0) + 2.0 * (yl ...
- android gps 火星坐标,高德地图GCJ-02火星坐标系与GPS的WGS-84坐标系转换公式(安卓)...
最新做demo 使用自带的Location 自动跑点经纬度, 发现一个问题 安卓自带的Location是 WGS84 的经纬度 而高德却是GCJ-02 有了以下代码: //输入GCJ经纬度 转WGS纬 ...
最新文章
- 【数理知识】第8章-图-《离散数学及其应用》Kenneth H. Rosen
- 【Android工具】远程登录会话工具免费好用的SSH客户端——JuiceSSH
- 全球及中国抗水解剂市场需求容量与投资可行性研究报告2022年
- JUnit:在参数化测试中命名单个测试用例
- Lisenter笔记
- 身份的象征?苹果信用卡实体首度曝光:简约大方 保护隐私
- 功能选中jquery实现全选反选功能
- Datawale编程学习之哈希表和字符串(4)
- Windows 7 极限精简 x86 x64 2018年度版
- 2021年IT互联网高薪职位大盘点
- 前端流媒体:MSE入门
- ultravnc软件,5款ultravnc软件推荐
- 设置jsp打开的默认方式
- APS54083 DC/DC升降压恒流驱动芯片 2.4G调光 —提供DEMO板
- 深度学习需要的电脑配置
- 开源物联网监控告警平台JAVA开发
- 视频压制参数设置详细说明(转)
- 计算机主机的是指什么,pc是什么意思
- 娱乐直播一对一交友APP源码,开发更多功能优化用户体验
- Delphi 串口通信技术资料