<div dir="ltr"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">Hi Even,</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">Thank you, your answer clears up a key confusion I had about the types of grid shift files. It looks like I really meant .gtx wherever I said .gsb. In my actual use case, I have files in a separate file format (.byn), which I now assume will need to be converted to .gtx format to use with PROJ.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">> You can use a BoundCRS for that.
</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">Ah, I wasn’t aware of BOUNDCRS until now. To check my understanding, a BoundCRS is one where you input coordinates in SOURCECRS (x, y, z). Then when PROJ reads this in, it uses the ABRIDGEDTRANSFORMATION to convert to TARGETCRS (x’, y’, z’) which becomes the effective source CRS. This can then be converted +to some other CRS as usual. Is this an accurate description?</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt">> Otherwise if it is really a vertical shift (should rather be a .gtx file), use <br>> "+proj=longlat +ellps=GRS80 +geoidgrids=foo.gtx +type=crs"<br><br></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">This command helped point me in the right direction. I experimented using +geoidgrids with other PROJ strings, and used projinfo to examine the WKT. In my case, it looks like I will use something along these lines to support 2D EPSG + custom geoid file:</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">COMPOUNDCRS[“User-defined CRS”,</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">    <WKT for 2D horizontal CRS></span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">    BOUNDCRS[</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">         SOURCECRS[</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">            VERTCRS["unknown",</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                VDATUM["unknown"],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                CS[vertical,1],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                    AXIS["gravity-related height (H)",up,</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                        LENGTHUNIT["metre",1,</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                            ID["EPSG",9001]]]]],</span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">         TARGETCRS[</span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">             GEOGCRS["WGS 84",</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                DATUM["World Geodetic System 1984",</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                    ELLIPSOID["WGS 84",6378137,298.257223563,</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                        LENGTHUNIT["metre",1]]],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                PRIMEM["Greenwich",0,</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                    ANGLEUNIT["degree",0.0174532925199433]],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                CS[ellipsoidal,3],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                    AXIS["latitude",north,</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                        ORDER[1],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                        ANGLEUNIT["degree",0.0174532925199433]],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                    AXIS["longitude",east,</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                        ORDER[2],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                        ANGLEUNIT["degree",0.0174532925199433]],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                    AXIS["ellipsoidal height",up,</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                        ORDER[3],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                        LENGTHUNIT["metre",1]],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                ID["EPSG",4979]]],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">   ABRIDGEDTRANSFORMATION["unknown to WGS84 ellipsoidal height",</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">            METHOD["GravityRelatedHeight to Geographic3D"],</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">            PARAMETERFILE["Geoid (height correction) model file","<GTX filename>",</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">                ID["EPSG",8666]]]]]</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">I also have a related follow-up question about some of the PROJ parameters. I now see that +geoidgrids=foo.gtx is for vertical shifts while +nadgrids=foo.gsb is for horizontal shifts. If this is the case, when would you use +proj=vgridshift +grids=foo.gtx?</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">Thank you,</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">Peter</span></p></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Dec 13, 2019 at 8:17 AM Even Rouault <<a href="mailto:even.rouault@spatialys.com">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">Peter,<br>
<br>
> I am working with custom CRS transformations using cs2cs. For typical EPSG<br>
> codes, this works well, but I now want to support custom grid shift files<br>
> that are not listed in proj.db. I currently am unsure how to do this with<br>
> WKT strings.<br>
> <br>
> I want to describe the following two types of transformations:<br>
> <br>
> <br>
>    1.<br>
> <br>
>    Transform from horizontal CRS EPSG:XXXX to EPSG:4979 using yyyyy.gsb to<br>
>    transform heights<br>
>    2.<br>
> <br>
>    Transform from EPSG:4979 to EPSG:XXXX using yyyyy.gsb to transform<br>
>    heights<br>
> <br>
> <br>
> Where yyyyy.gsb is a custom grid shift file. Is there a way to do this<br>
> using a COMPOUNDCRS like the following?<br>
> <br>
> COMPOUNDCRS[“User-Defined Projection”,<br>
> <br>
>      <WKT for horizontal CRS EPSG:XXXX>,<br>
>     VERTCRS[<whatever parameters are needed to specify yyyyy.gsb>]<br>
> <br>
> ]<br>
<br>
If it is a .gsb file, then it is normally a horizontal shift, not a vertical <br>
one. You shouldn't use a compoundCRs for that.<br>
<br>
You can use a BoundCRS for that. Easy way to bootstrap one is to run<br>
<br>
$ projinfo "+proj=longlat +ellps=GRS80 +nadgrids=foo.gsb +type=crs" \<br>
                -o WKT2_2019 -q<br>
<br>
BOUNDCRS[<br>
    SOURCECRS[<br>
        GEOGCRS["unknown",<br>
            DATUM["Unknown based on GRS80 ellipsoid",<br>
                ELLIPSOID["GRS 1980",6378137,298.257222101,<br>
                    LENGTHUNIT["metre",1],<br>
                    ID["EPSG",7019]]],<br>
            PRIMEM["Greenwich",0,<br>
                ANGLEUNIT["degree",0.0174532925199433],<br>
                ID["EPSG",8901]],<br>
            CS[ellipsoidal,2],<br>
                AXIS["longitude",east,<br>
                    ORDER[1],<br>
                    ANGLEUNIT["degree",0.0174532925199433,<br>
                        ID["EPSG",9122]]],<br>
                AXIS["latitude",north,<br>
                    ORDER[2],<br>
                    ANGLEUNIT["degree",0.0174532925199433,<br>
                        ID["EPSG",9122]]]]],<br>
    TARGETCRS[<br>
        GEOGCRS["WGS 84",<br>
            DATUM["World Geodetic System 1984",<br>
                ELLIPSOID["WGS 84",6378137,298.257223563,<br>
                    LENGTHUNIT["metre",1]]],<br>
            PRIMEM["Greenwich",0,<br>
                ANGLEUNIT["degree",0.0174532925199433]],<br>
            CS[ellipsoidal,2],<br>
                AXIS["latitude",north,<br>
                    ORDER[1],<br>
                    ANGLEUNIT["degree",0.0174532925199433]],<br>
                AXIS["longitude",east,<br>
                    ORDER[2],<br>
                    ANGLEUNIT["degree",0.0174532925199433]],<br>
            ID["EPSG",4326]]],<br>
    ABRIDGEDTRANSFORMATION["unknown to WGS84",<br>
        METHOD["NTv2",<br>
            ID["EPSG",9615]],<br>
        PARAMETERFILE["Latitude and longitude difference file","foo.gsb",<br>
            ID["EPSG",8656]]]]<br>
<br>
But if you just need it for cs2cs purposes, just use the above PROJ.4 style <br>
string.<br>
<br>
Otherwise if it is really a vertical shift (should rather be a .gtx file), use <br>
"+proj=longlat +ellps=GRS80 +geoidgrids=foo.gtx +type=crs"<br>
<br>
Even<br>
<br>
<br>
-- <br>
Spatialys - Geospatial professional services<br>
<a href="http://www.spatialys.com" rel="noreferrer" target="_blank">http://www.spatialys.com</a><br>
</blockquote></div>