Does transforming to a new projection, then back, affect data accuracy?

I don't know which projection engine ArcGis uses, but a very interesting question also for proj.4. So I give it a try to test the proj.4 projection engine within the GNU-R environment. I use the NAD 83 - UTM 17 corners and EPSG 26917 and reproject it 10000 and 1000000 times recursivly and calculate the difference to the start values.

Here are the results:

It seems that the "reprojection" error in is within a centimeter range for 10000 loops.

"LON/LAT differences after  10000  loops"
           DLON          DLAT
1 -2.441464e-07 -1.341807e-07
2  2.441129e-07 -1.341807e-07
3  1.852679e-07 -1.691737e-08
4 -1.853157e-07 -1.691819e-08

"X/Y differences after  10000  loops"
            DX           DY
1 -0.025169783 -0.014338141
2  0.025166375 -0.014338208
3  0.002419045 -0.002016762
4 -0.002419690 -0.002016889

And grow to an error in a meter range if you run the loop 1000000 times.

"LON/LAT differences after  1000000  loops"
           DLON          DLAT
1 -2.441464e-05 -1.341845e-05
2  2.441128e-05 -1.341846e-05
3  1.852621e-05 -1.691837e-06
4 -1.853105e-05 -1.691828e-06

"X/Y differences after  1000000  loops"
          DX         DY
1 -2.5172288 -1.4339977
2  2.5168869 -1.4340064
3  0.2419201 -0.2017070
4 -0.2419859 -0.2017094

Here is the script.

# load the package
require('proj4')

# the LON/LAT frame of NAD83 UTM 17 
lon = c(-84.00, -78.00, -84.00, -78.00 ) 
lat = c( 24.00,  24.00,  83.00,  83.00)

# build the projection conform object
ll0 = matrix(c(lon,lat),nrow=4,ncol=2)
xy0 = project(ll0,"+init=epsg:26917",ellps.default='GRS80')

# make a copy
ll1 = ll0
xy1 = xy0

# number of iterations
num = 1000000

# reproject the stuff num times
for(i in 1:num) {
 # project forward  
 xy1 = project(ll1,"+init=epsg:26917", ellps.default='GRS80')
 # project backward
 ll1 = project(xy1,"+init=epsg:26917", inverse=T, ellps.default='GRS80')
}

# build difference table ll
dll = as.data.frame(ll1-ll0)
names(dll) = c('DLON','DLAT')
# print results LON/LAT
print(paste("LON/LAT differences after ", num," loops"))
print(dll)

# build difference table xy
dxy = as.data.frame(xy1-xy0)
names(dxy) = c('DX','DY')
# print results X/Y
print(paste("X/Y differences after ", num," loops"))
print(dxy)

Further tests within a statistcs environment should be easy. The scripts and code explanation for a linux environment are available at github.com/bigopensky.


Esri has its own projection engine.

Most projections and geographic/datum transformations methods are well-behaved when used in an appropriate area of interest. If you get too far outside of a UTM zone, transverse Mercator doesn't always 'inverse' (convert to latitude-longitude) exactly. Projections used for the whole world may have some issues at or around the poles or the +/-180 meridian or the 'anti-meridian' (the meridian that's opposite the center of the projected coordinate reference system).

I ran 4 points that fall outside South Carolina through the Esri projection engine. For a stress test of 1k or 10k or 1M points, I'll have to code something as my existing similar test just does a 'round-trip'--projected to geographic to projected. 32133 is NAD 1983 State Plane South Carolina (meters). 26917 is NAD 1983 UTM zone 17 North.

C:\Users\melita>inverse 32133
382000 20000
      -83.40806392522212        31.98974518135408
382000 383000
      -83.50098893136905        35.26180827475587
839100 20000
      -78.57184097446545        31.98934439195045
839100 383000
      -78.47814111839074        35.26139222680582

C:\Users\melita>forward 26917
  -83.40806392522212        31.98974518135408
       272490.5730967618        3541832.738731374
  -83.50098893136905        35.26180827475587
       272485.6257057797         3904944.98998655
  -78.57184097446545        31.98934439195045
       729409.4734382738        3541830.781689366
  -78.47814111839074        35.26139222680582
       729414.4926270114        3904946.919009762

C:\Users\melita>inverse 26917
 272490.5730967618        3541832.738731374
      -83.40806392522212        31.98974518135408
  272485.6257057797         3904944.98998655
      -83.50098893136905        35.26180827475587
  729409.4734382738        3541830.781689366
      -78.57184097446545        31.98934439195045
  729414.4926270114        3904946.919009762
      -78.47814111839074        35.26139222680582
^Z

C:\Users\melita>forward 32133
  -83.40806392522212        31.98974518135408
                382000.0                  20000.0
  -83.50098893136905        35.26180827475587
                382000.0                 383000.0
  -78.57184097446545        31.98934439195045
                839100.0        19999.99999999814
  -78.47814111839074        35.26139222680582
                839100.0        382999.9999999981

So you can see we had two points that came back at 10e-09.

The handling in ArcGIS is complicated by the fact that there's a spatial reference. The spatial reference includes the coordinate system plus some storage and analysis values. By default, coordinate systems that use meters are stored with a precision of a tenth of a millimeter, 0.0001.

Disclosure: I work for Esri.


I think this is a case where you need to test your proposed workflow against some test point features, which are easy to add XY coordinate fields to.

Compare the XY values of your initial points with those that you have projected/transformed (however many times), and you will have quantified the difference.