百度坐标(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 查找iframe父级页面元素的实现代码
Aug 28 Javascript
Javascript实现视频轮播在pc端与移动端均可
Sep 29 Javascript
jquery slibings选取同级其他元素的实现代码
Nov 15 Javascript
AngularJS基础 ng-options 指令详解
Aug 02 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
Sep 02 Javascript
JavaScript实现经纬度转换成地址功能
Mar 28 Javascript
vue中的scope使用详解
Oct 29 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
Apr 24 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
Jul 25 Javascript
微信小程序网络请求实现过程解析
Nov 06 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
Apr 07 Javascript
如何使用原生Js实现随机点名详解
Jan 06 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+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
AngularJS中的JSONP实例解析
2016/12/01 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
集成vue到jquery/bootstrap项目的方法
2018/02/10 jQuery
NodeJS安装图文教程
2018/04/19 NodeJs
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
Python爬取京东的商品分类与链接
2016/08/26 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
python实现汽车管理系统
2018/11/30 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
python 实现屏幕录制示例
2019/12/23 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
python的dict判断key是否存在的方法
2020/12/09 Python
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
Nuts.com:优质散装,批发坚果、干果和巧克力等
2017/03/21 全球购物
英国经典球衣网站:Classic Football Shirts
2017/05/20 全球购物
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
毕业学生推荐信
2013/12/01 职场文书
写自荐信三大法宝
2014/01/24 职场文书
小学教师办公室制度
2014/02/03 职场文书
开业主持词
2014/03/21 职场文书
信息工作经验交流材料
2014/05/28 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
计划生育诚信协议书
2014/11/02 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
Python实现拼音转换
2021/06/07 Python