PHP 百度地图腾讯地图坐标转换
地图坐标知识科普
- 坐标系统:用于定位的系统,就跟二维笛卡尔坐标系统一样,一个点使用(x,y),就能确定该点在笛卡尔坐标系统中的唯一位置。这里讲的坐标系统,相对于笛卡尔坐标系统,要复杂许多,但作用却都是一样,主要用于定位,也就是精确地定位地表上的一点。
- 地理坐标系统:WGS84就是一种地理坐标系统。地理坐标坐标是对地球进行简单几何建模,比如将地球看成一个球体或者类球体,然后再将地表上点投影到该球面上形成的坐标就是地理坐标系统。WGS84就是定义了如何将地球抽象成球体或者类球体的规则。或者简单地来说,WGS84就是一堆参数,用于建立球体或者类球体,来近似地球。
- 投影坐标系统:由于地球是一个球状,所以一般将其某个区域投影在平面上,形成的坐标系称为投影坐标系。
- WGS84:地理坐标系统,Google Earth和中国外的Google Map使用,另外,目前基本上所有定位空间位置的设备都使用这种坐标系统,例如手机的GPS系统。
- GCJ-02:投影坐标系统,也就是我们平常所说的火星坐标系,Google Map中国、高德和腾讯好像使用,这个是中国自己在WGS84基础上加密而成,目的显而易见。
- BD09:投影坐标系统,百度地图使用,在GCJ-02基础上二次加密而成。
国内各地图API坐标系统
- 百度地图API —— 百度坐标
- 腾讯搜搜地图API —— 火星坐标
- 搜狐搜狗地图API —— 搜狗坐标
- 阿里云地图API —— 火星坐标
- 图吧MapBar地图API —— 图吧坐标
- 高德MapABC地图API —— 火星坐标
- 灵图51ditu地图API —— 火星坐标
坐标转换方式
- 可以通过算法来转换
- 可以通过Web API来转换
- 可以通过第三方SDK API来转换
PHP 坐标转换示例
<?php
/**
* 火星GCJ02坐标---->百度BD09坐标
* @param double $lat 纬度
* @param double $lng 经度
*/
function convertGCJ02ToBD09($lat, $lng)
{
$pi = 3.14159265358979324 * 3000.0 / 180.0;
$x = $lng;
$y = $lat;
$z = sqrt($x * $x + $y * $y) + 0.00002 * sin($y * $pi);
$result = atan2($y, $x) + 0.000003 * cos($x * $pi);
$lng = $z * cos($result) + 0.0065;
$lat = $z * sin($result) + 0.006;
return array('lng' => $lng, 'lat' => $lat);
}
/**
* 百度BD09坐标---->火星GCJ02坐标
* @param double $lat 纬度
* @param double $lng 经度
*/
function convertBD09ToGCJ02($lat, $lng)
{
$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 * $pi);
$result = atan2($y, $x) - 0.000003 * cos($x * $pi);
$lng = $z * cos($result);
$lat = $z * sin($result);
return array('lng' => $lng, 'lat' => $lat);
}