因为百度使用的BD09,是在GCJ02基础上进行的加密。我们需要先把BD09转化为GCJ02,然后再将GCJ02转化为WGS84。我的运行环境是php5.4.45,特意写了一个conver.php文件进行转换(我百度的数据存储在BaiduJosn.js)代码如下:
<?php
/**
* 百度坐标转换程序 (PHP 5.4.45 兼容版)
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('memory_limit', '512M');
header('Content-Type: application/javascript; charset=utf-8');
class CoordConverter {
const PI = 3.1415926535897932384626;
const X_PI = 52.35987755982988;
const A = 6378245.0;
const EE = 0.00669342162296594323;
public static function bd09ToWgs84($bd_lon, $bd_lat) {
$x = $bd_lon - 0.0065;
$y = $bd_lat - 0.006;
$z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * self::X_PI);
$theta = atan2($y, $x) - 0.000003 * cos($x * self::X_PI);
$gcj_lon = $z * cos($theta);
$gcj_lat = $z * sin($theta);
return self::gcj02ToWgs84($gcj_lon, $gcj_lat);
}
private static 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);
return array($lng * 2 - ($lng + $dlng), $lat * 2 - ($lat + $dlat));
}
private static function transformLat($x, $y) {
$ret = -100.0 + 2.0 * $x + 3.0 * $y + 0.2 * $y * $y + 0.1 * $x * $y + 0.2 * sqrt(abs($x));
$ret += (20.0 * sin(6.0 * $x * self::PI) + 20.0 * sin(2.0 * $x * self::PI)) * 2.0 / 3.0;
$ret += (20.0 * sin($y * self::PI) + 40.0 * sin($y / 3.0 * self::PI)) * 2.0 / 3.0;
$ret += (160.0 * sin($y / 12.0 * self::PI) + 320 * sin($y * self::PI / 30.0)) * 2.0 / 3.0;
return $ret;
}
private static function transformLng($x, $y) {
$ret = 300.0 + $x + 2.0 * $y + 0.1 * $x * $x + 0.1 * $x * $y + 0.1 * sqrt(abs($x));
$ret += (20.0 * sin(6.0 * $x * self::PI) + 20.0 * sin(2.0 * $x * self::PI)) * 2.0 / 3.0;
$ret += (20.0 * sin($x * self::PI) + 40.0 * sin($x / 3.0 * self::PI)) * 2.0 / 3.0;
$ret += (150.0 * sin($x / 12.0 * self::PI) + 300.0 * sin($x / 30.0 * self::PI)) * 2.0 / 3.0;
return $ret;
}
}
// --- 读取数据 ---
$jsFile = 'BaiduJosn.js';
if (!file_exists($jsFile)) die("Error: BaiduJosn.js not found.");
$content = file_get_contents($jsFile);
// 使用回调函数,正则匹配每一行包含经纬度的数据块
// 匹配模式:lng: 123.456, lat: 12.34
$pattern = '/lng:\s*([0-9\.]+),\s*lat:\s*([0-9\.]+)/';
$newContent = preg_replace_callback($pattern, function($matches) {
$bd_lng = floatval($matches[1]);
$bd_lat = floatval($matches[2]);
// 执行高精度转换
$wgs = CoordConverter::bd09ToWgs84($bd_lng, $bd_lat);
$wgs_lng = round($wgs[0], 6);
$wgs_lat = round($wgs[1], 6);
return "lng: $wgs_lng, lat: $wgs_lat";
}, $content);
// 直接输出转换后的 JS 内容
echo $newContent;
?>发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
相关文章