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 _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 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 _eurefHd72(List 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 ad1 = List.filled(3, 0); ad1[0] = ad2_0 / d1; ad1[1] = ad2_1 / d1; ad1[2] = ad2_2 / d1; return ad1; } static List _xyzEll(List ad, double d, double d1) { double d6; List ad1 = List.filled(2, 0); List 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 _iuggFilaFila1(List ad1) { List 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 ad1) { double d = pi; double d1 = 0.99992999999999999; d = d / 4; double d2 = _iuggR(); List 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 _gaussSgomb(List ad1) { List 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 wgs84 = List.filled(4, 0); List xyz = List.filled(3, 0); List fila = List.filled(2, 0); List 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); } }