199 lines
5.8 KiB
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);
|
|
}
|
|
}
|