百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
在项目中面对不同的坐标体系,在地图上显示多多少少都会有点偏差,下面是使用javascript写的转换方法,具体代码如下所示:
//定义一些常量 varx_PI=3.14159265358979324*3000.0/180.0; varPI=3.1415926535897932384626; vara=6378245.0; varee=0.00669342162296594323; /** *百度坐标系(BD-09)与火星坐标系(GCJ-02)的转换 *即百度转谷歌、高德 *@parambd_lon *@parambd_lat *@returns{*[]} */ functionbd09togcj02(bd_lon,bd_lat){ varx_pi=3.14159265358979324*3000.0/180.0; varx=bd_lon-0.0065; vary=bd_lat-0.006; varz=Math.sqrt(x*x+y*y)-0.00002*Math.sin(y*x_pi); vartheta=Math.atan2(y,x)-0.000003*Math.cos(x*x_pi); vargg_lng=z*Math.cos(theta); vargg_lat=z*Math.sin(theta); return[gg_lng,gg_lat] } /** *火星坐标系(GCJ-02)与百度坐标系(BD-09)的转换 *即谷歌、高德转百度 *@paramlng *@paramlat *@returns{*[]} */ functiongcj02tobd09(lng,lat){ varz=Math.sqrt(lng*lng+lat*lat)+0.00002*Math.sin(lat*x_PI); vartheta=Math.atan2(lat,lng)+0.000003*Math.cos(lng*x_PI); varbd_lng=z*Math.cos(theta)+0.0065; varbd_lat=z*Math.sin(theta)+0.006; return[bd_lng,bd_lat] } /** *WGS84转GCj02 *@paramlng *@paramlat *@returns{*[]} */ functionwgs84togcj02(lng,lat){ if(out_of_china(lng,lat)){ return[lng,lat] } else{ vardlat=transformlat(lng-105.0,lat-35.0); vardlng=transformlng(lng-105.0,lat-35.0); varradlat=lat/180.0*PI; varmagic=Math.sin(radlat); magic=1-ee*magic*magic; varsqrtmagic=Math.sqrt(magic); dlat=(dlat*180.0)/((a*(1-ee))/(magic*sqrtmagic)*PI); dlng=(dlng*180.0)/(a/sqrtmagic*Math.cos(radlat)*PI); varmglat=lat+dlat; varmglng=lng+dlng; return[mglng,mglat] } } /** *GCJ02转换为WGS84 *@paramlng *@paramlat *@returns{*[]} */ functiongcj02towgs84(lng,lat){ if(out_of_china(lng,lat)){ return[lng,lat] } else{ vardlat=transformlat(lng-105.0,lat-35.0); vardlng=transformlng(lng-105.0,lat-35.0); varradlat=lat/180.0*PI; varmagic=Math.sin(radlat); magic=1-ee*magic*magic; varsqrtmagic=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] } } functiontransformlat(lng,lat){ varret=-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; returnret } functiontransformlng(lng,lat){ varret=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; returnret } /** *判断是否在国内,不在国内则不做偏移 *@paramlng *@paramlat *@returns{boolean} */ functionout_of_china(lng,lat){ return(lng<72.004||lng>137.8347)||((lat<0.8293||lat>55.8271)||false); } //使用示例 //gps坐标转火星坐标 varlng_lat_1=wgs84togcj02(113.912743,22.497629); console.log('火星坐标...',lng_lat_1); //火星坐标转百度坐标 varlng_lat_2=gcj02tobd09(lng_lat_1[0],lng_lat_1[1]); console.log('百度坐标...',lng_lat_2);