百度坐标(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 相关文章推荐
Tips 带三角可关闭的文字提示
Oct 06 Javascript
js中Image对象以及对其预加载处理示例
Nov 20 Javascript
javascript函数重载解决方案分享
Feb 19 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
Sep 04 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
Dec 14 Javascript
详谈jQuery中的一些正则匹配表达式
Mar 08 Javascript
JS设计模式之惰性模式(二)
Sep 29 Javascript
bootstrap select下拉搜索插件使用方法详解
Nov 23 Javascript
js中如何完美的解析数据
Mar 18 Javascript
MVVM框架下实现分页功能示例
Jun 14 Javascript
js实现数字从零慢慢增加到指定数字示例
Nov 07 Javascript
AutoJs实现刷宝短视频的思路详解
May 22 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图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
PHP查询快递信息的方法
2015/03/07 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
JavaScript操作表单实例讲解(上)
2016/06/20 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
Python网络爬虫之爬取微博热搜
2019/04/18 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
优秀经理获奖感言
2014/03/04 职场文书
祖国在我心中演讲稿500字
2014/05/04 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
元旦标语大全
2014/10/09 职场文书
2015夏季作息时间调整通知
2015/04/24 职场文书
一年级语文教学随笔
2015/08/14 职场文书
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python