>  기사  >  백엔드 개발  >  PHP를 사용하여 Baidu 경도 및 위도를 Tencent 경도 및 위도로 변환하는 방법

PHP를 사용하여 Baidu 경도 및 위도를 Tencent 경도 및 위도로 변환하는 방법

PHPz
PHPz원래의
2023-04-19 09:21:561107검색

개발 과정에서 일반적으로 일부 지리적 위치 정보를 처리해야 하며, 다양한 플랫폼의 경도 및 위도 형식이 다르기 때문에 변환이 필요합니다. 이번 글에서는 바이두 경도와 위도를 텐센트 경도와 위도로 변환하는 방법과 이를 PHP 코드를 사용하여 구현하는 방법을 소개하겠습니다.

1. Baidu 경도와 위도와 Tencent 경도와 위도의 차이

위도와 경도는 지구 표면의 위치를 ​​상징하며, 현재 다양한 측위 시스템에서 서로 다른 방식으로 표현됩니다. : WGS84, GCJ02 및 BD09. 그 중 WGS84는 GPS 측위 시스템에서 사용하는 좌표계이고, GCJ02는 중국 국가 측량국에서 제정한 지리 정보 시스템의 좌표계이며, 국내 주요 지도에서 반드시 사용해야 하는 좌표계이기도 하다. 소프트웨어인 반면 Baidu Maps는 BD09를 사용합니다.

다른 포지셔닝 시스템을 사용하면 경도와 위도의 성능도 달라집니다. 예를 들어 특정 위치의 Baidu 경도 및 위도와 Tencent 경도 및 위도는 다음과 같습니다.

Baidu 경도 및 위도: 116.404,39.915
Tencent 경도 및 위도: 116.397428,39.908697

II. 변환 방법

Baidu와 Tencent는 서로 다른 위치 측정 시스템을 사용하므로 경도와 위도를 변환하려면 특정 알고리즘이 필요합니다.

  1. Baidu 좌표계를 지구 좌표계(WGS84)로 변환

먼저 Baidu 좌표계를 지구 좌표계(WGS84)로 변환해야 합니다. 이는 Baidu에서 제공하는 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)의 결과를 얻기 위해 첫 번째 단계에서 함수를 사용한 후 이를 화성 좌표계(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)를 Tencent 좌표계로 변환

마지막 단계는 화성 좌표계(GCJ02)를 Tencent 좌표계로 변환하는 것입니다.

<?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);
}
?>

3. 전체 코드 구현

위의 세 단계를 결합하여 다음과 같이 Baidu 경도와 위도를 PHP에서 Tencent 경도와 위도로 변환하는 완전한 코드를 얻습니다.

<?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 파일에 저장하면 사용할 수 있습니다. .

IV.요약

본 글의 소개를 통해 바이두 위경도와 텐센트 위경도의 차이에 대해 알아보았고, PHP 코드를 사용하여 바이두 위경도를 텐센트 위경도로 변환하는 방법을 터득했습니다. . 실제 프로젝트에서는 이러한 변환 방식을 통해 보다 편리하고 정확한 지도 정보 처리 기능을 제공할 수 있습니다.

위 내용은 PHP를 사용하여 Baidu 경도 및 위도를 Tencent 경도 및 위도로 변환하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.