PHP-скрипты для пересчета системы формата координат
Добавлено: 31 июл 2010, 15:25
Набросал, по необходимости, несколько скриптов. В данный момент используются в тестовом режиме. Здесь хотел бы оставить использующиеся функции.
Особого опыта в программировании нет. Если что нужно исправить - с радостью приму и усвою замечания.
Перевод из одной системы координат в другую (здесь, в примере, из WGS84 в СК95):
Географические координаты CK-95 в плоские (проекция Гаусса-Крюгера)
Вспомогательная функция - приводит гг°мм'ссссс" к виду гг.гггггг и меняет "," на "."
Особого опыта в программировании нет. Если что нужно исправить - с радостью приму и усвою замечания.
Перевод из одной системы координат в другую (здесь, в примере, из WGS84 в СК95):
Код: Выделить всё
//перевод из WGS84 в СК95
function wgs2sk($Ba, $La, $Ha) {
$aa = 6378137;
$ab = 6378245;
$p = 206264.806;
$alfaa = 1/298.257223563;
$alfab = 1/298.3;
$ea = (2 * $alfaa) - pow($alfaa, 2);
$eb = (2 * $alfab) - pow($alfab, 2);
$B = deg2rad($Ba);
$L = deg2rad($La);
$H = $Ha;
$dx = -24.82;
$dy = 131.21;
$dz = 82.66;
$wx = 0;
$wy = 0;
$wz = 0.16;
$ma = 0.12 * pow(10, -6);
$da = $ab - $aa;
$de = $eb - $ea;
$a = ($ab + $aa) / 2;
$e = ($eb + $ea) / 2;
$M = $a * (1 - $e) / sqrt(pow((1-$e*pow(sin($B),2)), 3));
$N = $a / sqrt(1-$e*pow(sin($B),2));
$db = $p / ($M + $H) * ($N / $a * $e * sin($B) * cos($B) * $da +(pow($N, 2) / pow($a, 2) + 1) * $N * sin($B) * cos($B) * $de / 2 - ($dx * cos($L) + $dy * sin($L)) * sin($B) + $dz * cos($B)) - $wx * sin($L) *(1 + $e * cos(2*$B)) + $wy * cos($L) * (1 + $e * cos(2*$B)) - $p * $ma * $e * sin($B) * cos($B);
$dl = $p / (($N + $H) * cos($B)) * (-$dx * sin($L) + $dy * cos($L)) + tan($B) * (1 - $e) * ($wx * cos($L) + $wy * sin($L)) - $wz;
$dh = -$a / $N * $da + $N * pow(sin($B), 2) * $de / 2 + ($dx * cos($L) + $dy * sin($L)) * cos($B) + $dz * sin($B) - $N * $e * sin($B) * cos($B) * ($wx / $p * sin($L) - $wy / $p * cos($L)) + (pow($a, 2) / $N + $H) * $ma;
$Bb = $Ba + $db / 3600;
$Lb = $La + $dl / 3600;
$Hb = $Ha + $dh;
$res = array("b" => "$Bb", "l" => "$Lb", "h" => "$Hb");
return $res;
}
Код: Выделить всё
//перепроецирование из СК в Гаусса-Крюгера
function sk2gk($B, $L) {
$B = deg2rad($B);
//номер зоны
$n = round((6+$L)/6);
//расстояние до осевого меридиана зоны
$lo = ($L - (3+6*($n-1)))/57.29577951;
//вычисление плоских прямоугольных координат в проекции Гаусса-Крюгера из геодезических координат на эллипсоиде Красовского
$x = 6367558.4968*$B - sin(2*$B) * (16002.89 + 66.9607 * pow(sin($B), 2) + 0.3515 * pow(sin($B), 4) - pow($lo, 2) * (1594561.25 + 5336.535 * pow(sin($B), 2) + 26.79 * pow(sin($B), 4) + 0.149 * pow(sin($B), 6) + pow($lo, 2) * (672483.4 - 811219.9 * pow(sin($B), 2) + 5420 * pow(sin($B), 4) - 10.6 * pow(sin($B), 6) + pow($lo, 2) * (278194 - 830174 * pow(sin($B), 2) + 572434 * pow(sin($B), 4) - 16010 * pow(sin($B), 6) + pow($lo, 2) * (109500 - 574700 * pow(sin($B), 2) + 863700 * pow(sin($B), 4) - 398600 * pow(sin($B), 6))))));
$y = (5 + 10 * $n) * pow(10, 5) + $lo * cos($B) * (6378245 + 21346.1415 * pow(sin($B), 2) + 107.1590 * pow(sin($B), 4) + 0.5977 * pow(sin($B), 6) + pow($lo, 2) * (1070204.16 - 2136826.66 * pow(sin($B), 2) + 17.98 * pow(sin($B), 4) - 11.99 * pow(sin($B), 6) + pow($lo, 2) * (270806 - 1523417 * pow(sin($B), 2) + 1327645 * pow(sin($B), 4) - 21701 * pow(sin($B), 6) + pow($lo, 2) * (79690 - 866190 * pow(sin($B), 2) + 1730360 * pow(sin($B), 4) - 945460 * pow(sin($B), 6)))));
$res = array("x" => "$x", "y" => "$y");
return $res;
}
Код: Выделить всё
function tchk($grad){
$grad = trim($grad);
$lit = array("°", "'", '"', " ");
$gr = str_replace($lit, " ", $grad);
$gr = str_replace(",", ".", $gr);
$re = explode(" ", $gr);
$gre = $re['0'] + $re['1']/60 + $re['2']/3600;
return $gre;
}