java 坐标反算_Java空间大地坐标系坐标 - 高斯投影坐标系坐标(BLH-XY)正反算
/*
* 算法是自己研究的,现在公开大家随便看,但是如果这份资料对你有用请你给一个评价,谢谢!
*/
/**
* @Title: GeodeticForGauss
* @Description: 空间大地坐标转换高斯投影平面直角坐标
* @param: @param B 纬度
* @param: @param L 经度
* @param: @param type 几度分带
* @param: @param Num 目标坐标系
* @return: void
*/
public static void GeodeticForGauss(double B, double L, int type, int Num) {
TuoQiuJiChun tuoQiuJiChun = null;
switch (Num) {
case 84:
// WGS-84坐标系
tuoQiuJiChun = new TuoQiuJiChun("WGS-84坐标系", 6378137, 6356752.3142);
break;
case 80:
// 西安-80坐标系
tuoQiuJiChun = new TuoQiuJiChun("西安-80坐标系", 6378140,
6356755.2881575287);
break;
case 54:
// 北京-54坐标系
tuoQiuJiChun = new TuoQiuJiChun("北京-54坐标系", 6378245,
6356863.0187730473);
break;
}
double beltNum;
beltNum = Math.ceil((L - (type == 3 ? 1.5 : 0)) / type);
if (type == 3 && beltNum * 3 == L - 1.5) {
beltNum += 1;
}
double L0 = L - (beltNum * type - (type == 6 ? 3 : 0)); // 中央经线的度数
System.out.println(L0);
double rB, tB, m;
rB = B * Math.PI / 180;
tB = Math.tan(rB);
m = Math.cos(rB) * L0 * Math.PI / 180;
double N = tuoQiuJiChun.getM_Long()
/ Math.sqrt(1 - tuoQiuJiChun.getFirstE() * Math.sin(rB)
* Math.sin(rB));
double it2 = tuoQiuJiChun.getSecondE() * Math.pow(Math.cos(rB), 2);
double x = 0.5 * m * m + (double) 1 / 24
* (5 - tB * tB + 9 * it2 + 4 * it2 * it2) * Math.pow(m, 4)
+ (double) 1 / 720 * (61 - 58 * tB * tB + Math.pow(tB, 4))
* Math.pow(m, 6);
double m0 = tuoQiuJiChun.getM_Long() * (1 - tuoQiuJiChun.getFirstE());
double m2 = (double) 3 / 2 * tuoQiuJiChun.getFirstE() * m0;
double m4 = (double) 5 / 4 * tuoQiuJiChun.getFirstE() * m2;
double m6 = (double) 7 / 6 * tuoQiuJiChun.getFirstE() * m4;
double m8 = (double) 9 / 8 * tuoQiuJiChun.getFirstE() * m6;
double a0, a2, a4, a6, a8;
a0 = m0 + (double) 1 / 2 * m2 + (double) 3 / 8 * m4 + (double) 5 / 16
* m6 + (double) 35 / 128 * m8;
a2 = (double) 1 / 2 * m2 + (double) 1 / 2 * m4 + (double) 15 / 32 * m6
+ (double) 7 / 16 * m8;
a4 = (double) 1 / 8 * m4 + (double) 3 / 16 * m6 + (double) 7 / 32 * m8;
a6 = (double) 1 / 32 * m6 + (double) 1 / 16 * m8;
a8 = (double) 1 / 128 * m8;
// 求子午线弧长
double X1 = a0 * rB - a2 * Math.sin(2 * rB) * 0.5 + (double) 1 / 4 * a4
* Math.sin(4 * rB) - (double) 1 / 6 * a6 * Math.sin(6 * rB)
+ (double) 1 / 8 * a8 * Math.sin(8 * rB);
double X = X1 + N * x * tB;
double Y = N
* (m + (double) 1 / 6 * (1 - tB * tB + it2) * Math.pow(m, 3) + (double) 1
/ 720
* (5 - 18 * tB * tB + Math.pow(tB, 4) + 14 * it2 - 58
* tB * tB * it2) * Math.pow(m, 5)) + 500000;
}
/**
* @Title: GaussForGeodetic
* @Descrip
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
