<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>