百度坐标(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 相关文章推荐
基于Jquery的温度计动画效果
Jun 18 Javascript
js multiple全选与取消全选实现代码
Dec 04 Javascript
js实现可拖动DIV的方法
Dec 17 Javascript
Javascript函数式编程语言
Oct 11 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
Jun 23 Javascript
JS制作适用于手机和电脑的通知信息效果
Oct 28 Javascript
基于javascript的Form表单验证
Dec 29 Javascript
JavaScript数组和对象的复制
Mar 21 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
Jun 20 jQuery
js实现多个倒计时并行 js拼团倒计时
Feb 25 Javascript
Vuex的实战使用详解
Oct 31 Javascript
js实现轮播图特效
May 28 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
消息持续发送的完整例子
2006/10/09 PHP
php中filter函数验证、过滤用户输入的数据
2014/01/13 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
php实现小程序支付完整版
2018/10/09 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
node.js中的emitter.emit方法使用说明
2014/12/10 Javascript
利用Javascript仿Excel的数据透视分析功能
2016/09/07 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
python里使用正则的findall函数的实例详解
2017/10/19 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
如何利用CSS3制作3D效果文字具体实现样式
2013/05/02 HTML / CSS
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
如何开启linux的ssh服务
2013/06/03 面试题
linux面试题参考答案(4)
2013/01/28 面试题
高校生生产实习自我鉴定
2013/09/21 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
物流创业计划书
2014/02/01 职场文书
学习十八大报告感言
2014/02/04 职场文书
迎新晚会主持词
2014/03/24 职场文书
颁奖晚会主持词
2014/03/25 职场文书
投标授权委托书范文
2014/08/02 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
投资意向协议书
2015/01/29 职场文书
Golang实现AES对称加密的过程详解
2021/05/20 Golang
使用Ajax实现无刷新上传文件
2022/04/12 Javascript
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers