业务场景:微信公众号中获取用户位置信息后在百度地图上标注出来。由于百度用的自己的(BD09)坐标系,腾讯用的火星(gcj02)坐标系,不转换直接定位会有很大的偏差。其实gcj02是中国标准坐标系,国内大部分的地图厂商都是gcj02坐标系。所以只要是gcj02坐标系地图厂商,都可以用该算法和百度(BD09)坐标系互换。
小提示:谷歌地图用的是wgs84的gps坐标,转换国内的地图坐标也需要用相关算法转换
疑问:为什么要用微信API获取而不直接用百度API获取?
在微信中用百度api获取每次打开都要弹出“xxxx.com想要获取您当前位置。。。”的授权提示,如果用户一不小心点了取消,想在启用就很麻烦,而微信API只要授权一次就不会在弹出授权提示了。
javascript转换算法,来源网络
// 腾讯(gcj02)坐标转换百度(BD09)坐标
function gcj02_to_bd09(lng, lat) {
if (lng == null || lng == '' || lat == null || lat == '') return [0, 0];
var x_pi = 3.14159265358979324;
var x = parseFloat(lng);
var y = parseFloat(lat);
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 lng = (z * Math.cos(theta) + 0.0065).toFixed(5);
var lat = (z * Math.sin(theta) + 0.006).toFixed(5);
return [lng, lat];
}
// 百度(BD09)坐标转换腾讯(gcj02)坐标
function bd09_to_gcj02(lng, lat) {
if (lng == null || lng == '' || lat == null || lat == '') return [0, 0];
var x_pi = 3.14159265358979324;
var x = parseFloat(lng) - 0.0065;
var y = parseFloat(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 lng = (z * Math.cos(theta)).toFixed(7);
var lat = (z * Math.sin(theta)).toFixed(7);
return [lng, lat];
}
php转换算法,来源网络
//腾讯(gcj02)坐标转换百度(BD09)坐标
function gcj02_to_bd09($lng, $lat){
$x_pi = 3.14159265358979324 * 3000.0 / 180.0;
$x = $lng;
$y = $lat;
$z =sqrt($x * $x + $y * $y) + 0.00002 * sin($y * $x_pi);
$theta = atan2($y, $x) + 0.000003 * cos($x * $x_pi);
$lng = $z * cos($theta) + 0.0065;
$lat = $z * sin($theta) + 0.006;
return array('lng'=>$lng,'lat'=>$lat);
}
// 百度(BD09)坐标转换腾讯(gcj02)坐标
function bd09_to_gcj02($lng, $lat){
$x_pi = 3.14159265358979324 * 3000.0 / 180.0;
$x = $lng - 0.0065;
$y = $lat - 0.006;
$z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi);
$theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi);
$lng = $z * cos($theta);
$lat = $z * sin($theta);
return array('lng'=>$lng,'lat'=>$lat);
}