9

When I am prompted for a transformation to use in QGIS, the recommended/default option (in green) is the least accurate one. In my case, QGIS recommends a transformation with an accuracy of 6m when the other options offer accuracies of 0.15m. See the attached image.

QGIS 6m transformation

Is there any reason why I shouldn't just pick the best accuracy? How is this default picked by QGIS?

Source WKT Bbox (EPSG:3490): -124.45, 39.59, -119.99, 42.01

Destination WKT Bbox (ESRI:102641): -124.45, 39.59, -119.99, 42.01

6
  • 3
    The question is do you need to capture data at 15cm accuracy?
    – Mapperz
    Commented Dec 23, 2022 at 22:56
  • 7
    "By default, QGIS will attempt to use the most accurate transformation available. However, in some cases this may not be possible, e.g. whenever additional support files are required to use a transformation. Whenever a more accurate transformation is available, but is not currently usable, QGIS will show an informative warning message advising you of the more accurate transformation and how to enable it on your system. Usually, this requires download of an external package of transformation support files, and extracting these to the proj folder under your QGIS user profile folder." (QGIS Site) Commented Dec 23, 2022 at 22:57
  • 2
    @RafaelPinheiroMachado Thanks for the doc link. It was helpful but didn't quite answer my question. Apparently the unavailable transforms show up as greyed-out options. All of my options are available and can be selected as transformations. Although the the documentation didn't address this, I assume the green option is the default? Commented Dec 23, 2022 at 23:17
  • 2
    @Mapperz Need? I'd have to think about that awhile ^_^, but generally I'm doing engineering work and 6m accuracy is not so great. However, I understand the potential limitations. Commented Dec 23, 2022 at 23:26
  • 3
    Please add the definitions of the source and target CRS and the bounding box you your data. There may be some special reason to select a less accurate transformation, for example if the more accurate transformation has been defined for a smaller area.
    – user30184
    Commented Dec 24, 2022 at 13:41

1 Answer 1

8

How is this default picked by QGIS?

QGIS makes a query to PROJ libraries to obtain the list of possible transformations between two reference frames or geodetic datums. Sorting algorithm is documented in: https://proj.org/operations/operations_computation.html

The list can be consulted from the projinfo application.
The order in this case is due to the first result is by direct relationship in the database, while the remaining 3 are by spatial relationship (–spatial-test intersects parameter).
PROJ 9.1.1 seems to have included one more direct relationship, so the order is:

$ projinfo -s EPSG:3490 -t ESRI:102641 --spatial-test intersects -o PROJ
Candidate operations found: 4
-------------------------------------
Operation No. 1:

unknown id, Inverse of SPCS83 California zone 1 (US Survey feet) + Inverse of NAD83(HARN) to NAD83(NSRS2007) (1) + Inverse of NAD83 to NAD83(HARN) (3) + NAD_1983_StatePlane_California_I_FIPS_0401_Feet, 0.15 m, United States (USA) - California north of 36.5°N.

PROJ string:
+proj=pipeline
  +step +proj=unitconvert +xy_in=us-ft +xy_out=m
  +step +inv +proj=lcc +lat_0=39.3333333333333 +lon_0=-122
        +lat_1=41.6666666666667 +lat_2=40 +x_0=2000000.0001016
        +y_0=500000.0001016 +ellps=GRS80
  +step +inv +proj=hgridshift +grids=us_noaa_cnhpgn.tif
  +step +proj=lcc +lat_0=39.3333333333333 +lon_0=-122 +lat_1=40
        +lat_2=41.6666666666667 +x_0=2000000 +y_0=500000.000000001 +ellps=GRS80
  +step +proj=unitconvert +xy_in=m +xy_out=us-ft

-------------------------------------
Operation No. 2:

unknown id, Inverse of SPCS83 California zone 1 (US Survey feet) + NAD83(NSRS2007) to WGS 84 (1) + Inverse of NAD83 to WGS 84 (1) + NAD_1983_StatePlane_California_I_FIPS_0401_Feet, 6 m, unknown domain of validity

PROJ string:
+proj=pipeline
  +step +proj=unitconvert +xy_in=us-ft +xy_out=m
  +step +inv +proj=lcc +lat_0=39.3333333333333 +lon_0=-122
        +lat_1=41.6666666666667 +lat_2=40 +x_0=2000000.0001016
        +y_0=500000.0001016 +ellps=GRS80
  +step +proj=lcc +lat_0=39.3333333333333 +lon_0=-122 +lat_1=40
        +lat_2=41.6666666666667 +x_0=2000000 +y_0=500000.000000001 +ellps=GRS80
  +step +proj=unitconvert +xy_in=m +xy_out=us-ft

-------------------------------------
Operation No. 3:

unknown id, Inverse of SPCS83 California zone 1 (US Survey feet) + Inverse of NAD83(HARN) to NAD83(NSRS2007) (1) + Inverse of NAD83 to NAD83(HARN) (28) + NAD_1983_StatePlane_California_I_FIPS_0401_Feet, 0.15 m, United States (USA) - Oregon and Washington.

PROJ string:
+proj=pipeline
  +step +proj=unitconvert +xy_in=us-ft +xy_out=m
  +step +inv +proj=lcc +lat_0=39.3333333333333 +lon_0=-122
        +lat_1=41.6666666666667 +lat_2=40 +x_0=2000000.0001016
        +y_0=500000.0001016 +ellps=GRS80
  +step +inv +proj=hgridshift +grids=us_noaa_WO.tif
  +step +proj=lcc +lat_0=39.3333333333333 +lon_0=-122 +lat_1=40
        +lat_2=41.6666666666667 +x_0=2000000 +y_0=500000.000000001 +ellps=GRS80
  +step +proj=unitconvert +xy_in=m +xy_out=us-ft

-------------------------------------
Operation No. 4:

unknown id, Inverse of SPCS83 California zone 1 (US Survey feet) + Inverse of NAD83(HARN) to NAD83(NSRS2007) (1) + Inverse of NAD83 to NAD83(HARN) (34) + NAD_1983_StatePlane_California_I_FIPS_0401_Feet, 0.15 m, United States (USA) - Nevada.

PROJ string:
+proj=pipeline
  +step +proj=unitconvert +xy_in=us-ft +xy_out=m
  +step +inv +proj=lcc +lat_0=39.3333333333333 +lon_0=-122
        +lat_1=41.6666666666667 +lat_2=40 +x_0=2000000.0001016
        +y_0=500000.0001016 +ellps=GRS80
  +step +inv +proj=hgridshift +grids=us_noaa_nvhpgn.tif
  +step +proj=lcc +lat_0=39.3333333333333 +lon_0=-122 +lat_1=40
        +lat_2=41.6666666666667 +x_0=2000000 +y_0=500000.000000001 +ellps=GRS80
  +step +proj=unitconvert +xy_in=m +xy_out=us-ft

It should be noted the absence of ESRI:108190 (WGS_1984_(ITRF00)_To_NAD_1983) transformation:

$ projinfo ESRI:108190 -k operation
PROJ string:
+proj=pipeline
  +step +proj=axisswap +order=2,1
  +step +proj=unitconvert +xy_in=deg +xy_out=rad
  +step +proj=push +v_3
  +step +proj=cart +ellps=WGS84
  +step +proj=helmert +x=0.9956 +y=-1.9013 +z=-0.5215 +rx=0.025915 +ry=0.009426
        +rz=0.011599 +s=0.00062 +convention=coordinate_frame
  +step +inv +proj=cart +ellps=GRS80
  +step +proj=pop +v_3
  +step +proj=unitconvert +xy_in=rad +xy_out=deg
  +step +proj=axisswap +order=2,1

WKT2:2019 string:
COORDINATEOPERATION["WGS_1984_(ITRF00)_To_NAD_1983",
    SOURCECRS[
        GEOGCRS["WGS 84",
            ENSEMBLE["World Geodetic System 1984 ensemble",
                MEMBER["World Geodetic System 1984 (Transit)"],
                MEMBER["World Geodetic System 1984 (G730)"],
                MEMBER["World Geodetic System 1984 (G873)"],
                MEMBER["World Geodetic System 1984 (G1150)"],
                MEMBER["World Geodetic System 1984 (G1674)"],
                MEMBER["World Geodetic System 1984 (G1762)"],
                ELLIPSOID["WGS 84",6378137,298.257223563,
                    LENGTHUNIT["metre",1]],
                ENSEMBLEACCURACY[2.0]],
            PRIMEM["Greenwich",0,
                ANGLEUNIT["degree",0.0174532925199433]],
            CS[ellipsoidal,2],
                AXIS["geodetic latitude (Lat)",north,
                    ORDER[1],
                    ANGLEUNIT["degree",0.0174532925199433]],
                AXIS["geodetic longitude (Lon)",east,
                    ORDER[2],
                    ANGLEUNIT["degree",0.0174532925199433]],
            ID["EPSG",4326]]],
    TARGETCRS[
        GEOGCRS["NAD83",
            DATUM["North American Datum 1983",
                ELLIPSOID["GRS 1980",6378137,298.257222101,
                    LENGTHUNIT["metre",1]]],
            PRIMEM["Greenwich",0,
                ANGLEUNIT["degree",0.0174532925199433]],
            CS[ellipsoidal,2],
                AXIS["geodetic latitude (Lat)",north,
                    ORDER[1],
                    ANGLEUNIT["degree",0.0174532925199433]],
                AXIS["geodetic longitude (Lon)",east,
                    ORDER[2],
                    ANGLEUNIT["degree",0.0174532925199433]],
            ID["EPSG",4269]]],
    METHOD["Coordinate Frame rotation (geog2D domain)",
        ID["EPSG",9607]],
    PARAMETER["X-axis translation",0.9956,
        LENGTHUNIT["metre",1],
        ID["EPSG",8605]],
    PARAMETER["Y-axis translation",-1.9013,
        LENGTHUNIT["metre",1],
        ID["EPSG",8606]],
    PARAMETER["Z-axis translation",-0.5215,
        LENGTHUNIT["metre",1],
        ID["EPSG",8607]],
    PARAMETER["X-axis rotation",0.025915,
        ANGLEUNIT["arc-second",4.84813681109536E-06],
        ID["EPSG",8608]],
    PARAMETER["Y-axis rotation",0.009426,
        ANGLEUNIT["arc-second",4.84813681109536E-06],
        ID["EPSG",8609]],
    PARAMETER["Z-axis rotation",0.011599,
        ANGLEUNIT["arc-second",4.84813681109536E-06],
        ID["EPSG",8610]],
    PARAMETER["Scale difference",0.00062,
        SCALEUNIT["parts per million",1E-06],
        ID["EPSG",8611]],
    OPERATIONACCURACY[0.1],
    USAGE[
        SCOPE["Not known."],
        AREA["Puerto Rico - onshore and offshore. United States (USA) onshore and offshore - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming. US Virgin Islands - onshore and offshore."],
        BBOX[14.92,167.65,74.71,-63.88]],
    ID["ESRI",108190]]

Which has an OPERATIONACCURACY[0.1] node, and it seems to be the one used to create the bound with WGS84 enssemble in the PROJ definition of the ESRI:102641 crs (see the +towgs84= parameter):

$ projinfo ESRI:102641 -o PROJ
Warning: object is deprecated

PROJ.4 string:
+proj=lcc +lat_0=39.3333333333333 +lon_0=-122 +lat_1=40 +lat_2=41.6666666666667 +x_0=2000000 +y_0=500000.000000001 +ellps=GRS80 +towgs84=0.9956,-1.9013,-0.5215,-0.025915,-0.009426,-0.011599,0.00062 +units=us-ft +no_defs +type=crs

However, the binding doesn't seem to get translated to the target crs instance, just like it doesn't get translated to its wkt representation unless --boundcrs-to-wgs84 is expressly requested:

$ projinfo ESRI:102641 --boundcrs-to-wgs84 -o WKT2:2019
WKT2:2019 string:
BOUNDCRS[
    SOURCECRS[
        PROJCRS["NAD_1983_StatePlane_California_I_FIPS_0401_Feet",
            BASEGEOGCRS["NAD83",
                DATUM["North American Datum 1983",
                    ELLIPSOID["GRS 1980",6378137,298.257222101,
                        LENGTHUNIT["metre",1]]],
                PRIMEM["Greenwich",0,
                    ANGLEUNIT["degree",0.0174532925199433]],
                ID["EPSG",4269]],
            CONVERSION["NAD_1983_StatePlane_California_I_FIPS_0401_Feet",
                METHOD["Lambert Conic Conformal (2SP)",
                    ID["EPSG",9802]],
                PARAMETER["Latitude of false origin",39.3333333333333,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8821]],
                PARAMETER["Longitude of false origin",-122,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8822]],
                PARAMETER["Latitude of 1st standard parallel",40,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8823]],
                PARAMETER["Latitude of 2nd standard parallel",41.6666666666667,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8824]],
                PARAMETER["Easting at false origin",6561666.66666667,
                    LENGTHUNIT["US survey foot",0.304800609601219],
                    ID["EPSG",8826]],
                PARAMETER["Northing at false origin",1640416.66666667,
                    LENGTHUNIT["US survey foot",0.304800609601219],
                    ID["EPSG",8827]]],
            CS[Cartesian,2],
                AXIS["(E)",east,
                    ORDER[1],
                    LENGTHUNIT["US survey foot",0.304800609601219]],
                AXIS["(N)",north,
                    ORDER[2],
                    LENGTHUNIT["US survey foot",0.304800609601219]],
            USAGE[
                SCOPE["Not known."],
                AREA["United States (USA) - California - counties Del Norte; Humboldt; Lassen; Modoc; Plumas; Shasta; Siskiyou; Tehama; Trinity."],
                BBOX[39.59,-124.45,42.01,-119.99]],
            ID["ESRI",102641]]],
    TARGETCRS[
        GEOGCRS["WGS 84",
            DATUM["World Geodetic System 1984",
                ELLIPSOID["WGS 84",6378137,298.257223563,
                    LENGTHUNIT["metre",1]]],
            PRIMEM["Greenwich",0,
                ANGLEUNIT["degree",0.0174532925199433]],
            CS[ellipsoidal,2],
                AXIS["latitude",north,
                    ORDER[1],
                    ANGLEUNIT["degree",0.0174532925199433]],
                AXIS["longitude",east,
                    ORDER[2],
                    ANGLEUNIT["degree",0.0174532925199433]],
            ID["EPSG",4326]]],
    ABRIDGEDTRANSFORMATION["Inverse of WGS_1984_(ITRF00)_To_NAD_1983 (approx. inversion)",
        METHOD["Coordinate Frame rotation (geog2D domain)",
            ID["EPSG",9607]],
        PARAMETER["X-axis translation",-0.9956,
            ID["EPSG",8605]],
        PARAMETER["Y-axis translation",1.9013,
            ID["EPSG",8606]],
        PARAMETER["Z-axis translation",0.5215,
            ID["EPSG",8607]],
        PARAMETER["X-axis rotation",-0.025915,
            ID["EPSG",8608]],
        PARAMETER["Y-axis rotation",-0.009426,
            ID["EPSG",8609]],
        PARAMETER["Z-axis rotation",-0.011599,
            ID["EPSG",8610]],
        PARAMETER["Scale difference",0.99999999938,
            ID["EPSG",8611]],
        USAGE[
            SCOPE["Not known."],
            AREA["Puerto Rico - onshore and offshore. United States (USA) onshore and offshore - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming. US Virgin Islands - onshore and offshore."],
            BBOX[14.92,167.65,74.71,-63.88]],
        ID["INVERSE(ESRI)",108190]]]

Currently, if the transformation were requested towards the PROJ string of the target crs, only this transformation would have been taken into account:

$ projinfo -s EPSG:3490 -t "+proj=lcc +lat_0=39.3333333333333 +lon_0=-122 +lat_1=40 +lat_2=41.6666666666667 +x_0=2000000 +y_0=500000.000000001 +ellps=GRS80 +towgs84=0.9956,-1.9013,-0.5215,-0.025915,-0.009426,-0.011599,0.00062 +units=us-ft +no_defs +type=crs" -o PROJ
Candidate operations found: 1
-------------------------------------
Operation No. 1:

unknown id, Inverse of SPCS83 California zone 1 (US Survey feet) + NAD83(NSRS2007) to WGS 84 (1) + Inverse of Transformation from unknown to WGS84 + unknown, unknown accuracy, Puerto Rico - onshore and offshore. United States (USA) onshore and offshore - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming. US Virgin Islands - onshore and offshore.

PROJ string:
+proj=pipeline
  +step +proj=unitconvert +xy_in=us-ft +xy_out=m
  +step +inv +proj=lcc +lat_0=39.3333333333333 +lon_0=-122
        +lat_1=41.6666666666667 +lat_2=40 +x_0=2000000.0001016
        +y_0=500000.0001016 +ellps=GRS80
  +step +proj=push +v_3
  +step +proj=cart +ellps=WGS84
  +step +inv +proj=helmert +x=0.9956 +y=-1.9013 +z=-0.5215 +rx=-0.025915
        +ry=-0.009426 +rz=-0.011599 +s=0.00062 +convention=position_vector
  +step +inv +proj=cart +ellps=GRS80
  +step +proj=pop +v_3
  +step +proj=lcc +lat_0=39.3333333333333 +lon_0=-122 +lat_1=40
        +lat_2=41.6666666666667 +x_0=2000000 +y_0=500000.000000001 +ellps=GRS80
  +step +proj=unitconvert +xy_in=m +xy_out=us-ft

Is there any reason why I shouldn't just pick the best accuracy?

For the other 3, you need horizontal shift grids (note the +proj=hgridshift parameter in each transformation). If you have them installed, you can select the one that seems best to you.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.