不同经纬度转换
前言:
在项目中很多时候都会遇见不同经纬度之间的转换,调用方法就行
1 (function (root, factory) { 2 if (typeof define === 'function' && define.amd) { 3 // AMD. Register as an anonymous module. 4 define([], factory); 5 } else if (typeof module === 'object' && module.exports) { 6 // Node. Does not work with strict CommonJS, but 7 // only CommonJS-like environments that support module.exports, 8 // like Node. 9 module.exports = factory(); 10 } else { 11 // Browser globals (root is window) 12 root.coordtransform = factory(); 13 } 14 }(this, function () { 15 //定义一些常量 16 var x_PI = 3.14159265358979324 * 3000.0 / 180.0; 17 var PI = 3.1415926535897932384626; 18 var a = 6378245.0; 19 var ee = 0.00669342162296594323; 20 /** 21 * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 22 * 即 百度 转 谷歌、高德 23 * @param bd_lon 24 * @param bd_lat 25 * @returns {*[]} 26 */ 27 var bd09togcj02 = function bd09togcj02(bd_lon, bd_lat, callbalk) { 28 var bd_lon = +bd_lon; 29 var bd_lat = +bd_lat; 30 var x = bd_lon - 0.0065; 31 var y = bd_lat - 0.006; 32 var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI); 33 var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI); 34 var gg_lng = z * Math.cos(theta); 35 var gg_lat = z * Math.sin(theta); 36 var longLat = [gg_lng, gg_lat] 37 callbalk(longLat); 38 return longLat 39 }; 40 41 /** 42 * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 43 * 即谷歌、高德 转 百度 44 * @param lng 45 * @param lat 46 * @returns {*[]} 47 */ 48 var gcj02tobd09 = function gcj02tobd09(lng, lat, callbalk) { 49 var lat = +lat; 50 var lng = +lng; 51 var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI); 52 var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI); 53 var bd_lng = z * Math.cos(theta) + 0.0065; 54 var bd_lat = z * Math.sin(theta) + 0.006; 55 var longLat = [bd_lng,bd_lat] 56 callbalk(longLat); 57 return longLat 58 }; 59 60 /** 61 * WGS84转GCj02 62 * @param lng 63 * @param lat 64 * @returns {*[]} 65 */ 66 var wgs84togcj02 = function wgs84togcj02(lng, lat, callbalk) { 67 var lat = +lat; 68 var lng = +lng; 69 if (out_of_china(lng, lat)) { 70 var longLat = [lng, lat] 71 callbalk(longLat); 72 return longLat 73 } else { 74 var dlat = transformlat(lng - 105.0, lat - 35.0); 75 var dlng = transformlng(lng - 105.0, lat - 35.0); 76 var radlat = lat / 180.0 * PI; 77 var magic = Math.sin(radlat); 78 magic = 1 - ee * magic * magic; 79 var sqrtmagic = Math.sqrt(magic); 80 dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); 81 dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); 82 var mglat = lat + dlat; 83 var mglng = lng + dlng; 84 var longLat = [mglng, mglat] 85 callbalk(longLat); 86 return longLat 87 } 88 }; 89 90 /** 91 * GCJ02 转换为 WGS84 92 * @param lng 93 * @param lat 94 * @returns {*[]} 95 */ 96 var gcj02towgs84 = function gcj02towgs84(lng, lat, callbalk) { 97 var lat = +lat; 98 var lng = +lng; 99 if (out_of_china(lng, lat)) { 100 var longLat = [lng, lat] 101 callbalk(longLat); 102 return longLat 103 } else { 104 var dlat = transformlat(lng - 105.0, lat - 35.0); 105 var dlng = transformlng(lng - 105.0, lat - 35.0); 106 var radlat = lat / 180.0 * PI; 107 var magic = Math.sin(radlat); 108 magic = 1 - ee * magic * magic; 109 var sqrtmagic = Math.sqrt(magic); 110 dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); 111 dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); 112 var mglat = lat + dlat; 113 var mglng = lng + dlng; 114 var longLat = [lng * 2 - mglng, lat * 2 - mglat]; 115 callbalk(longLat); 116 return longLat 117 } 118 }; 119 120 var transformlat = function transformlat(lng, lat) { 121 var lat = +lat; 122 var lng = +lng; 123 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)); 124 ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; 125 ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; 126 ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; 127 return ret 128 }; 129 130 var transformlng = function transformlng(lng, lat) { 131 var lat = +lat; 132 var lng = +lng; 133 var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); 134 ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; 135 ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; 136 ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; 137 return ret 138 }; 139 140 /** 141 * 判断是否在国内,不在国内则不做偏移 142 * @param lng 143 * @param lat 144 * @returns {boolean} 145 */ 146 var out_of_china = function out_of_china(lng, lat) { 147 var lat = +lat; 148 var lng = +lng; 149 // 纬度3.86~53.55,经度73.66~135.05 150 return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55); 151 }; 152 }));