Files
terrain-utilities/src/main/java/pl/wat/ms4ds/terrain/CoordConversion.java

159 lines
5.5 KiB
Java

package pl.wat.ms4ds.terrain;
public class CoordConversion {
/*
Opis:
konwersja wspolrzednych z ukladu WGS 84 do ukladu PUWG 1992
Parametry:
B_stopnie - szerokosc geograficzna wyrazona w stopniach
L_stopnie - dlugosc geograficzna wyrazona w stopniach
Xpuwg - wskazanie na wspolrzedna X ukladu PUWG 1992 (UWAGA - wspolrzedna pionowa)
Ypuwg - wskazanie na wspolrzedna Y ukladu PUWG 1992 (UWAGA - wspolrzedna pozioma)
Zwracana wartosc:
0 - konwersja powiodla sie
1 - szerokosc geograficzna B poza zakresem
2 - dlugosc geograficzna L poza zakresem
*/
public static int wgs84ToPuwg1992(double B_stopnie, double L_stopnie) {
double Xpuwg;
double Ypuwg;
// Parametry elipsoidy GRS-80
double e = 0.0818191910428; //pierwszymimo¶ród elipsoidy
double R0 = 6367449.14577; //promieñ sfery Lagrange.a
double Snorm = 2.0E-6; //parametr normuj±cy
double xo = 5760000.0; //parametr centruj±cy
//Wspolczynniki wielomianu
double a0 = 5765181.11148097;
double a1 = 499800.81713800;
double a2 = -63.81145283;
double a3 = 0.83537915;
double a4 = 0.13046891;
double a5 = -0.00111138;
double a6 = -0.00010504;
// Parametry odwzorowania Gaussa-Kruegera dla uk³adu PUWG92
double L0_stopnie = 19.0; //Pocz±tek uk³adu wsp. PUWG92 (d³ugo¶æ)
double m0 = 0.9993;
double x0 = -5300000.0;
double y0 = 500000.0;
// Zakres stosowalnosci metody
double Bmin = 48.0 * Math.PI / 180.0;
double Bmax = 56.0 * Math.PI / 180.0;
double dLmin = -6.0 * Math.PI / 180.0;
double dLmax = 6.0 * Math.PI / 180.0;
// Weryfikacja danych wejsciowych
double B = B_stopnie * Math.PI / 180.0;
double dL_stopnie = L_stopnie - L0_stopnie;
double dL = dL_stopnie * Math.PI / 180.0;
if ((B < Bmin) || (B > Bmax))
return 1;
if ((dL < dLmin) || (dL > dLmax))
return 2;
//etap I - elipsoida na kulê
double U = 1.0 - e * Math.sin(B);
double V = 1.0 + e * Math.sin(B);
double K = Math.pow((U / V), (e / 2.0));
double C = K * Math.tan(B / 2.0 + Math.PI / 4.0);
double fi = 2.0 * Math.atan(C) - Math.PI / 2.0;
double d_lambda = dL;
// etap II - kula na walec
double p = Math.sin(fi);
double q = Math.cos(fi) * Math.cos(d_lambda);
double r = 1.0 + Math.cos(fi) * Math.sin(d_lambda);
double s = 1.0 - Math.cos(fi) * Math.sin(d_lambda);
double XMERC = R0 * Math.atan(p / q);
double YMERC = 0.5 * R0 * Math.log(r / s);
// //etap III - walec na p³aszczyznê
// complex<double> Z ((XMERC - xo) * Snorm, YMERC * Snorm);
// complex<double> Zgk;
// Zgk = a0 + Z * (a1 + Z * (a2 + Z * (a3 + Z * (a4 + Z * (a5 + Z * a6)))));
// double Xgk = Zgk.real();
// double Ygk = Zgk.imag();
//
// //Przej¶cie do uk³adu aplikacyjnego
// Xpuwg = m0 * Xgk + x0;
// Ypuwg = m0 * Ygk + y0;
return 0;
}
/*
Opis:
konwersja wspolrzednych z ukladu PUWG 1992 do ukladu WGS 84
Parametry:
Xpuwg - wskazanie na wspolrzedna X ukladu PUWG 1992 (UWAGA - wspolrzedna pionowa)
Ypuwg - wskazanie na wspolrzedna Y ukladu PUWG 1992 (UWAGA - wspolrzedna pozioma)
B_stopnie - szerokosc geograficzna wyrazona w stopniach
L_stopnie - dlugosc geograficzna wyrazona w stopniach
Zwracana wartosc:
0 - konwersja powiodla sie
*/
public static int puwg1992ToWgs84(double Xpuwg, double Ypuwg, double B_stopnie, double L_stopnie) {
double L0_stopnie = 19.0; //Pocz±tek uk³adu wsp. PUWG92 (d³ugo¶æ)
double m0 = 0.9993;
double x0 = -5300000.0;
double y0 = 500000.0;
double R0 = 6367449.14577; //promieñ sfery Lagrange.a
double Snorm = 2.0E-6; //parametr normuj±cy
double xo_prim = 5765181.11148097; //parametr centruj±cy
// Wspolczynniki wielomianu
double b0 = 5760000;
double b1 = 500199.26224125;
double b2 = 63.88777449;
double b3 = -0.82039170;
double b4 = -0.13125817;
double b5 = 0.00101782;
double b6 = 0.00010778;
// Wspolczynniki szeregu tryg.
double c2 = 0.0033565514856;
double c4 = 0.0000065718731;
double c6 = 0.0000000176466;
double c8 = 0.0000000000540;
//Przejscie z ukladu aplikacyjnego
double Xgk, Ygk;
Xgk = (Xpuwg - x0) / m0;
Ygk = (Ypuwg - y0) / m0;
// //etap I - (Xgk, Ygk) -> (Xmerc, Ymerc)
// complex<double> Z ((Xgk - xo_prim) * Snorm, Ygk * Snorm);
// complex<double> Zmerc;
//
// Zmerc = b0 + Z * (b1 + Z * (b2 + Z * (b3 + Z * (b4 + Z * (b5 + Z * b6)))));
//
// double Xmerc = Zmerc.real();
// double Ymerc = Zmerc.imag();
//
// //etap II - Xmerc,Ymerc -> fi, delta_lambda
// double alfa = Xmerc / R0;
// double beta = Ymerc / R0;
//
// double w = 2.0 * atan(exp(beta)) - M_PI / 2.0;
// double fi = asin(cos(w) * sin(alfa));
// double d_lambda = atan(tan(w) / cos(alfa));
//
// //etap III
// double B = fi + c2 * sin(2.0 * fi) + c4 * sin(4.0 * fi) + c6 * sin(6.0 * fi) + c8 * sin(8.0 * fi);
// double dL = d_lambda;
//
// //Obliczenia koncowe
// *B_stopnie = B / M_PI * 180.0;
// double dL_stopnie = dL / M_PI * 180.0;
// *L_stopnie = dL_stopnie + L0_stopnie;
return 0;
}
}