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 相关文章推荐
javascript 支持ie和firefox杰奇翻页函数
Jul 22 Javascript
JavaScript实现拼音排序的方法
Nov 20 Javascript
Jquery动态替换div内容及动态展示的方法
Jan 23 Javascript
jQuery实现伪分页的方法分享
Feb 17 Javascript
javascript事件处理模型实例说明
May 31 Javascript
AngularJS中$watch和$timeout的使用示例
Sep 20 Javascript
Vue Ajax跨域请求实例详解
Jun 20 Javascript
bootstrap table服务端实现分页效果
Aug 10 Javascript
详解Angular6.0使用路由步骤(共7步)
Jun 29 Javascript
JQuery通过后台获取数据遍历到前台的方法
Aug 13 jQuery
Node.js搭建WEB服务器的示例代码
Aug 15 Javascript
vue开发简单上传图片功能
Jun 30 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中的string类型使用说明
2010/07/27 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
jquery 学习笔记一
2010/04/07 Javascript
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
2014/01/14 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
vue-router相关基础知识及工作原理
2018/03/16 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
微信小程序仿朋友圈发布动态功能
2018/07/15 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
python判断windows隐藏文件的方法
2014/03/21 Python
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
Harman Audio官方商店:购买JBL、Harman Kardon、Infinity和AKG
2019/12/05 全球购物
经典优秀个人求职信分享
2013/12/12 职场文书
合作投资意向书
2014/04/01 职场文书
诚信承诺书模板
2014/05/26 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
节约用水广告语60条
2019/11/14 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
Python学习开发之图形用户界面详解
2021/08/23 Python