MobilApp/lib/eov/convert_coordinate.dart

199 lines
5.8 KiB
Dart

import 'dart:math';
import 'eov.dart';
class ConvertCoordinate {
static double _dms2Rad(double d) {
double d2 = 648000 / pi;
double d3 = d * 10000;
var d4 = (d3 / 10000).floor();
double d5 = d3 - d4 * 10000;
var d6 = (d5 / 100).floor();
double d7 = d5 - d6 * 100;
d5 = (d4 * 3600 + d6 * 60 + d7) / d2;
return d5;
}
static List<double> _ellXyz(
double fiRad, double laRad, double ad1, double ad2, double d, double d1) {
double d2 = (d * d - d1 * d1) / (d * d);
double d3 = d / sqrt(1.0 - d2 * sin(fiRad) * sin(fiRad));
double d4 = ad1 + ad2;
List<double> result = List.filled(3, 0);
result[0] = (d3 + d4) * cos(fiRad) * cos(laRad);
result[1] = (d3 + d4) * cos(fiRad) * sin(laRad);
result[2] = (d3 * (1.0 - d2) + d4) * sin(fiRad);
return result;
}
static List<double> _eurefHd72(List<double> ad) {
double d = 1.000000000005822;
double d1 = 1.0000010190999999;
double ad3_0 = ad[0] - 52.683999999999997;
double ad3_1 = ad[1] - -71.194000000000003;
double ad3_2 = ad[2] - -13.975;
double ad2_0 = (1.0000000000022879 * ad3_0 +
-1.8078694373184586E-006 * ad3_1 +
5.1535967763767014E-007 * ad3_2) /
d;
double ad2_1 = (1.0000000000002656 * ad3_1 +
1.8078709963955414E-006 * ad3_0 +
-1.5126177533635316E-006 * ad3_2) /
d;
double ad2_2 = (1.0000000000032685 * ad3_2 +
-5.153542084011298E-007 * ad3_0 +
1.5126196167604682E-006 * ad3_1) /
d;
List<double> ad1 = List.filled(3, 0);
ad1[0] = ad2_0 / d1;
ad1[1] = ad2_1 / d1;
ad1[2] = ad2_2 / d1;
return ad1;
}
static List<double> _xyzEll(List<double> ad, double d, double d1) {
double d6;
List<double> ad1 = List.filled(2, 0);
List<double> ad2 = List.filled(2, 0);
double d2 = (d * d - d1 * d1) / (d * d);
double d3 = sqrt(ad[0] * ad[0] + ad[1] * ad[1]);
double d4 = d;
double d5 = 9.9999999999999995E-007;
ad2[0] = 0.0;
ad1[1] = atan2(ad[1], ad[0]);
do {
double d7 = ad[2] / d3;
double d8 = 1.0 - (d2 * d4) / (d4 + ad2[0]);
ad1[0] = atan2(d7, d8);
d4 = d / sqrt(1.0 - d2 * sin(ad1[0]) * sin(ad1[0]));
ad2[0] = d3 / cos(ad1[0]) - d4;
d6 = (d4 * (1.0 - d2) + ad2[0]) * sin(ad1[0]) - ad[2];
ad2[0] = ad2[0] - d6;
} while (d6.abs() > d5);
return [...ad1, ...ad2];
}
static List<double> _iuggFilaFila1(List<double> ad1) {
List<double> ad = List.filled(2, 0);
double d = pi;
d = d / 4;
double d1 = sqrt(0.0066946053569177958);
double d2 = sin(0.82321363052399998) / sin(0.82243820885649999);
double d3 = _iuggK();
double d4 = ad1[0] / 2 + d;
double d5 = tan(d4);
double d6 = pow(d5, d2).toDouble();
d4 = (1.0 - d1 * sin(ad1[0])) / (1.0 + d1 * sin(ad1[0]));
d5 = (d2 * d1) / 2;
double d7 = pow(d4, d5).toDouble();
d4 = d3 * d6 * d7;
d5 = atan(d4);
d4 = d5 - d;
ad[0] = 2 * d4;
ad[1] = d2 * (ad1[1] - 0.33246029532470001);
return ad;
}
static double _iuggK() {
double d = pi;
double d2 = sqrt(0.0066946053569177958);
double d1 = sin(0.82321363052399998) / sin(0.82243820885649999);
d = d / 4;
double d3 = tan(0.41121910442824999 + d);
double d4 = tan(0.41160681526199999 + d);
double d5 = pow(d4, d1).toDouble();
d4 = d5;
d5 = (1.0 - d2 * sin(0.82321363052399998)) /
(1.0 + d2 * sin(0.82321363052399998));
double d6 = (d1 * d2) / 2;
double d7 = pow(d5, d6).toDouble();
d5 = d7 * d4;
return d3 / d5;
}
static Eov _iuggFilaXy(List<double> ad1) {
double d = pi;
double d1 = 0.99992999999999999;
d = d / 4;
double d2 = _iuggR();
List<double> ad2 = List.filled(2, 0);
ad2 = _gaussSgomb(ad1);
double d3 = d + ad2[0] / 2;
double eovx =
d1 * d2 * (log(tan(d3)) / log(2.7182818284590452354)) + 200000;
double eovy = d1 * d2 * ad2[1] + 650000;
return Eov(eovx, eovy);
}
static double _iuggR() {
double d = sqrt(0.0066946053569177958);
double d1 =
sqrt(1.0 - d * d * sin(0.82321363052399998) * sin(0.82321363052399998));
double d2 = 6378160 / d1;
d1 = 40680924985600 * cos(0.82321363052399998) * cos(0.82321363052399998) +
40408582247267.031 *
sin(0.82321363052399998) *
sin(0.82321363052399998);
double d3 = pow(d1, 1.5).toDouble();
double d4 = 1.6438585031755181E+027 / d3;
return sqrt(d4 * d2);
}
static List<double> _gaussSgomb(List<double> ad1) {
List<double> ad = List.filled(2, 0);
ad[0] = asin(sin(ad1[0]) * cos(0.82205007768930005) -
cos(ad1[0]) * cos(ad1[1]) * sin(0.82205007768930005));
ad[1] = asin((cos(ad1[0]) * sin(ad1[1])) / cos(ad[0]));
return ad;
}
static int toDegree(double a) {
return a.toInt();
}
static int toMinute(double a) {
return ((a - toDegree(a)) * 60.0).toInt();
}
static double toSecond(double a) {
return ((a - toDegree(a)) * 60.0 - toMinute(a)) * 60.0;
}
static Eov ConvertWgsToEov(double fi, double la) {
List<double> wgs84 = List.filled(4, 0);
List<double> xyz = List.filled(3, 0);
List<double> fila = List.filled(2, 0);
List<double> fila1 = List.filled(2, 0);
double fi11 = toDegree(fi).toDouble();
double fip11 = toMinute(fi).toDouble();
double fimp11 = toSecond(fi);
double la11 = toDegree(la).toDouble();
double lap11 = toMinute(la).toDouble();
double lamp11 = toSecond(la);
double fi1 = fi11 + (fip11 / 100) + (fimp11 / 10000);
double la1 = la11 + (lap11 / 100) + (lamp11 / 10000);
double fiRad = _dms2Rad(fi1);
double laRad = _dms2Rad(la1);
wgs84 = _ellXyz(fiRad, laRad, 0, 0, 6378137.0, 6356752.3141400004);
xyz = _eurefHd72(wgs84);
fila = _xyzEll(xyz, 6378160, 6356774.5159999998);
fila1 = _iuggFilaFila1(fila);
return _iuggFilaXy(fila1);
}
}