That's a good question. Unfortunately, you may actually need to further define the question. NAD83(HARN) is one of the NAD83 realizations. There are programs to transform between it and other NAD83 realizations on the NOAA NGS site. That part is reasonably well defined. The less defined part is which realization of WGS84 are we talking about? Different WGS84 realizations tend to match specific ITRF realizations. There are Helmert transformations published to go between NAD83 realizations and ITRF realizations. Below is a chunk of code I've got in my helmert class. The links in the comments may be what you're after.
/*
* Initialize based on parameters we already know for certain transforms
*/
int helmert::init(char *from, char *to){
if(from == NULL || to == NULL) return 1;
/*
* The NAD83_86 transform values are from VDatum entries. Units are meters for
* tranlations and radians for rotations. No time dependencies.
* Units are meters for translations and milli arc seconds from rotations.
*
* NB: Comparison with HTDP indicates that HTDP does a transform relative to ITRF94. The ITRF94 to ITRF2008 values don't agree with the values from ITRF.
*/
if (
nameInit(from, to, "NAD83_86","WGS84_G1150", 0.9956, -1.9013, -0.52145, 1.256374e-7, 4.5701e-8, 5.6235e-8, 0.61504e-9,0) ||
nameInit(from, to, "NAD83_86","ITRF2000",0.9956, -1.9013, -0.52145, 1.256374e-7, 4.5701e-8, 5.6235e-8, 0.61504e-9,0) ||
nameInit(from, to, "NAD83_86","WGS84_G873",0.9910, -1.9072, -0.5129, 1.25033e-7, 4.6785e-8, 5.6529e-8, 0.0,0) ||
nameInit(from, to, "NAD83_86","ITRF96",0.9910, -1.9072, -0.5129, 1.25033e-7, 4.6785e-8, 5.6529e-8, 0.0,0) ||
nameInit(from, to, "NAD83_86","WGS84_G730",0.9830, -1.9092, -0.5049, 1.25033e-7, 4.6785e-8, 5.6529e-8, 8.0e-10,0) ||
nameInit(from, to, "NAD83_86","ITRF91",0.9830, -1.9092, -0.5049, 1.25033e-7, 4.6785e-8, 5.6529e-8, 8.0e-10,0) ||
nameInit(from, to, "NAD83_86","ITRF97",0.9956, -1.9013, -0.52145, 1.256374e-7, 4.5701e-8, 5.6235e-8, 0.61504e-9,0) ||
nameInit(from, to, "ITRF2008", "NAD83_MA11", 0.9080, -2.0161, -0.5653, 28.971, 10.420, 8.928, 1.10e-9, 0.0001, -0.0001, -0.0018, -0.020, 0.105, -0.347, 0.08e-9, 1997.0, 1) || // units in milli arc seconds for rotations
nameInit(from, to, "ITRF2008", "NAD83_2011", 0.99343, -1.90331, -0.52655, 25.91467, 9.42645, 11.59935, 1.71504e-9, 0.00079, -0.00060, -0.00134, 0.06667, -0.75744, -0.05133, -0.10201e-9, 1997.0, 1) ||
nameInit(from, to, "ITRF2008", "NAD83_PA11", 0.9080, -2.0161, -0.5653, 27.741, 13.469, 2.712, 1.10e-9, 0.0001, 0.0001, -0.0018, -0.384, 1.007, -2.186, 0.08e-9, 1997.0, 1) ||
nameInit(from, to, "ITRF2008", "ITRF2005", -2.0e-3, -0.9e-3, -4.7e-3, 0.0, 0.0, 0.0, 0.94e-9, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2000.0, 1) ||
nameInit(from, to, "ITRF2008", "ITRF2000", -1.9e-3, -1.7e-3, -10.5e-3, 0.00, 0.00, 0.00, 1.34e-9, 0.1e-3, 0.1e-3, -1.8e-3, 0.00, 0.00, 0.00, 0.08e-9, 2000.0,1) ||
nameInit(from, to, "ITRF2008", "ITRF97", 4.8e-3, 2.6e-3, -33.2e-3, 0.00, 0.00, 0.06, 2.92e-9, 0.1e-3, -0.5e-3, -3.2e-3, 0.00, 0.00, 0.02, 0.09e-9, 2000.0, 1) ||
nameInit(from, to, "ITRF2008", "ITRF96", 4.8e-3, 2.6e-3, -33.2e-3, 0.00, 0.00, 0.06, 2.92e-9, 0.1e-3, -0.5e-3, -3.2e-3, 0.00, 0.00, 0.02, 0.09e-9, 2000.0, 1) ||
nameInit(from, to, "ITRF2008", "ITRF94", 4.8e-3, 2.6e-3, -33.2e-3, 0.00, 0.00, 0.06, 2.92e-9, 0.1e-3, -0.5e-3, -3.2e-3, 0.00, 0.00, 0.02, 0.09e-9, 2000.0, 1) ||
nameInit(from, to, "ITRF2008", "NAD83_86", 0.99343 , -1.90331 , -0.52655 , -25.91467 , -9.42645 , -11.59935 , 1.71504e-9, 0.00079 , -0.00060 , -0.00134 , -0.06667 , 0.75744 , 0.05133 , -0.10201e-9, 1997.0, 1)
){
return 0;
}
//fprintf(stderr,"Didn't find a match for datums %s and %s\n",from,to);
return 1;
}
Kirk Waters, PhD, BJCP | NOAA Office for Coastal Management
Applied Sciences Program | 2234 South Hobson Ave
843-740-1227 | Charleston, SC 29405