PHP 百度地图腾讯地图坐标转换

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 —— 火星坐标

坐标转换方式

  1. 可以通过算法来转换
  2. 可以通过Web API来转换
  3. 可以通过第三方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);
}

发表评论