<div dir="ltr"><div>Hi Even. I have been testing your branch (I hope correctly) with the method "Affine parametric transformation". Whit this derived CRS (very similar to the previous example)</div><div><br></div><div><span style="font-family:monospace">DERIVEDPROJCRS["derived from EPSG:6507",<br> BASEPROJCRS["NAD83(2011) / Mississippi East (ftUS)",<br> BASEGEOGCRS["NAD83(2011)",<br> DATUM["NAD83 (National Spatial Reference System 2011)",<br> ELLIPSOID["GRS 1980",6378137,298.257222101,<br> LENGTHUNIT["metre",1]]],<br> PRIMEM["Greenwich",0,<br> ANGLEUNIT["degree",0.0174532925199433]]],<br> CONVERSION["SPCS83 Mississippi East zone (US Survey feet)",<br> METHOD["Transverse Mercator",<br> ID["EPSG",9807]],<br> PARAMETER["Latitude of natural origin",29.5,<br> ANGLEUNIT["degree",0.0174532925199433],<br> ID["EPSG",8801]],<br> PARAMETER["Longitude of natural origin",-88.8333333333333,<br> ANGLEUNIT["degree",0.0174532925199433],<br> ID["EPSG",8802]],<br> PARAMETER["Scale factor at natural origin",0.99995,<br> SCALEUNIT["unity",1],<br> ID["EPSG",8805]],<br> PARAMETER["False easting",984250,<br> LENGTHUNIT["US survey foot",0.304800609601219],<br> ID["EPSG",8806]],<br> PARAMETER["False northing",0,<br> LENGTHUNIT["US survey foot",0.304800609601219],<br> ID["EPSG",8807]]]],<br> DERIVINGCONVERSION["Affine",<br> METHOD["Affine parametric transformation",<br> ID["EPSG",9624]],<br> PARAMETER["A0",42,<br> LENGTHUNIT["US survey foot",0.304800609601219],<br> ID["EPSG",8623]],<br> PARAMETER["A1",1,<br> SCALEUNIT["coefficient",1],<br> ID["EPSG",8624]],<br> PARAMETER["A2",0,<br> SCALEUNIT["coefficient",1],<br> ID["EPSG",8625]],<br> PARAMETER["B0",999,<br> LENGTHUNIT["US survey foot",0.304800609601219],<br> ID["EPSG",8639]],<br> PARAMETER["B1",0,<br> SCALEUNIT["coefficient",1],<br> ID["EPSG",8640]],<br> PARAMETER["B2",1,<br> SCALEUNIT["coefficient",1],<br> ID["EPSG",8641]]],<br> CS[Cartesian,2],<br> AXIS["(Y)",north,<br> ORDER[1],<br> LENGTHUNIT["US survey foot",0.304800609601219,<br> ID["EPSG",9003]]],<br> AXIS["(X)",east,<br> ORDER[2],<br> LENGTHUNIT["US survey foot",0.304800609601219,<br> ID["EPSG",9003]]]]</span></div><div><br></div><div>and I get these transformations:</div><div><br></div><div><span style="font-family:monospace">$ projinfo -s "EPSG:6507" -t "$(cat derived.wkt)" -o proj -q<br>+proj=pipeline<br> +step +proj=unitconvert +xy_in=us-ft +xy_out=m<br> +step +proj=affine +xoff=42 +s11=1 +s12=0 +yoff=999 +s21=0 +s22=1</span><br></div><div><br></div><div><span style="font-family:monospace">$ projinfo -s "EPSG:6318" -t "$(cat derived.wkt)" -o proj -q<br>+proj=pipeline<br> +step +proj=axisswap +order=2,1<br> +step +proj=unitconvert +xy_in=deg +xy_out=rad<br> +step +proj=tmerc +lat_0=29.5 +lon_0=-88.8333333333333 +k=0.99995 +x_0=300000<br> +y_0=0 +ellps=GRS80<br> +step +proj=affine +xoff=42 +s11=1 +s12=0 +yoff=999 +s21=0 +s22=1</span><br></div><div><br></div><div>The first case is just applying the derived conversion because the input is "the same" as the base (well, I swapped the axes). If I understood correctly "+xy_out=m" is converting to meters, so the affine operation is done in meters easting-northing, regardless the unit I wrote in the parameters. But nothing is done later (like correcting the out units an order as in your PR)<br></div><div><br></div><div>On the second command, where the input is geographic coordinates, the input for the affine is also meters, but no conversion at the end.</div><div><br></div><div>Am I right?<br></div><div><br></div><div>Thanks.</div><div><br></div><div>PS what if I make a compound of a derived projected and vertical? Is that a problem?<br></div><div><div><div dir="ltr" data-smartmail="gmail_signature">.___ ._ ..._ .. . ._. .___ .. __ . _. . __.. ... .... ._ .__<br>Entre dos pensamientos racionales <br>hay infinitos pensamientos irracionales.<br><br></div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 4 Aug 2022 at 18:09, Javier Jimenez Shaw <<a href="mailto:j1@jimenezshaw.com" target="_blank">j1@jimenezshaw.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Thank you Even!</div><div><br></div><div>To confirm that I understood your changes and how to use it.</div><div>a) the PROJ-based operation method must work in meters and easting-northing (converting from-meters at the beginning and to-meters at the end if I want to keep my values unchanged)</div><div>b) In this case transverse mercator returns meters (the input unit for the operation method). Is that the case for every projection?</div><div>c) your changes add a unit conversion and a swap axis if needed at the end. That will produce a sensible output even with a no-op toperation (like xoff=0) But as said in a), it is not affecting the units and order of the operation method.<br></div><div><br></div><div>Does this apply to other derived operations, like <span style="color:rgb(48,48,48);font-family:Arial,Helvetica,sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;display:inline;float:none">"Affine parametric transformation" <a href="https://epsg.org/coord-operation-method_9624/Affine-parametric-transformation.html" target="_blank">https://epsg.org/coord-operation-method_9624/Affine-parametric-transformation.html</a> ? I guess it may have a similar problem.</span></div><div>I do not have clear if the parameters of <span style="color:rgb(48,48,48);font-family:Arial,Helvetica,sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;display:inline;float:none">"Affine parametric transformation" must be in the meters, in the same unit as the system, or it is transforming it depending on the value in the WKT2.</span></div><div><span style="color:rgb(48,48,48);font-family:Arial,Helvetica,sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;display:inline;float:none">I will use your branch and try an example.</span></div><div><span style="color:rgb(48,48,48);font-family:Arial,Helvetica,sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;display:inline;float:none"><br></span></div><div><span style="color:rgb(48,48,48);font-family:Arial,Helvetica,sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;display:inline;float:none">Cheers,</span></div><div><span style="color:rgb(48,48,48);font-family:Arial,Helvetica,sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;display:inline;float:none">Javier<br></span></div><div><span style="color:rgb(48,48,48);font-family:Arial,Helvetica,sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;display:inline;float:none"></span></div><div><div><div><div dir="ltr">.___ ._ ..._ .. . ._. .___ .. __ . _. . __.. ... .... ._ .__<br>Entre dos pensamientos racionales <br>hay infinitos pensamientos irracionales.<br><br></div></div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 4 Aug 2022 at 17:14, Even Rouault <<a href="mailto:even.rouault@spatialys.com" target="_blank">even.rouault@spatialys.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<p>Javier,</p>
<p>I have had a bit of hesitation if the current behaviour was a
feature or a bug, and opted for the later while investigating what
happened: the axis unit and order of the source CRS (projected
CRS) were well taken into account to "normalize" to metre,
easting/northing order before applying the user provided PROJ
string, but the axis unit and order of the target CRS (derived
projected CRS) were ignored.</p>
<p>I've addressed this per <a href="https://github.com/OSGeo/PROJ/pull/3281" target="_blank">https://github.com/OSGeo/PROJ/pull/3281</a>
. It might potentially break people that have compensated for
that, but I feel it is such a marginal use case that fixing it is
the best thing.</p>
<p>Note however that you must adjust your PROJ string: xoff must be
expressed in meters. So you should change xoff to
65.6166666666667. Or do like I did in the test I added, that is
convert xy from m (as I said above, PROJ normalizes to (resp.
from) metre, easting/northing each step before (resp. after)
applying the user PROJ string) to us-ft, then apply the affine
with xoff=20, and finally convert back from us-ft to xy. <br>
</p>
<p> Even</p>
<p><br>
</p>
<div>Le 03/08/2022 à 19:52, Javier Jimenez
Shaw a écrit :<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>Hi</div>
<div><br>
</div>
<div>I am trying to make a derived projected CRS... in feet.</div>
<div>The conversion method is a "PROJ-based operation method"
with an affine transformation (simplified here with just xoff
of 20 feet).</div>
<div><a href="https://proj.org/operations/transformations/affine.html" target="_blank">https://proj.org/operations/transformations/affine.html</a></div>
<div><br>
</div>
<div>The derived system is something like this (my data is 3D,
but in 2D is also reproduced):</div>
<div><br>
</div>
<div><span style="font-family:monospace">$ cat derived.wkt</span></div>
<div><br>
</div>
<div><span style="font-family:monospace">DERIVEDPROJCRS["Custom
Site Calibrated CRS",<br>
BASEPROJCRS["NAD83(2011) / Mississippi East (ftUS)",<br>
BASEGEOGCRS["NAD83(2011)",<br>
DATUM["NAD83 (National Spatial Reference System
2011)",<br>
ELLIPSOID["GRS 1980",6378137,298.257222101,<br>
LENGTHUNIT["metre",1]]],<br>
PRIMEM["Greenwich",0,<br>
ANGLEUNIT["degree",0.0174532925199433]]],<br>
CONVERSION["SPCS83 Mississippi East zone (US Survey
feet)",<br>
METHOD["Transverse Mercator",<br>
ID["EPSG",9807]],<br>
PARAMETER["Latitude of natural origin",29.5,<br>
ANGLEUNIT["degree",0.0174532925199433],<br>
ID["EPSG",8801]],<br>
PARAMETER["Longitude of natural
origin",-88.8333333333333,<br>
ANGLEUNIT["degree",0.0174532925199433],<br>
ID["EPSG",8802]],<br>
PARAMETER["Scale factor at natural
origin",0.99995,<br>
SCALEUNIT["unity",1],<br>
ID["EPSG",8805]],<br>
PARAMETER["False easting",984250,<br>
LENGTHUNIT["US survey
foot",0.304800609601219],<br>
ID["EPSG",8806]],<br>
PARAMETER["False northing",0,<br>
LENGTHUNIT["US survey
foot",0.304800609601219],<br>
ID["EPSG",8807]]]],<br>
DERIVINGCONVERSION["Affine transformation as
PROJ-based",<br>
METHOD["PROJ-based operation method: +proj=pipeline
+step +proj=affine +xoff=20"]],<br>
CS[Cartesian,2],<br>
AXIS["easting (X)",east,<br>
ORDER[1],<br>
LENGTHUNIT["US survey foot",0.304800609601219]],<br>
AXIS["northing (Y)",north,<br>
ORDER[2],<br>
LENGTHUNIT["US survey foot",0.304800609601219]],<br>
REMARK["EPSG:6507 with 20 feet offset"]]</span></div>
<div><br>
</div>
<div>But the output I get seems to be in meters (I deduced that
running with PROJ_DEBUG=3) It is kind of ignoring the CS.</div>
<div><span style="font-family:monospace">$ echo 29 -88 0 | cs2cs
EPSG:6318 EPSG:6507<br>
1250642.38 -180875.29 0.00<br>
$ echo 29 -88 0 | cs2cs EPSG:6318 "$(cat derived.wkt)"<br>
381216.56 -55130.90 0.00</span></div>
<div><br>
</div>
<div>If I concatenate the pipeline with cct, I get the result I
was expecting (20 feet more in the x):</div>
<div><span style="font-family:monospace">$ echo 29 -88 0 | cs2cs
EPSG:6318 EPSG:6507 | cct +proj=pipeline +step +proj=affine
+xoff=20<br>
1250662.3800 -180875.2900 0.0000</span></div>
<div><br>
</div>
<div>Is that expected? Am I doing anything wrong?<br>
</div>
<div><br>
</div>
<div>Thanks.<br>
</div>
<div>
<div>
<div dir="ltr">.___ ._ ..._ .. . ._.
.___ .. __ . _. . __.. ... .... ._ .__<br>
Entre dos pensamientos racionales <br>
hay infinitos pensamientos irracionales.<br>
<br>
</div>
</div>
</div>
</div>
<br>
<fieldset></fieldset>
<pre>_______________________________________________
PROJ mailing list
<a href="mailto:PROJ@lists.osgeo.org" target="_blank">PROJ@lists.osgeo.org</a>
<a href="https://lists.osgeo.org/mailman/listinfo/proj" target="_blank">https://lists.osgeo.org/mailman/listinfo/proj</a>
</pre>
</blockquote>
<pre cols="72">--
<a href="http://www.spatialys.com" target="_blank">http://www.spatialys.com</a>
My software is free, but my time generally not.</pre>
</div>
</blockquote></div>
</blockquote></div>