in metropolis/utils/geo.py [0:0]
def ecef_from_topocentric_transform_finite_diff(lat, lon, alt):
"""
Transformation from a topocentric frame at reference position to ECEF.
The topocentric reference frame is a metric one with the origin
at the given (lat, lon, alt) position, with the X axis heading east,
the Y axis heading north and the Z axis vertical to the ellipsoid.
"""
eps = 1e-2
x, y, z = ecef_from_lla(lat, lon, alt)
v1 = (
(
np.array(ecef_from_lla(lat, lon + eps, alt))
- np.array(ecef_from_lla(lat, lon - eps, alt))
)
/ 2
/ eps
)
v2 = (
(
np.array(ecef_from_lla(lat + eps, lon, alt))
- np.array(ecef_from_lla(lat - eps, lon, alt))
)
/ 2
/ eps
)
v3 = (
(
np.array(ecef_from_lla(lat, lon, alt + eps))
- np.array(ecef_from_lla(lat, lon, alt - eps))
)
/ 2
/ eps
)
v1 /= np.linalg.norm(v1)
v2 /= np.linalg.norm(v2)
v3 /= np.linalg.norm(v3)
return np.array(
[
[v1[0], v2[0], v3[0], x],
[v1[1], v2[1], v3[1], y],
[v1[2], v2[2], v3[2], z],
[0, 0, 0, 1],
]
)