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 16 Javascript
js中遍历对象的属性和值的方法
Jul 27 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
Oct 26 Javascript
深入学习 JavaScript中的函数调用
Mar 23 Javascript
js 数字、字符串、布尔值的转换方法(必看)
Apr 07 Javascript
vuex 项目结构目录及一些简单配置介绍
Apr 08 Javascript
简单的三步vuex入门
May 20 Javascript
详解ES6 Promise对象then方法链式调用
Oct 20 Javascript
Vue中对iframe实现keep alive无刷新的方法
Jul 23 Javascript
ionic2.0双击返回键退出应用
Sep 17 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
Aug 04 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
Nov 03 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
PHP 文件扩展名 获取函数
2009/06/03 PHP
解析php类的注册与自动加载
2013/07/05 PHP
使用PHP curl模拟浏览器抓取网站信息
2013/10/28 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
node.js的Express服务器基本使用教程
2019/01/09 Javascript
python中的内置函数getattr()介绍及示例
2014/07/20 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
2018/02/18 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
财务人员个人自荐信范文
2013/09/26 职场文书
课前三分钟演讲稿
2014/04/24 职场文书
校园元旦活动总结
2014/07/09 职场文书
医院合作协议书
2014/08/19 职场文书
大学生上课迟到检讨书
2014/10/15 职场文书
秋季运动会开幕词
2015/01/28 职场文书
社区重阳节活动总结
2015/03/24 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
工作调动申请报告
2015/05/18 职场文书
升学宴来宾致辞
2015/07/27 职场文书