Nie wiem, którego silnika projekcyjnego używa ArcGis, ale bardzo interesujące pytanie dotyczy również proj.4. Dlatego próbuję przetestować silnik projekcyjny proj.4 w środowisku GNU-R. Używam narożników NAD 83 - UTM 17 i EPSG 26917 i rekursywnie ponownie 10000 i 1000000 razy i obliczam różnicę do wartości początkowych.
Oto wyniki:
Wygląda na to, że błąd „ponownej projekcji” mieści się w zakresie centymetrów dla 10000 pętli.
"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
I dojdzie do błędu w zakresie metrów, jeśli uruchomisz pętlę 1000000 razy.
"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
Oto skrypt.
# 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)
Dalsze testy w środowisku statystyk powinny być łatwe. Skrypty i objaśnienia kodu dla środowiska linux są dostępne na stronie github.com/bigopensky .