To do 3D transformations, you need 3D CRS:
- EPSG:4326 (2D) -> EPSG:4979 (3D)
<Geographic 3D CRS: EPSG:4979>
Name: WGS 84
Axis Info [ellipsoidal]:
- Lat[north]: Geodetic latitude (degree)
- Lon[east]: Geodetic longitude (degree)
- h[up]: Ellipsoidal height (metre)
Area of Use:
- name: World: ...
- bounds: (-180.0, -90.0, 180.0, 90.0)
Datum: World Geodetic System 1984 ensemble
- Ellipsoid: WGS 84
- Prime Meridian: Greenwich
- EPSG:4978 (3D Geocentric CRS)
<Geocentric CRS: EPSG:4978>
Name: WGS 84
Axis Info [cartesian]:
- X[geocentricX]: Geocentric X (metre)
- Y[geocentricY]: Geocentric Y (metre)
- Z[geocentricZ]: Geocentric Z (metre)
Area of Use:
- name: World.
- bounds: (-180.0, -90.0, 180.0, 90.0)
Datum: World Geodetic System 1984 ensemble
- Ellipsoid: WGS 84
- Prime Meridian: Greenwich
Then, you need to provide the Z coordinate on the input for the transform:
from pyproj import Transformer
trans_GPS_to_XYZ = Transformer.from_crs(4979, 4978, always_xy=True)
trans_GPS_to_XYZ.transform(16.37239, 48.20841, 0)
Output:
(40792624085787.8556099837068269556, 45637551200373.201835215402366255, 17863034732351.356130343138300765)
For maximal correctness, you have to enter the actual elevation (in meters) of your transmitters as Z coordinate. Using 0 as in this example corresponds to WGS84 sea level. – Hagen von Eitzen (from comment below)