I was transforming some data the other day using the 7 param helmert transformation and it got me thinking. I have a set of transformation parameters, but these only describe the transformation from WGS84 datum, to Bessel 1841 datum. In practice... using my software, i can technically transform this data from/to any other datum i want, but does this mean: that all datums that exist actually use WGS84 (or some other) as a common denominator to which they all have known transformation parameters, and that the transformation actually happens (in the software) in the form of Datum A -> WGS84 -> Datum B, because there are no known direct parameters from A to B. In my case, since A is already WGS84 it isnt noticable of course (WGS84 -> System B)
It's often true that there's a common datum (geographic coordinate reference system) that you can use to connect two other datums. WGS84 is the usual one and, as Jens said, ETRS89 is common in Europe. I think the use of WGS84 occurred because the US Defense Mapping Agency (DMA, then NIMA, now NGA) wanted to be able to convert between WGS84 and other datums worldwide and published a set of transformations. Plus with GPS reporting in WGS84, that meant that WGS84 has become very popular.
When I first started in the field in the 1990s, I knew of very few transformations that didn't include WGS84, but that's no longer true as more countries have updated their control networks and published a (near-)geocentric datum tied to the ITRF. Now a transformation is often from an older datum to the new datum for a particular country.
Well, going via a common datum is a design choice (and a smart one, by the way). It allows assigning a +towgs84 attribute (transformation parameters) to a coordinate system and consequently allows for converting coordinates between arbitrary coordinate systems by passing only coordinates and coordinate system ids to the transform function:
srcProj = pyproj.Proj(init=epsg_in, preserve_units=True) dstProj = pyproj.Proj(init=epsg_out, preserve_units=True) x, y = pyproj.transform(srcProj, dstProj, x_in, y_in)