百度坐标(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);