Coordinate transformations with pipelines
Antonio Valanzano
anvalanz at gmail.com
Thu Feb 26 02:28:21 PST 2026
Dear Florian,
thanks for your answer.
I have already used projinfo and I have discovered that there 3
possible transformations as you can see from the following output
---------------------------------------------------------------------------------------------------
C:\>projinfo -s EPSG:23033 -t EPSG:25833 -o proj --spatial-test intersects
Candidate operations found: 3
-------------------------------------
Operation No. 1:
unknown id, Inverse of UTM zone 33N + ED50 to ETRS89 (1) + UTM zone 33N, 1
m, Norway - offshore north of 65°N. Also Svalbard.
PROJ string:
+proj=pipeline
+step +inv +proj=utm +zone=33 +ellps=intl
+step +proj=push +v_3
+step +proj=cart +ellps=intl
+step +proj=helmert +x=-116.641 +y=-56.931 +z=-110.559
+rx=0.892507816631186
+ry=0.920766095087038 +rz=-0.916640798962096 +s=-3.52
+convention=position_vector
+step +inv +proj=cart +ellps=GRS80
+step +proj=pop +v_3
+step +proj=utm +zone=33 +ellps=GRS80
-------------------------------------
Operation No. 2:
unknown id, Inverse of UTM zone 33N + ED50 to ETRS89 (4) + UTM zone 33N, 1
m, Denmark - onshore.
PROJ string:
+proj=pipeline
+step +inv +proj=utm +zone=33 +ellps=intl
+step +proj=push +v_3
+step +proj=cart +ellps=intl
+step +proj=helmert +x=-81.1 +y=-89.4 +z=-115.8 +rx=0.485 +ry=0.024
+rz=0.413
+s=-0.54 +convention=position_vector
+step +inv +proj=cart +ellps=GRS80
+step +proj=pop +v_3
+step +proj=utm +zone=33 +ellps=GRS80
-------------------------------------
Operation No. 3:
unknown id, Inverse of UTM zone 33N + Ballpark geographic offset from ED50
to ETRS89 + UTM zone 33N, unknown accuracy, World, has ballpark
transformation
PROJ string:
+proj=pipeline
+step +inv +proj=utm +zone=33 +ellps=intl
+step +proj=utm +zone=33 +ellps=GRS80
C:\>
----------------------------------------------------------------------------------------------------
PostGIS in my case has used the last one (the less accurate transformation
- "ballpark transformation")
This is the default behaviour in this case as you can see also looking at
the output of cs2cs
C:\>cs2cs EPSG:23033 EPSG:25833
541000 4516000
540998.14 4515921.57 0.00
The result is coincident with the output of my sql script
540998.1383329581 4515921.565374701
My question was about the criteria used by the Proj.6 lib for choosing
between several possible transformations and also to know the
transformation pipeline code used.
Searching on the net I have found that the same results (the approximate
ones) can be obtained using the function ST_TransformPipeline () a variant
of ST_Transform and specifying the EPSG code the transformation
-- I have first transformed the cartografic coordinates 541000 4516000 from
EPSG:23033 to geographic coordinates with EPSG:4230
WITH coord_4258 AS
(
SELECT
ST_X(ST_TransformPipeline('SRID=4230;POINT(15.48596772786105
40.79326538046647)'::geometry,'urn:ogc:def:coordinateOperation:EPSG::1611'))
as x_4258,
ST_Y(ST_TransformPipeline('SRID=4230;POINT(15.48596772786105
40.79326538046647)'::geometry,'urn:ogc:def:coordinateOperation:EPSG::1611'))
as y_4258
)
SELECT
ST_AsEWKT(ST_Transform(ST_Point(x_4258,y_4258, 4258), 25833))
FROM coord_4258;
---------------
"st_asewkt"
"SRID=25833;POINT(540998.1383329581 4515921.565374701)"
.
In order to obtain better results I have used a specific EPSG
transformation code (1588)
WITH coord_4258 AS
(
SELECT
ST_X(ST_TransformPipeline('SRID=4230;POINT(15.48596772786105
40.79326538046647)'::geometry,'urn:ogc:def:coordinateOperation:EPSG::1588'))
as x_4258,
ST_Y(ST_TransformPipeline('SRID=4230;POINT(15.48596772786105
40.79326538046647)'::geometry,'urn:ogc:def:coordinateOperation:EPSG::1588'))
as y_4258
)
SELECT
ST_AsEWKT(ST_Transform(ST_Point(x_4258,y_4258, 4258), 25833))
FROM coord_4258;
----------------
"st_asewkt"
"SRID=25833;POINT(540931.3414974756 4515810.597825925)"
The most accurate results are those obtained using a NTv2 grid file
540932.206 4515807.111
and the results of the transformation with EPSG:1588 are better than those
of EPSG:1611 (used da PostGIS).
The questions are now:
1. why did Proj.6 lib choose the transformation with EPSG code 1611 rather
than the one with EPSG code 1588 ?
2. why there is no evidence in the output of ST_Transform or cs2cs of the
transformation code chosen for doing the transformation ?
I hope this long mail will help clarify my initial question.
Antonio
Il giorno gio 26 feb 2026 alle ore 10:29 Florian Nadler <
florian.nadler at cybertec.at> ha scritto:
> Try projinfo (https://proj.org/en/stable/apps/projinfo.html#examples)
> from the commandline of your PostGIS host:
>
> projinfo -s EPSG:23033 -t EPSG:25833
>
> Transformation can done via commandline as follows:
>
> cs2cs EPSG:23033 EPSG:25833 <<EOF
> 541000 4516000
> EOF
>
> Florian
>
> Am 24.02.2026 um 08:18 schrieb Antonio Valanzano:
> > I am usign PostGIS 3.5 with PostgreSQL 17.0
> >
> > Here are the details for my installation:
> >
> > "postgis_full_version"
> > "POSTGIS=""3.5.3 3.5.3"" [EXTENSION] PGSQL=""170""
> > GEOS=""3.13.1-CAPI-1.19.2"" PROJ=""8.2.1 NETWORK_ENABLED=OFF
> > URL_ENDPOINT=https://cdn.proj.org
> >
> USER_WRITABLE_DIRECTORY=C:\Windows\ServiceProfiles\NetworkService\AppData\Local/proj
>
> >
> > DATABASE_PATH=C:\Program
> > Files\PostgreSQL\17\share\contrib\postgis-3.5\proj\proj.db"" (compiled
> > against PROJ 8.2.1)
> > LIBXML=""2.12.5"" LIBJSON=""0.12"" LIBPROTOBUF=""1.2.1"" WAGYU=""0.5.0
> > (Internal)"" (core procs from ""3.5.2 3.5.2"" need upgrade)"
> >
> >
> > I have done the following coordinate transformation
> > from ED50 / UTM zone 33N (espg:23033)
> > to ETRS89 / UTM zone 33N (epsg:25833
> >
> > SELECT
> > ST_X(ST_Transform(ST_Point(541000,4516000,23033),25833)) as X,
> > ST_Y(ST_Transform(ST_Point(541000,4516000,23033),25833)) as Y;
> >
> > -- result
> > "x" "y"
> > 540998.1383329581 4515921.565374701
> >
> > I have read that the best way to utilize PROJ.6 capabilities is by
> > allowing the library to freely choose the best possible transformation
> > paths
> > between the origin and the destination CRSes.
> >
> > Does someone know how to find which specific transformation pipeline
> > has been chosen by the PROJ.6 library in this specific transformation ?
> >
> > Antonio
> >
> >
> --
> CYBERTEC PostgreSQL International GmbH
> Römerstraße 19, A-2752 Wöllersdorf
> Web: https://www.cybertec-postgresql.com
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20260226/f0ed8955/attachment.htm>
More information about the postgis-users
mailing list