首页  >  文章  >  后端开发  >  使用php如何将百度经纬度转换为腾讯经纬度

使用php如何将百度经纬度转换为腾讯经纬度

PHPz
PHPz原创
2023-04-19 09:21:561107浏览

在开发过程中,我们通常需要将一些地理位置信息进行处理,而不同平台的经纬度格式并不相同,这就需要进行转换。本文将介绍如何将百度经纬度转换为腾讯经纬度,同时使用PHP代码实现。

一、百度经纬度与腾讯经纬度的差异

经纬度是地球表面位置的标志,在不同的定位系统中有不同的表现方式,目前主流的定位系统有以下三种:WGS84、GCJ02和BD09。其中,WGS84是GPS定位系统使用的坐标系,GCJ02是中国国家测绘局制定的地理信息系统的坐标系,也是目前国内各大地图软件必须使用的坐标系,而百度地图则使用BD09。

在使用不同的定位系统时,经纬度的表现也会存在差异,例如一个地点的百度经纬度和腾讯经纬度如下所示:

百度经纬度:116.404,39.915
腾讯经纬度:116.397428,39.908697

二、转换方法

由于百度和腾讯使用的定位系统不同,所以需要通过一定的算法进行经纬度之间的转换。

  1. 将百度坐标系转换为地球坐标系(WGS84)

首先需要将百度坐标系转换为地球坐标系(WGS84),这可以通过百度提供的API实现,代码如下:

<?php
function bd09_to_wgs84($bd_lon,$bd_lat){
    $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    $x = $bd_lon - 0.0065;
    $y = $bd_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(&#39;lng&#39;=>$lng, 'lat'=>$lat);
}
?>
  1. 将地球坐标系(WGS84)转换为火星坐标系(GCJ02)

使用第一步中的函数得到地球坐标系(WGS84)的结果后,需要将其转换为火星坐标系。这可以通过以下代码实现:

<?php
function wgs84_to_gcj02($lng, $lat) {
    $a = 6378245.0;
    $ee = 0.00669342162296594323;
    $dLat = $this->transformLat($lng - 105.0, $lat - 35.0);
    $dLng = $this->transformLng($lng - 105.0, $lat - 35.0);
    $radLat = $lat / 180.0 * pi();
    $magic = sin($radLat);
    $magic = 1 - $ee * $magic * $magic;
    $sqrtMagic = sqrt($magic);
    $dLat = ($dLat * 180.0) / (($a * (1 - $ee)) / ($magic * $sqrtMagic) * pi());
    $dLng = ($dLng * 180.0) / ($a / $sqrtMagic * cos($radLat) * pi());
    $mgLat = $lat + $dLat;
    $mgLng = $lng + $dLng;
    return array('lng'=>$mgLng, 'lat'=>$mgLat);
}
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 * pi()) + 20.0 * sin(2.0 * $lng * pi())) * 2.0 / 3.0;
    $ret += (20.0 * sin($lat * pi()) + 40.0 * sin($lat / 3.0 * pi())) * 2.0 / 3.0;
    $ret += (160.0 * sin($lat / 12.0 * pi()) + 320 * sin($lat * pi() / 30.0)) * 2.0 / 3.0;
    return $ret;
}
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 * pi()) + 20.0 * sin(2.0 * $lng * pi())) * 2.0 / 3.0;
    $ret += (20.0 * sin($lng * pi()) + 40.0 * sin($lng / 3.0 * pi())) * 2.0 / 3.0;
    $ret += (150.0 * sin($lng / 12.0 * pi()) + 300.0 * sin($lng / 30.0 * pi())) * 2.0 / 3.0;
    return $ret;
}
?>
  1. 将火星坐标系(GCJ02)转换为腾讯坐标系

最后一步,将火星坐标系(GCJ02)转换为腾讯坐标系:

<?php
function gcj02_to_tx($lng, $lat) {
    $x = $lng;
    $y = $lat;
    $z = sqrt($x * $x + $y * $y) + 0.00002 * sin($y * pi());
    $theta = atan2($y, $x) + 0.000003 * cos($x * pi());
    $lng = $z * cos($theta) + 0.0065;
    $lat = $z * sin($theta) + 0.006;
    return array(&#39;lng&#39;=>$lng, 'lat'=>$lat);
}
?>

三、完整代码实现

将以上三个步骤结合起来,得到PHP中实现百度经纬度转换为腾讯经纬度的完整代码如下:

<?php
function bd09_to_wgs84($bd_lon,$bd_lat){
    $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    $x = $bd_lon - 0.0065;
    $y = $bd_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(&#39;lng&#39;=>$lng, 'lat'=>$lat);
}

function wgs84_to_gcj02($lng, $lat) {
    $a = 6378245.0;
    $ee = 0.00669342162296594323;
    $dLat = $this->transformLat($lng - 105.0, $lat - 35.0);
    $dLng = $this->transformLng($lng - 105.0, $lat - 35.0);
    $radLat = $lat / 180.0 * pi();
    $magic = sin($radLat);
    $magic = 1 - $ee * $magic * $magic;
    $sqrtMagic = sqrt($magic);
    $dLat = ($dLat * 180.0) / (($a * (1 - $ee)) / ($magic * $sqrtMagic) * pi());
    $dLng = ($dLng * 180.0) / ($a / $sqrtMagic * cos($radLat) * pi());
    $mgLat = $lat + $dLat;
    $mgLng = $lng + $dLng;
    return array('lng'=>$mgLng, 'lat'=>$mgLat);
}
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 * pi()) + 20.0 * sin(2.0 * $lng * pi())) * 2.0 / 3.0;
    $ret += (20.0 * sin($lat * pi()) + 40.0 * sin($lat / 3.0 * pi())) * 2.0 / 3.0;
    $ret += (160.0 * sin($lat / 12.0 * pi()) + 320 * sin($lat * pi() / 30.0)) * 2.0 / 3.0;
    return $ret;
}
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 * pi()) + 20.0 * sin(2.0 * $lng * pi())) * 2.0 / 3.0;
    $ret += (20.0 * sin($lng * pi()) + 40.0 * sin($lng / 3.0 * pi())) * 2.0 / 3.0;
    $ret += (150.0 * sin($lng / 12.0 * pi()) + 300.0 * sin($lng / 30.0 * pi())) * 2.0 / 3.0;
    return $ret;
}

function gcj02_to_tx($lng, $lat) {
    $x = $lng;
    $y = $lat;
    $z = sqrt($x * $x + $y * $y) + 0.00002 * sin($y * pi());
    $theta = atan2($y, $x) + 0.000003 * cos($x * pi());
    $lng = $z * cos($theta) + 0.0065;
    $lat = $z * sin($theta) + 0.006;
    return array('lng'=>$lng, 'lat'=>$lat);
}

function bd09_to_tx($bd_lon, $bd_lat) {
    $point_wgs84 = $this->bd09_to_wgs84($bd_lon, $bd_lat);
    $point_gcj02 = $this->wgs84_to_gcj02($point_wgs84['lng'], $point_wgs84['lat']);
    $point_tx = $this->gcj02_to_tx($point_gcj02['lng'], $point_gcj02['lat']);
    return $point_tx;
}
?>

将以上代码保存在一个PHP文件中,即可使用。

四、总结

通过本文介绍,我们了解到了百度经纬度与腾讯经纬度之间的差异,并掌握了使用PHP代码将百度经纬度转换为腾讯经纬度的方法。在实际项目中,这种转换方式可以为我们提供更方便、更准确的地图信息处理功能。

以上是使用php如何将百度经纬度转换为腾讯经纬度的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn