[gdal-dev] Compound CRS

Javier Jimenez Shaw j1 at jimenezshaw.com
Fri Apr 24 01:45:29 PDT 2026


I don't think you need two level nesting derivations. You can use a
topocentric "normal" system and add the affine transformation as a derived
projected.
There are two types of topocentric : geographic_topocentric
and geocentric_topocentric.
https://github.com/OSGeo/PROJ/blob/master/test/unit/test_operation.cpp#L4484
https://github.com/OSGeo/PROJ/blob/master/test/unit/test_operation.cpp#L4544

On Fri, 24 Apr 2026 at 02:39, Even Rouault via gdal-dev <
gdal-dev at lists.osgeo.org> wrote:

> Norman,
>
> (ISO-19111 pedantically speaking your object is not a CompoundCRS, which
> would be a geographic/projected 2D + vertical CRS, but more a DerivedCRS)
>
> the error is "expected" given that it is generally not possible to infer a
> CRS definition from a PROJ pipeline
>
> 2 ways of addressing this:
>
> - the hard one: create a "real" CRS fighting with WKT/PROJSON (maybe just
> PROJJSON as I'm not sure WKT allows that 2-level nesting of derivation) of
> a DerivedGeodeticCRS (affine transform) of a DerivedGeodeticCRS (geographic
> to topocentric) of a geographic CRS... or something like that. I don't
> have  an example of that handy.  Some potential inspiration at
> https://github.com/qgis/QGIS/pull/65873/changes#diff-443e243a4b840a314841dfd4d6aae7f0981d64233badade7af0a769e29536982R3332
> and
> https://github.com/OSGeo/PROJ/blob/master/test/unit/test_operationfactory.cpp#L11174
>
> - or likely easier, write the full PROJ pipeline of the transformation,
> which should probably be just a matter of inverting your pipeline
> (reversing the steps with a +inv keyword on each) and use
> ct.SetOperation(proj_pipeline) as in
> https://github.com/OSGeo/gdal/blob/0bb1c88ff756f174577c6056af6d9452942a5a1a/autotest/osr/osr_ct.py#L359
>
> Even
> Le 24/04/2026 à 02:08, Norman Barker via gdal-dev a écrit :
>
> Hi,
>
> I am trying to use a compound CRS in GDAL. I have a CRS that is
> essentially topocentric but with an angle and skew applied to the
> tangential plane by two unit vectors uiax and uiay.
>
> I am doing this in Python and the code is as follows;
>
>             # planar angle between unit vector and northing in topocentric
>             theta =  np.arccos(np.clip(np.dot(uiay[:2], [0, 1]), -1.0, 1.0
> ))
>             # planar angle between unit vector and easting in topocentric
>             phi =  np.arccos(np.clip(np.dot(uiax[:2], [1, 0]), -1.0, 1.0))
>             # Build rotation matrix
>             rot = np.array([
>                 [np.cos(theta), -np.sin(theta), 0.0, 0.0],
>                 [np.sin(theta),  np.cos(theta), 0.0, 0.0],
>                 [          0.0,            0.0, 1.0, 0.0],
>                 [          0.0,            0.0, 0.0, 1.0],
>             ]
>             )
>             # Build shear/skew matrix
>             m = np.tan(phi)
>             skew = np.array([
>                 [1.0, 0.0, 0.0, 0.0],
>                 [  m, 1.0, 0.0, 0.0],
>                 [0.0, 0.0, 1.0, 0.0],
>                 [0.0, 0.0, 0.0, 1.0],
>             ]
>             )
>             # get affine transform
>             a = rot @ skew
>             wgs84 = osr.SpatialReference(epsg=4326)
>             wgs84.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER)
>             topo = osr.SpatialReference(f"+proj=pipeline "
>                                         f"+step +proj=topocentric +X_0={
> ref_ecf[0]} +Y_0={ref_ecf[1]} +Z_0={ref_ecf[2]} "
>                                         f"+step +proj=affine "
>                                         f"+s11={a[0,0]} +s12={a[0,1]}
> +s13={a[0,2]} "
>                                         f"+s21={a[1,0]} +s22={a[1,1]}
> +s23={a[1,2]} "
>                                         f"+s31={a[2,0]} +s32={a[2,1]}
> +s33={a[2,2]} "
>                                         )
>             ct = osr.CoordinateTransformation(topo, wgs84)
>
> I get the error message "ERROR 1: PROJ: proj_crs_get_coordinate_system:
> Object is not a SingleCRS"
>
> Which is true, it is not. I have grep'd the tests and have not seen any
> examples. Using `CoordinateTransformationOptions` applies once the
> conversion to lat/lon is complete.
>
> Thanks,
>
> Norman
>
> _______________________________________________
> gdal-dev mailing listgdal-dev at lists.osgeo.orghttps://lists.osgeo.org/mailman/listinfo/gdal-dev
>
> -- http://www.spatialys.com
> My software is free, but my time generally not.
> Highly recommend OxiGDAL if you want to live in the 21th century and cure Bixonimania
>
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/gdal-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20260424/52490e50/attachment.htm>


More information about the gdal-dev mailing list