Can anyone show me how I can construct a PROJ or WKT2 string with affine transformation parameters to create a custom CRS in QGIS? I wish to use the following affine transformation parameters to convert UTM28N-WGS84 coordinates to a local coordinate system: Translation x-axis: 592643.28732299805 Translation y-axis: -1507351.9635620117 Rotation around z-axis (degrees counter clockwise): 50.0636222

I have used these parameters to successfully transform a vector file using QGIS 'Vector geometry>Affine transformation' tool but I would like to define a custom CRS using these parameters.


1 Answer 1


Thanks Leigh.

If anyone else is stuck with a similar problem, I finally got it working with the WKT2 string shown below.

I got the affine transformation parameters from a MapInfo PRJ definition of the custom projection (just the cosine and sine of the custom grid's rotation angle, scaling values and the x and y offsets), then added a DERIVINGCONVERSION section to UTM28N's WKT string and put the affine transformation parameters into the DERIVINGCONVERSION parameters A0,A1,A2,B0,B1,B2.

Mapinfo PRJ: "CustomLocalGrid", 1008, 104,7, -15, 0, 0.9996, 500000, 0, 7, 0.641936585016, -0.766761053354, 592643.28732299805, 0.766757541511, 0.641937852139, -1507351.9635620117

DERIVEDPROJCRS["CustomLocalGrid", BASEPROJCRS["WGS 84 / UTM zone 28N", BASEGEOGCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4326]], CONVERSION["UTM zone 28N", METHOD["Transverse Mercator", ID["EPSG",9807]], PARAMETER["Latitude of natural origin",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",-15, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",500000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",0, LENGTHUNIT["metre",1], ID["EPSG",8807]]]], DERIVINGCONVERSION["Affine", METHOD["Affine parametric transformation", ID["EPSG",9624]], PARAMETER["A0",592643.2873, LENGTHUNIT["metre",1], ID["EPSG",8623]], PARAMETER["A1",0.6419365850161, SCALEUNIT["coefficient",1], ID["EPSG",8624]], PARAMETER["A2",-0.766761053354, SCALEUNIT["coefficient",1], ID["EPSG",8625]], PARAMETER["B0",-1507351.96356201, LENGTHUNIT["metre",1], ID["EPSG",8639]], PARAMETER["B1",0.766757541511, SCALEUNIT["coefficient",1], ID["EPSG",8640]], PARAMETER["B2",0.641937852139, SCALEUNIT["coefficient",1], ID["EPSG",8641] ]], CS[Cartesian,2], AXIS["(E)",east, ORDER[1], LENGTHUNIT["metre",1]], AXIS["(N)",north, ORDER[2], LENGTHUNIT["metre",1]], USAGE[ SCOPE["unknown"], AREA["World - N hemisphere - 18°W to 12°W - by country"], BBOX[0,-18,84,-12]] ]

  • I asked a similar question (gis.stackexchange.com/questions/288232/…) and the answer is using oblique mercator. It works well but it take a bit of fiddling to get the false easting/northings to work out the way you want them to. Commented Feb 19, 2021 at 15:53

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.