百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换


Posted in Javascript onFebruary 19, 2016

在项目中面对不同的坐标体系,在地图上显示多多少少都会有点偏差,下面是使用javascript写的转换方法,具体代码如下所示:

 //定义一些常量
var x_PI = 3.14159265358979324 * 3000.0 / 180.0;

var PI = 3.1415926535897932384626;

var a = 6378245.0;

var ee = 0.00669342162296594323;

/**

* 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换

* 即 百度 转 谷歌、高德

* @param bd_lon

* @param bd_lat

* @returns {*[]}

*/

function bd09togcj02(bd_lon, bd_lat) { 

var x_pi = 3.14159265358979324 * 3000.0 / 180.0;

var x = bd_lon - 0.0065;

var y = bd_lat - 0.006;

var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);

var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);

var gg_lng = z * Math.cos(theta);

var gg_lat = z * Math.sin(theta);

return [gg_lng, gg_lat]

}
/**
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
* 即谷歌、高德 转 百度
* @param lng
* @param lat
* @returns {*[]}
*/
function gcj02tobd09(lng, lat) { 
var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
var bd_lng = z * Math.cos(theta) + 0.0065;
var bd_lat = z * Math.sin(theta) + 0.006;
return [bd_lng, bd_lat]
}
/**
* WGS84转GCj02
* @param lng
* @param lat
* @returns {*[]}
*/
function wgs84togcj02(lng, lat) { 
if (out_of_china(lng, lat)) {
return [lng, lat]
}
else {
var dlat = transformlat(lng - 105.0, lat - 35.0);
var dlng = transformlng(lng - 105.0, lat - 35.0);
var radlat = lat / 180.0 * PI;
var magic = Math.sin(radlat);
magic = 1 - ee * magic * magic;
var sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
var mglat = lat + dlat;
var mglng = lng + dlng;
return [mglng, mglat]
}
}
/**
* GCJ02 转换为 WGS84
* @param lng
* @param lat
* @returns {*[]}
*/
function gcj02towgs84(lng, lat) { 
if (out_of_china(lng, lat)) {
return [lng, lat]
}
else {
var dlat = transformlat(lng - 105.0, lat - 35.0);
var dlng = transformlng(lng - 105.0, lat - 35.0);
var radlat = lat / 180.0 * PI;
var magic = Math.sin(radlat);
magic = 1 - ee * magic * magic;
var sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
mglat = lat + dlat;
mglng = lng + dlng;
return [lng * 2 - mglng, lat * 2 - mglat]
}
}
function transformlat(lng, lat) { 
var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
return ret
}
function transformlng(lng, lat) { 
var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
return ret
}
/**
* 判断是否在国内,不在国内则不做偏移
* @param lng
* @param lat
* @returns {boolean}
*/
function out_of_china(lng, lat) { 
return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
}

//使用示例

//gps坐标转火星坐标 
var lng_lat_1 = wgs84togcj02(113.912743,22.497629);
console.log('火星坐标...',lng_lat_1);
//火星坐标转百度坐标 
var lng_lat_2 = gcj02tobd09(lng_lat_1[0], lng_lat_1[1]);
console.log('百度坐标...',lng_lat_2);
Javascript 相关文章推荐
添加到收藏夹代码(兼容几乎所有的浏览器)
Jan 09 Javascript
js Date自定义函数 延迟脚本执行
Mar 10 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
Aug 11 Javascript
基于jquery的滚动鼠标放大缩小图片效果
Oct 27 Javascript
JQuery鼠标移到小图显示大图效果的方法
Jun 10 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
Oct 28 Javascript
微信小程序 小程序制作及动画(animation样式)详解
Jan 06 Javascript
Webpack 之 babel-loader文件预处理器详解
Mar 23 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
May 09 Javascript
layui radio单选限制下一个radio单选的实例
Sep 03 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
Apr 08 Javascript
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
Mar 17 Javascript
基于JavaScript实现弹出框效果
Feb 19 #Javascript
jQuery on()绑定动态元素出现的问题小结
Feb 19 #Javascript
学习javascript文件加载优化
Feb 19 #Javascript
初识angular框架后的所思所想
Feb 19 #Javascript
复杂的javascript窗口分帧解析
Feb 19 #Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
Feb 19 #Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
Feb 19 #Javascript
You might like
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
2019/08/27 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
js的with语句使用方法
2007/09/21 Javascript
js调用flash的效果代码
2008/04/26 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
Web开发之JavaScript
2012/03/29 Javascript
node.js中的fs.rmdirSync方法使用说明
2014/12/16 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
Python 含参构造函数实例详解
2017/05/25 Python
django实现前后台交互实例
2017/08/07 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
python 负数取模运算实例
2020/06/03 Python
python性能测试工具locust的使用
2020/12/28 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
智利最大的网上商店:Linio智利
2016/11/24 全球购物
应届专科生个人的自我评价
2014/01/05 职场文书
《小池塘》教学反思
2014/02/28 职场文书
教师先进工作者事迹材料
2014/05/01 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
硕士生找工作求职信
2014/07/05 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript
MySQL去除重叠时间求时间差和的实现
2021/08/23 MySQL
python数字类型和占位符详情
2022/03/13 Python