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 相关文章推荐
S2SH整合JQuery+Ajax实现登录验证功能实现代码
Jan 30 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
Mar 04 Javascript
巧用replace将文字表情替换为图片
Apr 17 Javascript
jQuery绑定事件不执行但alert后可以正常执行
Jun 03 Javascript
Bootstrap进度条组件知识详解
May 01 Javascript
原生js仿jquery animate动画效果
Jul 13 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
Aug 19 Javascript
JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
Jan 05 Javascript
React父子组件间的传值的方法
Nov 13 Javascript
vue+axios实现post文件下载
Sep 25 Javascript
vue自定义标签和单页面多路由的实现代码
May 03 Javascript
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
详解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
php操作SVN版本服务器类代码
2011/11/27 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
vue-router 学习快速入门
2017/03/01 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
Python3并发写文件与Python对比
2019/11/20 Python
简单了解django文件下载方式
2020/02/10 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
python中类与对象之间的关系详解
2020/12/16 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
即将毕业大学生自荐信
2014/01/24 职场文书
医学生就业推荐表自我鉴定
2014/03/26 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
英语感谢信范文
2015/01/20 职场文书
个人自荐书范文
2015/03/09 职场文书
搞笑的婚礼主持词
2015/06/29 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL
python运算符之与用户交互
2022/04/13 Python