I am creating a geo database for an archaeological excavation. We want to put data from a local system and from UTM35 in the same QGIS-project. I have Ground Control Points in both systems.

I setted the project to UTM35(EPSG 32635) and now want to create a custom coordinate reference system so that every layer in the local system could be converted on the fly to UTM35.

To calculate transformation parameters I used pyproj. I transformed the coordinates of the ground control points of both systems (local und UTM35) to ECEF WGS84 cartesian. To transform the local points to ECEF, I just assumed the cassini projection (Soldner). Second I calculated the 7 Parameters of the Helmert Transformation (with the code of Gabriel De Luca). I now have the parameters to transform between two ellipsoids.

translation (in m):
X: -195.06498913
Y: 495.68894225
Z: 28.56591918

X: 0.017997038245226384 (rad) ; 3712.1556066732 (arcsec)
Y: 0.00945795348286504 (rad) ; 1950.8429426372 (arcsec)
Z: 0.015533377928717144 (rad) ; 3203.9891888298 (arcsec)

scale factor: 0.9999905702146588 in ppm: 1.0000009999905701

I tried this:

+proj=cass +lat_0=37.53084417 +lon_0=27.27634361 +alpha=0 +x_0=2000 +y_0=2000 +ellps=WGS84 +towgs84=-195.06498913,495.68894225,28.56591918,3712.1556066732,1950.8429426372,3203.9891888298,1.0000009999905701 +units=m +no_defs

and this:

+proj=cass +lat_0=37.53084417 +lon_0=27.27634361 +alpha=0 +x_0=2000 +y_0=2000 +ellps=WGS84 +units=m +no_defs +x=-195.06498913 +y=495.68894225 +z=28.56591918+ s=1.0000009999905701 +rx=3712.1556066732 +ry=1950.8429426372 +rz=3203.9891888298

But the result is not as expected. If I import the local ground control points with it, they don't match with the UTM points. There is a distance of 1 up to 20 meters between them.

Everytime I click enter in the custom coordinate menu, QGIS changes the rotation angles to this: +rx=0.0000049992 +ry=0.0000026272+ rz=0.0000043148

Why does QGIS do that?

Maybe I should use WKT instead.

  • 1
    Have you checked the Helmert Transformation for residual errors? My understanding is that this is a similarity transform, not a "rubber banding" transform like a polynomial. It will make the best fit based on minimizing errors using scaling, rotation and reflection. But but if the coordinates of points in local grid are in some way locally distorted (or some have location errors) then the transformation cannot be perfect at all points. Commented Apr 2, 2021 at 0:16
  • Yes, I have checked the transformation parameters in my python script. I transformed a few points in python and checked if they are in the right place. Commented Apr 2, 2021 at 15:32

1 Answer 1


Helmert transformation, intended for little angles, make the asumptiom that the cosine of a small angle is 1 and the sine of a small angle is the angle itself, in order to linearize the transformation and solve the parameters via minimum squares method.

Between 3D Local Cartesian and ECEF systems we can't make the same assumptiom because angles are big. We find the true coefficients but can't transform as if the computed angles were the parameters of the transformation.

PROJ Helmert transformation includes a +exact parameter to be used in the case of coefficients found with any non-simplified matrices method. I don't know if QGIS can handle the +exact parameter but you can try.

You can use the PROJ 3D Affine (instead Helmert) transformation with the coefficients instead of their computed angles, in order to transform vector and raster data using a pipeline inside ogr2ogr or gdalwarp commands.

3D Affine conversion method is not implemented in CRS definitions to be used with a derived from 3D base CRS, but it is implemented in transformation pipelines and seems better to me if you can transform the data to a standarized CRS before import in QGIS.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.