<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Hi QGIS community,</div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
QGIS seems to transform coordinates differently than and what is considered the geodetic correct way like PROJ does. It looks like QGIS uses a zero height instead of the actual height of a 3D point for transforming the horizontal component of the coordinates.
 Normally, the height has as only a small influence on the transformation of the horizontal component of coordinates. In case of a large difference in the vertical of two CRSs and large height values, this can become significant. I'll give a practical example:</div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
I have coordinates of a triangulation pilar in EPSG:10645 (compound projected CRS: DPnet Saba + Saba height) in an input file:</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
echo 4740.3800 1890.1200 870.3900 > input.txt</div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
 </div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
The transformation to EPSG:10638 (3D geographic CRS: BES2020 Saba) with PROJ 9.6.0 gives correct results:</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
cs2cs epsg:10645 epsg:10638 --only-best -f %.9f input.txt</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
17.635528781    -63.237251291 827.6282[...]</div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
 </div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
I saved the output coordinates to file:</div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
 <span style="font-family: Consolas, Courier, monospace;">    echo 17.635528781 -63.237251291 827.6282 > output.txt</span></div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
 </div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
The used transformation is:</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
projinfo -s epsg:10645 -t epsg:10638 -o proj</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
Candidate operations found: 4</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
-------------------------------------</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
Operation No. 1:</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
 </div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
unknown id, Inverse of Saba Transverse Mercator 2020 + Inverse of Saba to Saba height (1) + Saba to BES2020 Saba (1),</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
[…]</div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
 </div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
However, the location of input.txt and output.txt is visually 0.1 m different in QGIS (version 3.42.2):</div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
- open input.txt in QGIS (field_1, field_2, field_3 as EPSG:10645)</div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
- open output.txt in QGIS (field_2, field_1, field_3 as EPSG:10638), where I selected the first transformation (the inverse of the transformation used by cs2cs):</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
Inverse of Saba to BES2020 Saba (1) + Saba to Saba height (1) + Saba Transverse Mercator 2020</div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
 </div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
The wrong visualisation of the location of output.txt can be exported in QGIS as CSV geometry AS_XYZ:</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
4740.3647[...],1890.2050[...],827.6282[...]</div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
 </div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
This is exactly the xy that I get when I transform output.txt back to EPSG:10645 with zero height:</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
echo 17.635528781 -63.237251291 0 | cs2cs epsg:10638 epsg:10645 --only-best -f %.4f</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
4740.3647       1890.2052 42.4286</div>
<div class="elementToProof" style="text-indent: 36pt; margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
 </div>
<div class="elementToProof" style="margin: 0cm; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Is this the intended behaviour for QGIS? I don’t like it…</div>
<div class="elementToProof" style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class="elementToProof" style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Jochem</div>
<div class="elementToProof" style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
</body>
</html>