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二维数组采用定义数组的数组来实现
Dec 09 Javascript
使用jQuery同时控制四张图片的伸缩实现代码
Apr 19 Javascript
JavaScript动态改变表格单元格内容的方法
Mar 30 Javascript
coffeescript使用的方式汇总
Aug 05 Javascript
详解angularJs中自定义directive的数据交互
Jan 13 Javascript
React服务端渲染(总结)
Jul 01 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
Aug 31 Javascript
Javascript中parseInt的正确使用方式
Oct 17 Javascript
Puppeteer 爬取动态生成的网页实战
Nov 14 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
Jul 04 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
Oct 26 jQuery
JavaScript如何实现监听键盘输入和鼠标监点击
Jul 20 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中慎用双等于(==)的详解
2013/06/06 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
jQuery scroll事件实现监控滚动条分页示例
2014/04/04 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
JS中touchstart事件与click事件冲突的解决方法
2018/03/12 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
python fabric实现远程部署
2017/01/05 Python
python实现贪吃蛇小游戏
2020/03/21 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
python 字典操作提取key,value的方法
2019/06/26 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
python文件读写代码实例
2019/10/21 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
意大利奢侈品网站:Italist
2016/08/23 全球购物
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
我的画教学反思
2014/04/28 职场文书
家长评语怎么写
2014/12/30 职场文书
银行催款通知书
2015/04/17 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS