百度、高德、谷歌、火星、wgs84(2000)地圖坐標相互轉換的JS實現


一、調用例子: 
<!DOCTYPE html>
<html lang= "en" >
<head>
     <meta charset= "UTF-8" >
     <title>coordTransform</title>
</head>
<body>
<h1>請按F12打開控制台查看結果</h1>
<script src= "coordtransform.js" ></script>
<script>
     //國測局坐標(火星坐標,比如高德地圖在用),百度坐標,wgs84坐標(谷歌國外以及絕大部分國外在線地圖使用的坐標)
     //百度經緯度坐標轉國測局坐標
     var  bd09togcj02 = coordtransform.bd09togcj02(116.404, 39.915);
//國測局坐標轉百度經緯度坐標
var  gcj02tobd09 = coordtransform.gcj02tobd09(116.404, 39.915);
//wgs84轉國測局坐標
var  wgs84togcj02 = coordtransform.wgs84togcj02(116.404, 39.915);
//國測局坐標轉wgs84坐標
var  gcj02towgs84 = coordtransform.gcj02towgs84(116.404, 39.915);
console.log(bd09togcj02);
console.log(gcj02tobd09);
console.log(wgs84togcj02);
console.log(gcj02towgs84);
//result
//bd09togcj02:   [ 116.39762729119315, 39.90865673957631 ]
//gcj02tobd09:   [ 116.41036949371029, 39.92133699351021 ]
//wgs84togcj02:  [ 116.41024449916938, 39.91640428150164 ]
//gcj02towgs84:  [ 116.39775550083061, 39.91359571849836 ]
</script>
</body>
</html>
 

二、相關函數

coordtransform.js

 

/**

  * Created by Wandergis on 2015/7/8.
  * 提供了百度坐標(BD09)、國測局坐標(火星坐標,GCJ02)、和WGS84坐標系之間的轉換
  * coordtransform.js
  */
//UMD魔法代碼
// if the module has no dependencies, the above pattern can be simplified to
( function  (root, factory) {
     if  ( typeof  define ===  'function'  && define.amd) {
         // AMD. Register as an anonymous module.
         define([], factory);
     else  if  ( typeof  module ===  'object'  && module.exports) {
         // Node. Does not work with strict CommonJS, but
         // only CommonJS-like environments that support module.exports,
         // like Node.
         module.exports = factory();
     else  {
         // Browser globals (root is window)
         root.coordtransform = factory();
     }
}( this function  () {
     //定義一些常量
     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)的轉換
      * 即 百度 轉 谷歌、高德
      * @param bd_lon
      * @param bd_lat
      * @returns {*[]}
      */
     var  bd09togcj02 =  function  bd09togcj02(bd_lon, bd_lat) {
         var  bd_lon = +bd_lon;
         var  bd_lat = +bd_lat;
         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) 的轉換
      * 即谷歌、高德 轉 百度
      * @param lng
      * @param lat
      * @returns {*[]}
      */
     var  gcj02tobd09 =  function  gcj02tobd09(lng, lat) {
         var  lat = +lat;
         var  lng = +lng;
         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
      * @param lng
      * @param lat
      * @returns {*[]}
      */
     var  wgs84togcj02 =  function  wgs84togcj02(lng, lat) {
         var  lat = +lat;
         var  lng = +lng;
         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
      * @param lng
      * @param lat
      * @returns {*[]}
      */
     var  gcj02towgs84 =  function  gcj02towgs84(lng, lat) {
         var  lat = +lat;
         var  lng = +lng;
         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  [lng * 2 - mglng, lat * 2 - mglat]
         }
     };
  
     var  transformlat =  function  transformlat(lng, lat) {
         var  lat = +lat;
         var  lng = +lng;
         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
     };
  
     var  transformlng =  function  transformlng(lng, lat) {
         var  lat = +lat;
         var  lng = +lng;
         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
     };
  
     /**
      * 判斷是否在國內,不在國內則不做偏移
      * @param lng
      * @param lat
      * @returns {boolean}
      */
     var  out_of_china =  function  out_of_china(lng, lat) {
         var  lat = +lat;
         var  lng = +lng;
         // 緯度3.86~53.55,經度73.66~135.05
         return  !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
     };
  
     return  {
         bd09togcj02: bd09togcj02,
         gcj02tobd09: gcj02tobd09,
         wgs84togcj02: wgs84togcj02,
         gcj02towgs84: gcj02towgs84
     }
}));
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM