wgs84 转百度地图坐标

216 阅读1分钟

`<?php

/* lng="112°4723.16";lng = "112°47′23.16″"; lat = "36°49′47.31″";

// 度分秒转十进制度 lng=CoordinateTransform::degreeMinuteSecondToDecimal(lng = CoordinateTransform::degreeMinuteSecondToDecimal(lng); lat=CoordinateTransform::degreeMinuteSecondToDecimal(lat = CoordinateTransform::degreeMinuteSecondToDecimal(lat); // var_dump(array(lng,lng,lat)); lng=111.655390;lng='111.655390'; lat='40.802057'; // var_dump(array(lng,lng,lat)); // 本地函数经纬度转换 var_dump(CoordinateTransform::wgs84ToBd09(lng,lng, lat));

*/

/**

  • wgs84 转百度地图坐标
  • @param $lng
  • @param $lat
  • @return array
  • lbsyun.baidu.com/index.php?t… */ function toBaiduLocation(lng,lng,lat){ ak=Ag9hndVu8E1I30MH0GfIyPy17gnPVZPw;ak = 'Ag9hndVu8E1I30MH0GfIyPy17gnPVZPw'; url = 'api.map.baidu.com/geoconv/v1/…; result=curlrequest(result = curl_request(url); // var_dump(url);//vardump(url); // var_dump(result); json=jsondecode(json = json_decode(result,true); if(json['status'] == 0 && isset(json['result'][0])){ res=res = json['result'][0]; return array('lng'=>res[x],lat=>res['x'],'lat'=>res['y']); } return array('lng'=>lng,lat=>lng,'lat'=>lat); }

if (!function_exists('curl_request')) { //参数1:访问的URL,参数2:post数据(不填则为GET),参数3:提交的cookies,参数4:是否返回cookies,参数4:是否返回cookies function curl_request(url,url,post='',cookie=,cookie='', returnCookie=0){ curl=curlinit();curlsetopt(curl = curl_init(); curl_setopt(curl, CURLOPT_URL, url);curlsetopt(url); curl_setopt(curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'); curl_setopt(curl,CURLOPTFOLLOWLOCATION,1);curlsetopt(curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt(curl, CURLOPT_AUTOREFERER, 1); curl_setopt(curl,CURLOPTREFERER,"http://XXX");if(curl, CURLOPT_REFERER, "http://XXX"); if(post) { curl_setopt(curl,CURLOPTPOST,1);curlsetopt(curl, CURLOPT_POST, 1); curl_setopt(curl, CURLOPT_POSTFIELDS, http_build_query(post)); } if(cookie) { curl_setopt(curl,CURLOPTCOOKIE,curl, CURLOPT_COOKIE, cookie); } curl_setopt(curl,CURLOPTHEADER,curl, CURLOPT_HEADER, returnCookie); curl_setopt(curl,CURLOPTTIMEOUT,10);curlsetopt(curl, CURLOPT_TIMEOUT, 10); curl_setopt(curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt(curl,CURLOPTSSLVERIFYPEER,false);curl, CURLOPT_SSL_VERIFYPEER, false); data = curl_exec(curl);if(curlerrno(curl); if (curl_errno(curl)) { return curl_error(curl); } curl_close(curl); if(returnCookie){ list(header, body)=explode("\n˚\n˚",body) = explode("\r\n\r\n", data, 2); preg_match_all("/Set-Cookie:([^;]*);/", header,header, matches); info[cookie]=substr(info['cookie'] = substr(matches[1][0], 1); info[content]=info['content'] = body; return info; }else{ return data; } }

}

// res=toBaiduLocation(res = toBaiduLocation(lng, lat);//vardump(lat); // var_dump(res);

// 坐标转换库 class CoordinateTransform { const x_PI = 3.14159265358979324 * 3000.0 / 180.0; const PI = 3.1415926535897932384626; const a = 6378245.0; const ee = 0.00669342162296594323;

/**
 * 度分秒转十进制度
 * @param $deg
 * @return bool|float|int|mixed|string
 */
public static function degreeMinuteSecondToDecimal($deg)
{
    $_oldCon = $deg;
    $deg = rtrim(str_replace(['‘’', '’‘', '’', '°', '′', '″', ''', '“', '”'], '.', $deg), '.');
    $pointCount = substr_count($deg, '.');
    if ($pointCount == 1) { // 形如: 111.23412 需要生成第二个点
        if ($_oldCon == $deg) return $deg;
        [$str1, $str2] = explode('.', $deg);
        if (strlen($str2) > 2) {
            $str2 = substr($str2, 0, 2).'.'.substr($str2, 2);
            $deg = $str1.'.'.$str2;
        }
    } else if ($pointCount == 2) {
        $deg .= '.0';
    }

    try {
        // 形如: 111.23.412 或 111.23.41.2
        [$deg1, $deg2, $deg3] = explode('.', $deg, 3);

        $deg = $deg1 + $deg2/60 + $deg3/3600;
        return $deg;

    } catch (\Exception $e) {
        return false;
    }
}

/**
 * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
 * 即 百度 转 谷歌、高德
 * @param $bdLon float|string
 * @param $bdLat float|string
 * @return array
 */
public static function bd09ToGcj02($bdLon, $bdLat)
{
    $x = $bdLon - 0.0065;
    $y = $bdLat - 0.006;
    $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * self::PI);
    $theta = atan2($y, $x) - 0.000003 * cos($x * self::PI);
    $gg_lng = $z * cos($theta);
    $gg_lat = $z * sin($theta);
    // Point point=new Point($gg_lng, $gg_lat);
    // return point;
    return [$gg_lng, $gg_lat];
}

/**
 * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
 * 即谷歌、高德 转 百度
 * @param $lng float|string
 * @param $lat float|string
 * @return array
 */
public static function gcj02ToBd09($lng, $lat)
{
    $z = sqrt($lng * $lng + $lat * $lat) + 0.00002 * sin($lat * self::PI);
    $theta = atan2($lat, $lng) + 0.000003 * cos($lng * self::PI);
    $bd_lng = $z * cos($theta) + 0.0065;
    $bdLat = $z * sin($theta) + 0.006;
    //Point point=new Point(bd_$lng, $bdLat);
    // return point;
    return [$bd_lng, $bdLat];
}

/**
 * WGS84转GCj02
 * @param $lng float|string
 * @param $lat float|string
 * @return array
 */
public static function wgs84ToGcj02($lng, $lat)
{
    $dlat = self::transformlat($lng - 105.0, $lat - 35.0);
    $dlng = self::transformlng($lng - 105.0, $lat - 35.0);
    $radlat = $lat / 180.0 * self::PI;
    $magic = sin($radlat);
    $magic = 1 - self::ee * $magic * $magic;
    $sqrtmagic = sqrt($magic);
    $dlat = ($dlat * 180.0) / ((self::a * (1 - self::ee)) / ($magic * $sqrtmagic) * self::PI);
    $dlng = ($dlng * 180.0) / (self::a / $sqrtmagic * cos($radlat) * self::PI);
    $mglat = $lat + $dlat;
    $mglng = $lng + $dlng;
    //Point point=new Point($mglng, $mglat);
    // return point;
    return [$mglng, $mglat];
}

/**
 * GCJ02 转换为 WGS84
 * @param $lng float|string
 * @param $lat float|string
 * @return array
 */
public function gcj02ToWgs84($lng, $lat)
{
    $dlat = self::transformlat($lng - 105.0, $lat - 35.0);
    $dlng = self::transformlng($lng - 105.0, $lat - 35.0);
    $radlat = $lat / 180.0 * self::PI;
    $magic = sin($radlat);
    $magic = 1 - self::ee * $magic * $magic;
    $sqrtmagic = sqrt($magic);
    $dlat = ($dlat * 180.0) / ((self::a * (1 - self::ee)) / ($magic * $sqrtmagic) * self::PI);
    $dlng = ($dlng * 180.0) / (self::a / $sqrtmagic * cos($radlat) * self::PI);
    $mglat = $lat + $dlat;
    $mglng = $lng + $dlng;
    // Point point=new Point($mglng, $mglat);
    // return point;
    return [$mglat, $mglng];
}

/**
 * WGS84 转换为 BD-09
 * @param $lng float|string
 * @param $lat float|string
 * @return array
 */
public static function wgs84ToBd09($lng, $lat)
{
    //第一次转换
    $dlat = self::transformlat($lng - 105.0, $lat - 35.0);
    $dlng = self::transformlng($lng - 105.0, $lat - 35.0);
    $radlat = $lat / 180.0 * self::PI;
    $magic = sin($radlat);
    $magic = 1 - self::ee * $magic * $magic;
    $sqrtmagic = sqrt($magic);
    $dlat = ($dlat * 180.0) / ((self::a * (1 - self::ee)) / ($magic * $sqrtmagic) * self::PI);
    $dlng = ($dlng * 180.0) / (self::a / $sqrtmagic * cos($radlat) * self::PI);
    $mglat = $lat + $dlat;
    $mglng = $lng + $dlng;

    //第二次转换
    $z = sqrt($mglng * $mglng + $mglat * $mglat) + 0.00002 * sin($mglat * self::x_PI);
    $theta = atan2($mglat, $mglng) + 0.000003 * cos($mglng * self::x_PI);
    $bd_lng = $z * cos($theta) + 0.0065;
    $bdLat = $z * sin($theta) + 0.006;
    return [$bd_lng, $bdLat];
}

private static function transformlat($lng, $lat)
{
    $ret = -100.0 + 2.0 * $lng + 3.0 * $lat + 0.2 * $lat * $lat + 0.1 * $lng * $lat + 0.2 * sqrt(abs($lng));
    $ret += (20.0 * sin(6.0 * $lng * self::PI) + 20.0 * sin(2.0 * $lng * self::PI)) * 2.0 / 3.0;
    $ret += (20.0 * sin($lat * self::PI) + 40.0 * sin($lat / 3.0 * self::PI)) * 2.0 / 3.0;
    $ret += (160.0 * sin($lat / 12.0 * self::PI) + 320 * sin($lat * self::PI / 30.0)) * 2.0 / 3.0;
    return $ret;
}

private static function transformlng($lng, $lat)
{
    $ret = 300.0 + $lng + 2.0 * $lat + 0.1 * $lng * $lng + 0.1 * $lng * $lat + 0.1 * sqrt(abs($lng));
    $ret += (20.0 * sin(6.0 * $lng * self::PI) + 20.0 * sin(2.0 * $lng * self::PI)) * 2.0 / 3.0;
    $ret += (20.0 * sin($lng * self::PI) + 40.0 * sin($lng / 3.0 * self::PI)) * 2.0 / 3.0;
    $ret += (150.0 * sin($lng / 12.0 * self::PI) + 300.0 * sin($lng / 30.0 * self::PI)) * 2.0 / 3.0;
    return $ret;
}

}

?> `