在开发过程中,我们通常需要将一些地理位置信息进行处理,而不同平台的经纬度格式并不相同,这就需要进行转换。本文将介绍如何将百度经纬度转换为腾讯经纬度,同时使用php代码实现。
一、百度经纬度与腾讯经纬度的差异
经纬度是地球表面位置的标志,在不同的定位系统中有不同的表现方式,目前主流的定位系统有以下三种:WGS84、GCJ02和BD09。其中,WGS84是GPS定位系统使用的坐标系,GCJ02是中国国家测绘局制定的地理信息系统的坐标系,也是目前国内各大地图软件必须使用的坐标系,而百度地图则使用BD09。
在使用不同的定位系统时,经纬度的表现也会存在差异,例如一个地点的百度经纬度和腾讯经纬度如下所示:
百度经纬度:116.404,39.915
腾讯经纬度:116.397428,39.908697
立即学习“PHP免费学习笔记(深入)”;
二、转换方法
由于百度和腾讯使用的定位系统不同,所以需要通过一定的算法进行经纬度之间的转换。
首先需要将百度坐标系转换为地球坐标系(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('lng'=>$lng, 'lat'=>$lat);
}
?>使用第一步中的函数得到地球坐标系(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;
}
?>最后一步,将火星坐标系(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('lng'=>$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('lng'=>$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中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号