GPS坐标系转换(标准坐标系WGS84转GCJ-02火星坐标系)
GPS坐标系转换(标准坐标系WGS84转GCJ-02火星坐标系)
- 坐标系简介
- WGS-84 标准坐标系
- GCJ-02 - 国测局坐标
- BD-09 - 百度坐标系
- 干货前的说明
- WGS84转GCJ-02代码
- GCJ-02转WGS84代码
- 结果
坐标系简介
通常用经纬度来表示一个地理位置,但是由于一些原因,我们从不同渠道得到的经纬度信息可能并不是在同一个坐标系下。
高德地图、腾讯地图以及谷歌中国区地图使用的是GCJ-02坐标系
百度地图使用的是BD-09坐标系
底层接口(HTML5 Geolocation或ios、安卓API)通过GPS设备获取的坐标使用的是WGS-84坐标系
不同的坐标系之间可能有几十到几百米的偏移,所以在开发基于地图的产品,或者做地理数据可视化时,我们需要修正不同坐标系之间的偏差。
WGS-84 标准坐标系
WGS-84(World Geodetic System, WGS)是使用最广泛的坐标系,也是世界通用的坐标系,GPS设备得到的经纬度就是在WGS84坐标系下的经纬度。通常通过底层接口得到的定位信息都是WGS84坐标系。
GCJ-02 - 国测局坐标
GCJ-02(G-Guojia国家,C-Cehui测绘,J-Ju局),又被称为火星坐标系,是一种基于WGS-84制定的大地测量系统,由中国国测局制定。此坐标系所采用的混淆算法会在经纬度中加入随机的偏移。
国家规定,中国大陆所有公开地理数据都需要至少用GCJ-02进行加密,也就是说我们从国内公司的产品中得到的数据,一定是经过了加密的。绝大部分国内互联网地图提供商都是使用GCJ-02坐标系,包括高德地图,谷歌地图中国区等。
BD-09 - 百度坐标系
BD-09(Baidu, BD)是百度地图使用的地理坐标系,其在GCJ-02上多增加了一次变换,用来保护用户隐私。从百度产品中得到的坐标都是BD-09坐标系。
干货前的说明
其实可以这么理解,火星坐标系是在标准坐标系的基础上进行了一次加密,加密也就是加了一次位置的偏移量,而百度坐标系是进行了两次加密
WGS84转GCJ-02代码
#include <stdio.h>
#include <math.h>double lng_r,lat_r,tran_lng,tran_lat;
double dlat,dlng,radlat,magic,sqrtmagic;
double mglat,mglng,lngtitude,lattitude;double lng_w = 120.13372381819; //标准坐标系
double lat_w = 30.181981289109;double PI = 3.1415926535897932384626;
double ee = 0.00669342162296594323;
int a = 6378245;//标准坐标系WGS84转GCJ-02火星坐标系
void WG_to_GCJ(float lng,float lat)
{lng_r = lng - 105.0;lat_r = lat - 35.0;//经度转换 tran_lng= 300.0 + lng_r + 2.0 * lat_r + 0.1 * lng_r * lng_r + 0.1 * lng_r * lat_r + 0.1 * sqrt(abs(lng_r));tran_lng = tran_lng + (20.0 * sin(6.0 * lng_r * PI) + 20.0 * sin(2.0 * lng_r * PI)) * 2.0 / 3.0;tran_lng = tran_lng + (20.0 * sin(lng_r * PI) + 40.0 * sin(lng_r / 3.0 * PI)) * 2.0 / 3.0;tran_lng = tran_lng + (150.0 * sin(lng_r / 12.0 * PI) + 300.0 * sin(lng_r / 30.0 * PI)) * 2.0 / 3.0;//转换纬度tran_lat = -100.0 + 2.0 * lng_r + 3.0 * lat_r + 0.2 * lat_r * lat_r + 0.1 * lng_r * lat_r + 0.2 * sqrt(abs(lng_r));tran_lat = tran_lat+(20.0 * sin(6.0 * lng_r * PI) + 20.0 * sin(2.0 * lng_r * PI)) * 2.0 / 3.0;tran_lat = tran_lat+(20.0 * sin(lat_r * PI) + 40.0 * sin(lat_r / 3.0 * PI)) * 2.0 / 3.0;tran_lat = tran_lat+(160.0 * sin(lat_r / 12.0 * PI) + 320 * sin(lat_r * PI / 30.0)) * 2.0 / 3.0;dlat = tran_lat;dlng = tran_lng;radlat = lat/180.0 * PI;magic = sin(radlat);magic = 1- ee * magic * magic;sqrtmagic = sqrt(magic);dlat = (dlat * 180.0)/((a * (1-ee))/(magic * sqrtmagic)*PI);dlng = (dlng * 180.0)/(a / sqrtmagic * cos(radlat) * PI);mglat = lat + dlat;mglng = lng + dlng;printf("%lf,%lf\r\n",mglat,mglng);} int main(void){WG_to_GCJ(lng_w,lat_w);return 0; }
GCJ-02转WGS84代码
double lng_r,lat_r,tran_lng,tran_lat;
double dlat,dlng,radlat,magic,sqrtmagic;
double mglat,mglng,lngtitude,lattitude;double lng_G = 120.13845564; //火星坐标系
double lat_G = 30.17967337889;double PI = 3.1415926535897932384626;
double ee = 0.00669342162296594323;
int a = 6378245;void GCJ_to_WG(float lng,float lat)
{lng_r = lng - 105.0;lat_r = lat - 35.0;//转换经度 tran_lng= 300.0 + lng_r + 2.0 * lat_r + 0.1 * lng_r * lng_r + 0.1 * lng_r * lat_r + 0.1 * sqrt(abs(lng_r));tran_lng = tran_lng + (20.0 * sin(6.0 * lng_r * PI) + 20.0 * sin(2.0 * lng_r * PI)) * 2.0 / 3.0;tran_lng = tran_lng + (20.0 * sin(lng_r * PI) + 40.0 * sin(lng_r / 3.0 * PI)) * 2.0 / 3.0;tran_lng = tran_lng + (150.0 * sin(lng_r / 12.0 * PI) + 300.0 * sin(lng_r / 30.0 * PI)) * 2.0 / 3.0;//转换纬度tran_lat = -100.0 + 2.0 * lng_r + 3.0 * lat_r + 0.2 * lat_r * lat_r + 0.1 * lng_r * lat_r + 0.2 * sqrt(abs(lng_r));tran_lat = tran_lat+(20.0 * sin(6.0 * lng_r * PI) + 20.0 * sin(2.0 * lng_r * PI)) * 2.0 / 3.0;tran_lat = tran_lat+(20.0 * sin(lat_r * PI) + 40.0 * sin(lat_r / 3.0 * PI)) * 2.0 / 3.0;tran_lat = tran_lat+(160.0 * sin(lat_r / 12.0 * PI) + 320 * sin(lat_r * PI / 30.0)) * 2.0 / 3.0;dlat = tran_lat;dlng = tran_lng;radlat = lat/180.0 * PI;magic = sin(radlat);magic = 1- ee * magic * magic;sqrtmagic = sqrt(magic);dlat = (dlat * 180.0)/((a * (1-ee))/(magic * sqrtmagic)*PI);dlng = (dlng * 180.0)/(a / sqrtmagic * cos(radlat) * PI);mglat = lat + dlat;mglng = lng + dlng;lngtitude = lng * 2 - mglng;lattitude = lat * 2 - mglat;printf("%f,%f\r\n",lattitude,lngtitude);
}int main(void){GCJ_to_WG(lng_G,lat_G);return 0; }
结果
GPS坐标系转换(标准坐标系WGS84转GCJ-02火星坐标系)相关推荐
- python坐标系转换函数_python WGS84和ECEF坐标的转换
地心地固坐标系(Earth-Centered, Earth-Fixed,ECEF),简称地心坐标系. 地理坐标系统(Geographic Coordinate System,GCS)1,坐标系是地心坐 ...
- WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换,mybatis字段映射原理
1.各坐标系简介 2.各坐标系转换 2.1坐标点实体类 2.2各坐标系转换工具类 3.测试 1.各坐标系简介 WGS84坐标系 即地球坐标系,国际上通用的坐标系. 设备一般包含GPS芯片或者北斗芯片获 ...
- python地图坐标系转换(bd09,gcj02,wgs84三种投影坐标系相互转化)
1.介绍 1.1 GIS之坐标系 坐标系是GIS的重中之重,一般来说,工作底图平面坐标系应采用国家大地坐标系CGCS2000(或相当于精度WGS84坐标系),投影方式采用高斯-克吕格投影,高程基准采用 ...
- WGS84(GPS)、火星坐标系(GCJ02)、百度地图(BD09)坐标系转换案例教程(附转换工具下载)
在做基于百度地图.高德地图等电子地图做为地图服务的二次开发时,通常需要将具有WGS84等坐标的矢量数据(如行政区划.地名.河流.道路等GIS地理空间数据)添加到地图上面,然而,在线地图大多使用的是火星 ...
- GPS各种地图坐标系转换(转载)
http://my.oschina.net/fankun2013/blog/338100 地图供应商比较多,产生了许多地图坐标.地图坐标正确转换是个问题.在之前开发地图应用的时候发现从WGS84坐标系 ...
- 常用坐标系转换工具(Java实现)
核心提示: 1.首先要识别地图厂商和采用的坐标系.一般一家厂商支持一种地图产品,采用一种坐标系.但是谷歌是例外,谷歌地图和谷歌地球是姊妹产品,前者采用火星坐标系,后者则是地球坐标(GPS). 2.原理 ...
- GIS转换器如何进行数据坐标系转换(如:WGS8,UTM,BEIJING54,XIAN80,CGCS2000)
在使用GIS数据时,由于数据来源不同,需要一块使用时,经常会进行坐标系的转换. 注意:很多人喜欢直接将不同坐标系的数据源在应用系统中利用动态投影叠加使用,这会拖慢系统的响应速度,造成不好的用户体验. ...
- ROS中的坐标与坐标系转换
ROS中的TF 官网建议新工作直接使用tf2,因为它有一个更清洁的界面,和更好的使用体验.(自ROS Hydro以来,tf第一代已被"弃用",转而支持tf2) TF介绍 TF(Tr ...
- 空间规划师的坐标系转换手册(国家2000大地坐标系适用)(转载)
声明:本文所指空间规划师特指城乡规划师,此处仅在标题名称提法上与国家空间规划体系改革相呼应,文中仍以规划师或城乡规划师相称,并无额外之意,请勿过度解读:封面图片来自于网络,版权归原作者所有. 随着自然 ...
- ROS中TF(坐标系转换)原理与使用
官网建议新工作直接使用tf2,因为它有一个更清洁的界面,和更好的使用体验.(自ROS Hydro以来,tf第一代已被"弃用",转而支持tf2). TF介绍 TF(TransForm ...
最新文章
- Redis 集群规范
- 什么是 Time to live TTL
- repeated call of attachBrowserEvent
- STL 中的链表排序
- 从0到1搭建RPC框架
- QTP软件测试工具学习
- 【教程】小米盒子4 刷机,无广告,总是无限重启,刷入2%报错的解决方法
- vue 中秋节博饼游戏,摇骰子游戏,兼容移动端跟pc
- (一)目标检测经典模型回顾
- 最全常用Linux命令升级及面试必备
- CDBPDB USERS AND PRIVILLEGE
- 积分墙、广告等违规应用如何在安卓市场上线
- c语言中strcat函数的作用,strcat函数的作用是什么?
- ctfshow 萌新赛 劝退警告
- 阿里EasyExcel对Excel复杂模版填充实现并设置单元格格式
- php弹幕反检测,【原理讲解附源码】找到B站弹幕的发送者
- java模拟京东登陆_模拟登陆京东并访问我的订单
- 轨道六根数 matlab,轨道六根数
- Python经典实验4-字典和集合的应用
- android 新开发工具,Android开发人员必备的10个开发工具