PHP-скрипты для пересчета системы формата координат

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
postblast
Новоприбывший
Сообщения: 6
Зарегистрирован: 16 июл 2010, 09:32
Репутация: 0

PHP-скрипты для пересчета системы формата координат

Сообщение postblast » 31 июл 2010, 15:25

Набросал, по необходимости, несколько скриптов. В данный момент используются в тестовом режиме. Здесь хотел бы оставить использующиеся функции.
Особого опыта в программировании нет. Если что нужно исправить - с радостью приму и усвою замечания.
Перевод из одной системы координат в другую (здесь, в примере, из 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;
}
Географические координаты CK-95 в плоские (проекция Гаусса-Крюгера)

Код: Выделить всё

//перепроецирование из СК в Гаусса-Крюгера
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;
}
Последний раз редактировалось postblast 01 авг 2010, 10:49, всего редактировалось 1 раз.

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: PHP-скрипты для пересчета системы формата координат

Сообщение Максим Дубинин » 31 июл 2010, 20:49

Про первый скрипт:
1. На основе этого http://gis-lab.info/qa/wgs84-sk42-wgs84-formula.html?
2. Откуда dx, dy, dz?
3. Если поменять линейные элементы на dX=28, dY=-130, dZ=-95, какой получится результат для исходной точки 50, 50?
пристегивайтесь, турбулентность прямо по курсу

postblast
Новоприбывший
Сообщения: 6
Зарегистрирован: 16 июл 2010, 09:32
Репутация: 0

Re: PHP-скрипты для пересчета системы формата координат

Сообщение postblast » 01 авг 2010, 10:33

1. Большая часть на основе ГОСТ Р 51794-2008, а из gis-lab.info/qa/wgs84-sk42-wgs84-formula.html взято деление на 3600. :D
2. Не поверишь. Забыл. Но, скорее всего, из какого-то бесплатно распространяемого калькулятора. Возможно, даже из GeoCalc http://gis-lab.info/qa/geocalc.html.
Если нельзя - заменим целевую систему координат на другую.
3. 49.9999889184 и 49.9984908836 если целевой эллипсоид - Красовского, а исходный - общеземной (WGS)

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: PHP-скрипты для пересчета системы формата координат

Сообщение Максим Дубинин » 01 авг 2010, 18:44

1. Интересно, идентичны ли формулы?
2. брать абы какие параметры - нельзя, тем более забывать источник, возможные варианты: http://gis-lab.info/qa/datum-transform-sets.html
3. не то что-то, должно быть 49.99996312980 50.0014646515
пристегивайтесь, турбулентность прямо по курсу

postblast
Новоприбывший
Сообщения: 6
Зарегистрирован: 16 июл 2010, 09:32
Репутация: 0

Re: PHP-скрипты для пересчета системы формата координат

Сообщение postblast » 01 авг 2010, 19:15

1. Должны быть близнецами.
2. Исправлюсь.
3. 49.999963116 и 50.0014202275 при dX=-28, dY=130, dZ=95 (так было бы честнее)
49.9999631613 и 50.0014202275 при отрицательном ma (ох, явно параметры изначально из СК в WGS взяты, ох и не хорошо неопытных путать и пугать)

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: PHP-скрипты для пересчета системы формата координат

Сообщение Максим Дубинин » 01 авг 2010, 20:59

Да, 28, -130, -95 это СК-42 -> WGS84, для обратного нужно соответственно инвертировать.

То есть можно констатировать, что твой первый код - полный аналог http://gis-lab.info/qa/wgs84-sk42-wgs84-formula.html.

Вопрос, можно ли его добавить на ту же страницу? Если да, можешь ли добавить комментариев для констант, в них же авторство, источник и тесткейс. А я добавлю на страницу.
пристегивайтесь, турбулентность прямо по курсу

postblast
Новоприбывший
Сообщения: 6
Зарегистрирован: 16 июл 2010, 09:32
Репутация: 0

Re: PHP-скрипты для пересчета системы формата координат

Сообщение postblast » 02 авг 2010, 09:41

В идеале скрипты должны быть полными аналогами, иначе или ГОСТ не тот, или мы не то сделали. :D
Публикация и планировалась, со всеми ссылками, источниками и пр., ну и работающий пример (например, во фрейме). Но тут организовался перегруз на работе (все выходные прошли ударно), поэтому пока выложил здесь. И, собственно, ради обсуждения, замечаний, проб.

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей