业务场景:微信公众号中获取用户位置信息后在百度地图上标注出来。由于百度用的自己的(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);}