Скрипт:
Код: Выделить всё
<?
#преобразование координат из SK42 в WSG84 и наоборот
# по методу http://gps-club.ru/gps_think/detail.php?ID=4886
#константы
$Pi = 3.14159265358979; #Число Пи
$ro = 206264.8062; #Число угловых секунд в радиане
#Эллипсоид Красовского
$aP = 6378245; #Большая полуось
$alP = 1 / 298.3; #Сжатие
$e2P = 2 * $alP - $alP ^ 2; #Квадрат эксцентриситета;
#Эллипсоид WGS84 (GRS80, эти два эллипсоида сходны по большинству параметров)
$aW = 6378137; #Большая полуось
$alW = 1 / 298.257223563; #Сжатие
$e2W = 2 * $alW - $alW ^ 2; #Квадрат эксцентриситета
#Вспомогательные значения для преобразования эллипсоидов
$a = ($aP + $aW) / 2;
$e2 = ($e2P + $e2W) / 2;
$da = $aW - $aP;
$de2 = $e2W - $e2P;
#Линейные элементы трансформирования, в метрах
$dx = 23.92;
$dy = -141.27;
$dz = -80.9;
#Угловые элементы трансформирования, в секундах
$wx = 0;
$wy = 0;
$wz = 0;
#Дифференциальное различие масштабов
$ms = 0;
function WGS84_SK42_Lat($Bd, $Ld, $H) {
return ($Bd - dB_($Bd, $Ld, $H) / 3600);
}
function SK42_WGS84_Lat($Bd, $Ld, $H) {
return ($Bd + dB_($Bd, $Ld, $H) / 3600);
}
function WGS84_SK42_Long($Bd, $Ld, $H) {
return ($Ld - dL_($Bd, $Ld, $H) / 3600);
}
function SK42_WGS84_Long($Bd, $Ld, $H) {
return ($Ld + dL_($Bd, $Ld, $H) / 3600);
}
function dB_($Bd, $Ld, $H) {
$B = $Bd * $Pi / 180;
$L = $Ld * $Pi / 180;
$M = $a * (1 - $e2) / (1 - $e2 * Sin($B) ^ 2) ^ 1.5;
$N = $a * (1 - $e2 * Sin($B) ^ 2) ^ -0.5;
return $ro / ($M + $H) * ($N / $a * $e2 * Sin($B) * Cos($B) * $da + ($N ^ 2 / $a ^ 2 + 1) * $N * Sin($B) * Cos($B) * $de2 / 2 - ($dx * Cos($L) + $dy * Sin($L)) * Sin($B) + $dz * Cos($B)) - $wx * Sin($L) * (1 + $e2 * Cos(2 * $B)) + $wy * Cos($L) * (1 + $e2 * Cos(2 * $B)) - $ro * $ms * $e2 * Sin($B) * Cos($B) ;
}
function dL_($Bd, $Ld, $H) {
$B = $Bd * $Pi / 180;
$L = $Ld * $Pi / 180;
$N = $a * (1 - $e2 * Sin($B) ^ 2) ^ -0.5;
return $ro / (($N + $H) * Cos($B)) * (($dx * -1) * Sin($L) + $dy * Cos($L)) + Tan($B) * (1 - $e2) * ($wx * Cos($L) + $wy * Sin($L)) - $wz ;
}
function WGS84Alt($Bd, $Ld, $H) {
$B = $Bd * $Pi / 180;
$L = $Ld * $Pi / 180;
$N = $a * (1 - $e2 * Sin($B) ^ 2) ^ -0.5;
$dH = ($a * -1) / $N * $da + $N * Sin($B) ^ 2 * $de2 / 2 + ($dx * Cos($L) + $dy * Sin($L)) * Cos($B) + $dz * Sin($B) - $N * $e2 * Sin($B) * Cos($B) * ($wx / $ro * Sin($L) - $wy / $ro * Cos($L)) + ($a ^ 2 / $N + $H) * $ms;
return ($H + $dH);
}
$h_ = 44.830063;
$v_ = 38.831393;
$alt_ = 82.3;
echo 'sk42 H:'.$h_.' V: '.$v_.' ALT: '.$alt_;
echo '<hr>';
echo 'wsg84 H:'.SK42_WGS84_Lat($h_,$v_,$alt_).' V: '.SK42_WGS84_Long($h_,$v_,$alt_).' ALT: '.WGS84Alt($h_,$v_,$alt_);
?>
Код: Выделить всё
Warning: Division by zero in Z:\home\fototrack.ru\www\inc\sk42_to_wsg84.php on line 57
Warning: Division by zero in Z:\home\fototrack.ru\www\inc\sk42_to_wsg84.php on line 57
Warning: Division by zero in Z:\home\fototrack.ru\www\inc\sk42_to_wsg84.php on line 71
Warning: Division by zero in Z:\home\fototrack.ru\www\inc\sk42_to_wsg84.php on line 71
Warning: Division by zero in Z:\home\fototrack.ru\www\inc\sk42_to_wsg84.php on line 71
Warning: Division by zero in Z:\home\fototrack.ru\www\inc\sk42_to_wsg84.php on line 71
