159 lines
5.5 KiB
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;
|
|
}
|
|
}
|