百度坐标(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 处理表单元素的代码
Feb 15 Javascript
javascript拖拽上传类库DropzoneJS使用方法
Dec 05 Javascript
JavaScript中的console.assert()函数介绍
Dec 29 Javascript
实例解析jQuery中proxy()函数的用法
May 24 Javascript
jQuery实现的自定义弹出层效果实例详解
Sep 04 Javascript
将angular.js项目整合到.net mvc中的方法详解
Jun 29 Javascript
JavaScript实现换肤功能
Sep 15 Javascript
vue2.0使用swiper组件实现轮播效果
Nov 27 Javascript
vue-router配合ElementUI实现导航的实例
Feb 11 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
Mar 17 Javascript
JSON生成Form表单的方法示例
Nov 21 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
Nov 07 jQuery
基于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 header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
解析PHP高效率写法(详解原因)
2013/06/20 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
2016/06/13 Javascript
JavaScript函数节流概念与用法实例详解
2016/06/20 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
JS实现简单的表格增删
2020/01/16 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
python中的闭包用法实例详解
2015/05/05 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
python logging.info在终端没输出的解决
2020/05/12 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
高中的自我鉴定
2013/12/16 职场文书
创业计划书六个要素
2013/12/26 职场文书
幼教简历自我评价
2014/01/28 职场文书
会计专业自我鉴定
2014/02/10 职场文书
建设工地安全标语
2014/06/07 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
2014年电工工作总结
2014/11/20 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
2014年电教工作总结
2014/12/19 职场文书
优秀团支部申报材料
2014/12/26 职场文书
手残删除python之后的补救方法
2021/06/26 Python