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.