最近想帮公司线下的门店采集一下经纬度,标注在地图上,一研究居然地图还有这么多标准,现总结相关知识如下,首先了解一下当前互联网地图的坐标系现状
一、坐标系介绍
1. 地球坐标 (WGS84)
- 国际标准,从专业GPS 设备中取出的数据的坐标系
- 国际地图提供商使用的坐标系
2. 火星坐标 (GCJ-02)也叫国测局坐标系
- 中国标准,从国行移动设备中定位获取的坐标数据使用这个坐标系
- 国家规定: 国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密。
- 腾讯地图用的也是GCJ02坐标
3. 百度坐标 (BD-09)
- 百度标准,百度 SDK,百度地图,Geocoding 使用
- (本来就乱了,百度又在火星坐标上来个二次加密)
二、PHP 代码
<?php
$lng=floatval(112.618056);//用变量替换时注意数据类型
$lat=floatval(37.858867);
$locXY=Convert_GCJ02_To_BD09($lng,$lat);
$content="百度地图坐标系,经度:".$locXY['lng'].";纬度:".$locXY['lat'];
echo $content;
/**
* 中国正常GCJ02坐标-->百度地图BD09坐标
* 腾讯地图用的也是GCJ02坐标
* @param double $lng 经度
* @param double $lat 纬度
*/
function Convert_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);
}
?>
大家可以通过此工具来验证准确性:百度地图拾取坐标系统
参考资料:
http://cnodejs.org/topic/564c0a27e4766d487f6fe38d
http://www.open-open.com/code/view/1440854840138