在开发过程中,我们通常需要将一些地理位置信息进行处理,而不同平台的经纬度格式并不相同,这就需要进行转换。本文将介绍如何将百度经纬度转换为腾讯经纬度,同时使用PHP代码实现。
一、百度经纬度与腾讯经纬度的差异
经纬度是地球表面位置的标志,在不同的定位系统中有不同的表现方式,目前主流的定位系统有以下三种:WGS84、GCJ02和BD09。其中,WGS84是GPS定位系统使用的坐标系,GCJ02是中国国家测绘局制定的地理信息系统的坐标系,也是目前国内各大地图软件必须使用的坐标系,而百度地图则使用BD09。
在使用不同的定位系统时,经纬度的表现也会存在差异,例如一个地点的百度经纬度和腾讯经纬度如下所示:
百度经纬度:116.404,39.915
腾讯经纬度:116.397428,39.908697
二、转换方法
由于百度和腾讯使用的定位系统不同,所以需要通过一定的算法进行经纬度之间的转换。
- 将百度坐标系转换为地球坐标系(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('lng'=>$lng, 'lat'=>$lat); } ?>
- 将地球坐标系(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; } ?>
- 将火星坐标系(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('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中实施API速率限制的策略,包括诸如令牌桶和漏水桶等算法,以及使用Symfony/Rate-limimiter之类的库。它还涵盖监视,动态调整速率限制和手

本文讨论了使用password_hash和pyspasswify在PHP中使用密码的好处。主要论点是,这些功能通过自动盐,强大的哈希算法和SECH来增强密码保护

本文讨论了OWASP在PHP和缓解策略中的十大漏洞。关键问题包括注射,验证损坏和XSS,并提供用于监视和保护PHP应用程序的推荐工具。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Linux新版
SublimeText3 Linux最新版

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3汉化版
中文版,非常好用

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。