百度坐标(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 相关文章推荐
JavaScript 基础知识 被自己遗忘的
Oct 15 Javascript
JS 去前后空格大全(IE9亲测)
Jul 15 Javascript
JavaScript中json使用自己总结
Aug 13 Javascript
详谈JavaScript内存泄漏
Nov 14 Javascript
javascript中数组array及string的方法总结
Nov 28 Javascript
jQuery实现返回顶部功能
Feb 23 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
May 18 Javascript
jQuery实现微信长按识别二维码功能
Aug 26 Javascript
javascript的几种写法总结
Sep 30 Javascript
BootStrap整体框架之基础布局组件
Dec 15 Javascript
Angular2的管道Pipe的使用方法
Nov 07 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
Jul 19 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中get_defined_constants函数用法实例分析
2015/05/12 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
nginx下安装php7+php5
2016/07/31 PHP
如何优雅的使用 laravel 的 validator验证方法
2018/11/11 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
js文字滚动停顿效果代码
2008/06/28 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
javascript格式化json显示实例分析
2015/04/21 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
JS框架之vue.js(深入三:组件1)
2016/09/29 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
微信小程序带动画弹窗组件使用方法详解
2018/11/27 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
Python enumerate遍历数组示例应用
2008/09/06 Python
复习Python中的字符串知识点
2015/04/14 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
外语系大学生自荐信范文
2014/03/01 职场文书
大二学习计划书范文
2014/04/27 职场文书
中班幼儿评语大全
2014/04/30 职场文书
爱心倡议书范文
2014/05/12 职场文书
结对共建协议书
2014/08/20 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
Python WSGI 规范简介
2021/04/11 Python
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python
Nginx的gzip相关介绍
2022/05/11 Servers