from numpy import sin, cos, pi, sqrt, tan, arcsin, arccos, arctan import ausgaben as aus def gha1(re, phi_p1, lambda_p1, A_p1, s, eps): """ Berechnung der 1. Geodätische Hauptaufgabe nach Gauß´schen Mittelbreitenformeln :param re: Klasse Ellipsoid :param phi_p1: Breite Punkt 1 :param lambda_p1: Länge Punkt 1 :param A_p1: Azimut der geodätischen Linie in Punkt 1 :param s: Strecke zu Punkt 2 :param eps: Abbruchkriterium für Winkelgrößen :return: Breite, Länge, Azimut von Punkt 2 """ t = lambda phi: tan(phi) eta = lambda phi: sqrt(re.e_ ** 2 * cos(phi) ** 2) F1 = lambda A, phi, s: 1 + (2 + 3 * t(phi)**2 + 2 * eta(phi)**2) / (24 * re.N(phi) ** 2) * sin(A) ** 2 * s ** 2 \ + (t(phi)**2 - 1) * eta(phi) ** 2 / (8 * re.N(phi) ** 2) * cos(A) ** 2 * s ** 2 F2 = lambda A, phi, s: 1 + t(phi) ** 2 / (24 * re.N(phi) ** 2) * sin(A) ** 2 * s ** 2 \ - (1 + eta(phi)**2 - 9 * eta(phi)**2 * t(phi)**2) / (24 * re.N(phi) ** 2) * cos(A) ** 2 * s ** 2 F3 = lambda A, phi, s: 1 + (1 + eta(phi)**2) / (12 * re.N(phi) ** 2) * sin(A) ** 2 * s ** 2 \ + (3 + 8 * eta(phi)**2) / (24 * re.N(phi) ** 2) * cos(A) ** 2 * s ** 2 phi_p2_i = lambda A, phi: phi_p1 + cos(A) / re.M(phi) * s * F1(A, phi, s) lambda_p2_i = lambda A, phi: lambda_p1 + sin(A) / (re.N(phi) * cos(phi)) * s * F2(A, phi, s) A_p2_i = lambda A, phi: A_p1 + sin(A) * tan(phi) / re.N(phi) * s * F3(A, phi, s) phi_p0_i = lambda phi2: (phi_p1 + phi2) / 2 A_p1_i = lambda A2: (A_p1 + A2) / 2 phi_p0 = [] A_p0 = [] phi_p2 = [] lambda_p2 = [] A_p2 = [] # 1. Näherung für P2 phi_p2.append(phi_p1 + cos(A_p1) / re.M(phi_p1) * s) lambda_p2.append(lambda_p1 + sin(A_p1) / (re.N(phi_p1) * cos(phi_p1)) * s) A_p2.append(A_p1 + sin(A_p1) * tan(phi_p1) / re.N(phi_p1) * s) while True: # Berechnug P0 durch Mittelbildung phi_p0.append(phi_p0_i(phi_p2[-1])) A_p0.append(A_p1_i(A_p2[-1])) # Berechnung P2 phi_p2.append(phi_p2_i(A_p0[-1], phi_p0[-1])) lambda_p2.append(lambda_p2_i(A_p0[-1], phi_p0[-1])) A_p2.append(A_p2_i(A_p0[-1], phi_p0[-1])) # Abbruchkriterium if abs(phi_p2[-2] - phi_p2[-1]) < eps and \ abs(lambda_p2[-2] - lambda_p2[-1]) < eps and \ abs(A_p2[-2] - A_p2[-1]) < eps: break nks = 5 for i in range(len(phi_p2)): print(f"P2[{i}]: {aus.gms('phi', phi_p2[i], nks)}\t{aus.gms('lambda', lambda_p2[i], nks)}\t{aus.gms('A', A_p2[i], nks)}") if i != len(phi_p2)-1: print(f"P0[{i}]: {aus.gms('phi', phi_p0[i], nks)}\t\t\t\t\t\t\t\t{aus.gms('A', A_p0[i], nks)}") return phi_p2, lambda_p2, A_p2 def gha2(re, phi_p1, lambda_p1, phi_p2, lambda_p2): """ Berechnung der 2. Geodätische Hauptaufgabe nach Gauß´schen Mittelbreitenformeln :param re: Klasse Ellipsoid :param phi_p1: Breite Punkt 1 :param lambda_p1: Länge Punkt 1 :param phi_p2: Breite Punkt 2 :param lambda_p2: Länge Punkt 2 :return: Länge der geodätischen Linie, Azimut von P1 nach P2, Azimut von P2 nach P1 """ t = lambda phi: tan(phi) eta = lambda phi: sqrt(re.e_ ** 2 * cos(phi) ** 2) phi_0 = (phi_p1 + phi_p2) / 2 d_phi = phi_p2 - phi_p1 d_lambda = lambda_p2 - lambda_p1 f_A = lambda phi: (2 + 3*t(phi)**2 + 2*eta(phi)**2) / 24 f_B = lambda phi: ((t(phi)**2 - 1) * eta(phi)**2) / 8 # f_C = lambda phi: (t(phi)**2) / 24 f_D = lambda phi: (1 + eta(phi)**2 - 9 * eta(phi)**2 * t(phi)**2) / 24 F1 = lambda phi: d_phi * re.M(phi) * (1 - f_A(phi) * d_lambda ** 2 * cos(phi) ** 2 - f_B(phi) * d_phi ** 2 / re.V(phi) ** 4) F2 = lambda phi: d_lambda * re.N(phi) * cos(phi) * (1 - 1 / 24 * d_lambda ** 2 * sin(phi) ** 2 + f_D(phi) * d_phi ** 2 / re.V(phi) ** 4) s = sqrt(F1(phi_0) ** 2 + F2(phi_0) ** 2) A_0 = arctan(F2(phi_0) / F1(phi_0)) d_A = d_lambda * sin(phi_0) * (1 + (1 + eta(phi_0) ** 2) / 12 * s ** 2 * sin(A_0) ** 2 / re.N(phi_0) ** 2 + (3 + 8 * eta(phi_0) ** 2) / 24 * s ** 2 * cos(A_0) ** 2 / re.N(phi_0) ** 2) A_p1 = A_0 - d_A / 2 A_p2 = A_0 + d_A / 2 A_p2_p1 = A_p2 + pi return s, A_p1, A_p2_p1