js中火星坐标、百度坐标、WGS84坐标转换实现方法示例


Posted in Javascript onMarch 02, 2020

本文实例讲述了js中火星坐标、百度坐标、WGS84坐标转换实现方法。分享给大家供大家参考,具体如下:

//定义一些常量
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)的转换
 * 即 百度 转 谷歌、高德
 */
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) 的转换
 * 即谷歌、高德 转 百度
 */
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
 */
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
 */
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
}
/**
 * 判断是否在国内,不在国内则不做偏移
 */
function out_of_china(lng, lat) {
  return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
}

更多关于JavaScript相关内容还可查看本站专题:《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript数组操作技巧总结》及《JavaScript字符与字符串操作技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js 单击式的下拉菜单效果实例
Aug 13 Javascript
jquery ajaxSubmit 异步提交的简单实现
Feb 28 Javascript
jquery删除ID为sNews的tr元素的内容
Apr 10 Javascript
禁用Tab键JS代码兼容Firefox和IE
Apr 18 Javascript
javascript连续赋值问题
Jul 08 Javascript
AngularJS实现根据不同条件显示不同控件
Apr 20 Javascript
JavaScript中的E-mail 地址格式验证
Mar 28 Javascript
Vue实现PopupWindow组件详解
Apr 28 Javascript
使用async await 封装 axios的方法
Jul 09 Javascript
新手必须知的Node.js 4个JavaScript基本概念
Sep 16 Javascript
详解vue中移动端自适应方案
May 05 Javascript
vue.js实现二级菜单效果
Oct 19 Javascript
详解Vue中的Props与Data细微差别
Mar 02 #Javascript
微信小程序实现音频文件播放进度的实例代码
Mar 02 #Javascript
不刷新网页就能链接新的js文件方法总结
Mar 01 #Javascript
vue学习笔记之slot插槽用法实例分析
Feb 29 #Javascript
vue学习笔记之Vue中css动画原理简单示例
Feb 29 #Javascript
Vue组件化开发之通用型弹出框的实现
Feb 28 #Javascript
在vue项目实现一个ctrl+f的搜索功能
Feb 28 #Javascript
You might like
深入了解php4(2)--重访过去
2006/10/09 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
php 基础函数
2017/02/10 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
element-ui 关于获取select 的label值方法
2018/08/24 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
python打开音乐文件的实例方法
2020/07/21 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
工厂保洁员岗位职责
2013/12/04 职场文书
质检部职责
2013/12/28 职场文书
自动化职业生涯规划书范文
2014/01/03 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
2015年党性分析材料
2014/12/19 职场文书
公证书格式
2015/01/23 职场文书
感恩的心主题班会
2015/08/12 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
Java实现多文件上传功能
2021/06/30 Java/Android
JavaScript 数组去重详解
2021/09/15 Javascript