百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换

javascript 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<script>
			
		  /**
			 * 
			 * 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和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)的转换
			 * 即 百度 转 谷歌、高德
			 * @param bd_lon
			 * @param bd_lat
			 * @returns {*[]}
			 */
			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) 的转换
			 * 即谷歌、高德 转 百度
			 * @param lng
			 * @param lat
			 * @returns {*[]}
			 */
			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
			 * @param lng
			 * @param lat
			 * @returns {*[]}
			 */
			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
			 * @param lng
			 * @param lat
			 * @returns {*[]}
			 */
			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
			}
			
			/**
			 * 判断是否在国内,不在国内则不做偏移
			 * @param lng
			 * @param lat
			 * @returns {boolean}
			 */
			function out_of_china(lng, lat) {
			    return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
			}
			
			
	var zb =  [[117.18081017153435,39.180351072353005],[117.18869831274674,39.172327705878956],[117.19865736657812,39.162310151786585],[117.19867418187522,39.16206056849401],[117.19861652942734,39.161933913947195],[117.19128459695293,39.15406191112996],[117.18436695927721,39.14805767152242],[117.18409784984459,39.14760548894955],[117.18368777833075,39.14736200482281],[117.17579902867737,39.14568051561204],[117.17517219175295,39.145291603176815],[117.17454535482852,39.1447860137979],[117.17409403224167,39.14400817689392],[117.17354912836254,39.142786952618906],[117.17350905478082,39.141150049556416],[117.17354912836254,39.1406216739866],[117.17368305709431,39.13841120991569],[117.17377790333029,39.13808016680974],[117.17456038476769,39.137742991676106],[117.17470265412027,39.13758972971803],[117.17471846182542,39.13651688666937],[117.17471869877892,39.13622798955586],[117.17437302902323,39.12927034970724],[117.17335825329019,39.12055515945039],[117.1734196029791,39.11326106865883],[117.17308446162815,39.100752269326904],[117.1730419555326,39.09499586854889],[117.17611745748218,39.07799577159699],[117.17740039157604,39.072955172895945],[117.17820999825722,39.070710375407],[117.1791583946569,39.0690581588394],[117.1805231602064,39.06781897103181],[117.18235055814654,39.06618464659786],[117.18547441310773,39.06222084933921],[117.18688465058597,39.0597650746997],[117.18764799403016,39.057286351047026],[117.18838820585404,39.05460995027451],[117.18894336472226,39.052436422659895],[117.18909008942717,39.050849520419234],[117.18909008942717,39.048999233208264],[117.18911322104753,39.04718482683441],[117.18914892971304,39.0439627481033],[117.18914892971304,39.03983056922391],[117.18933398266853,39.03785422432469],[117.19016672097013,39.03706367088628],[117.19236308813385,39.03667310300159],[117.19639785932725,39.03594429210341],[117.19971203374354,39.035305706070375],[117.20266653031513,39.034766894616865],[117.2052896766898,39.034282952274765],[117.20811571689006,39.03380400203159],[117.21107021346171,39.03322526615625],[117.21153265640226,39.032985787855836],[117.21150696512876,39.031868211725424],[117.21166111277557,39.02913406704522],[117.21171247447069,39.02725670009224],[117.21168678319526,39.026198908820135],[117.21130141407707,39.0250013901649],[117.21050498456736,39.02412319692388],[117.21009392417375,39.0234645448339],[117.20968286378218,39.02274600828264],[117.20981132015356,39.020550434681695],[117.20997778083591,39.016765575794864],[117.21013623909391,39.013219745822965],[117.21019962239666,39.01065875805031],[117.21023563653279,39.01012983796761],[117.21150330258968,39.008824673767435],[117.21277096864776,39.00759336470858],[117.21391186809927,39.006829942327784],[117.21587675048852,39.00609113863044],[117.21838039095218,39.00532770003693],[117.21940778292611,39.00499564334342],[117.22035853246945,39.00366575664913],[117.2212775903613,39.00154773733959],[117.22257694806956,38.998863179892965],[117.22330585605204,38.99699131810107],[117.22357150165982,38.994245917197304],[117.22357150165982,38.99286656541702],[117.22334966010027,38.991019177169505],[117.2229376686314,38.98860518385564],[117.22235630852248,38.98602480802788],[117.22226123356836,38.98496554228058],[117.22305352485364,38.98370918328854],[117.22416273265497,38.98210790911887],[117.22660298981464,38.98067904928331],[117.2289481720216,38.97942261422247],[117.2312848656959,38.978082757127055],[117.2353097054285,38.97596397212331],[117.23876409543425,38.97404222857523],[117.24033427181308,38.97312217637892]];
            var zhzb =[];
            for(var i = 0; i< zb.length;i++){
            	
             var lng = zb[i][0];
             var lat = zb[i][1];
           //  console.log(lng+"--------------------------"+lat)
             var abn = wgs84togcj02(lng,lat);
            // console.log(abn)
             zhzb.push(abn);
            	
            }
            console.log("高德坐标-gcj02------   "+JSON.stringify(zhzb));
            
            
            
            var baidu =[];
            for(var i = 0; i< zhzb.length;i++){
            	
             var lng = zhzb[i][0];
             var lat = zhzb[i][1];
            // console.log(lng+"--------------------------"+lat)
             var abn = gcj02tobd09(lng,lat);
           //  console.log(abn)
             baidu.push(abn);
            	
            }

             console.log("百度坐标-bd09------   "+JSON.stringify(baidu));
            
		</script>
	</body>
</html>

84坐标直接转换成百度坐标系

javascript 复制代码
            var x_PI = 3.14159265358979324 * 3000.0 / 180.0;
			var PI = 3.1415926535897932384626;
			var a = 6378245.0;
			var ee = 0.00669342162296594323;

			function wgs84tobd(lng, lat) {
			        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 lat = lat + dlat;
			        var lng = lng + dlng;
			            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]
			}

            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
			}

var gg = wgs84tobd(119.86,39.56); //调用转换的方法输入的是84坐标系 返回的是百度坐标系
		console.log(gg);
相关推荐
一路向前的月光2 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   2 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d
Fan_web2 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
Jiaberrr3 小时前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui
安冬的码畜日常5 小时前
【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)
开发语言·前端·javascript·信息可视化·数据可视化·d3.js
太阳花ˉ5 小时前
html+css+js实现step进度条效果
javascript·css·html
john_hjy6 小时前
11. 异步编程
运维·服务器·javascript
风清扬_jd6 小时前
Chromium 中JavaScript Fetch API接口c++代码实现(二)
javascript·c++·chrome
yanlele6 小时前
前瞻 - 盘点 ES2025 已经定稿的语法规范
前端·javascript·代码规范