L'attribution d'un CRS différent ne change pas la projection des données spatiales sous-jacentes - le CRS est une partie interne de l'objet spatial qui indique à R comment interpréter les coordonnées spatiales.
library(rgdal)
# Load Tanzania in UTM 36
tz.36 <- readOGR(dsn = ".", layer = "tz_36")
summary(tz.36) # Show the bounding coordinates:
Coordinates:
min max
x 94000.58 1315978
y 8699697.87 9889701
Is projected: TRUE
proj4string :
[+proj=utm +zone=36 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]
....
Transformez maintenant la forme en une zone UTM voisine:
tz.37 <- spTransform(tz.36, CRS("+init=epsg:32737"))
summary(tz.37)
Coordinates:
min max
x -576091.7 657248.1
y 8700995.0 9888925.5
Is projected: TRUE
proj4string :
[+init=epsg:32737 +proj=utm +zone=37 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]
Les coordonnées de la géométrie ont changé - correctement - pour s'adapter à la zone UTM voisine. Et si nous réaffections simplement le CRS sans transformation?
# Make a copy of the original object.
tz.37.b <- tz.36
# Assign the CRS
proj4string(tz.37.b) <- CRS("+init=epsg:32737")
Warning message:
In `proj4string<-`(`*tmp*`, value = <S4 object of class "CRS">) :
A new CRS was assigned to an object with an existing CRS:
+proj=utm +zone=36 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0
without reprojecting.
For reprojection, use function spTransform in package rgdal
Nous avons été prévenus ... alors à quoi ressemblent les coordonnées?
summary(tz.37.b)
Coordinates:
min max
x 94000.58 1315978
y 8699697.87 9889701
Is projected: TRUE
proj4string :
[+init=epsg:32737 +proj=utm +zone=37 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]
Les nombres (coordonnées) sont ceux d'origine de la zone UTM 36, mais la forme sera maintenant mappée sur la mauvaise zone UTM et apparaîtra au mauvais endroit.
Éditer
En utilisant la méthode exacte suggérée par l'OP:
# Make a new copy of the original UTM 36 shape:
tz.37.c <- tz.36
# Now assign the proj4string using OP's suggestion:
proj4string(tz.37.c) <- proj4string(tz.37)
summary(tz.37.c)
Coordinates:
min max
x 94000.58 1315978
y 8699697.87 9889701
Is projected: TRUE
proj4string :
[+init=epsg:32737 +proj=utm +zone=37 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]
L'étendue est identique à l'objet utm36 d'origine, mais proj4string est désormais utm37. (Fait intéressant, il n'y a pas eu d'avertissement cette fois.) Remarque: le résultat est exactement le même que celui attribué au CRS avec le code EPSG. Tester:
identical(tz.37.b, tz.37.c)
TRUE
Vérifions à quoi ressemblent les formes réelles, en utilisant une couche UTM37 réelle des régions de la Tanzanie.
# Load the region shape
tz.regions.37 <- readOGR(".", "tz_regions_37_simp")
# Plot it
plot(tz.regions.37, lwd = 1, border = 'red')
# Now add the CRS-assigned (not transformed!) object:
plot(tz.37.c, add = T, border = 'blue', lwd = 2)
Ils ne s'alignent pas, donc cette méthode ne fonctionne pas! Et l' objet transformé ?
plot(tz.37, add = T, border = 'darkgreen', lwd = 2)
L'objet transformé apparaît au bon endroit (fond vert foncé).
NB Si vous transformez entre des zones UTM mais la même donnée (WGS84 ici) les différences seront dramatiques, comme dans mon exemple - mais si vous transformez entre différentes références, les différences peuvent être beaucoup plus subtiles. Par exemple, ci-dessous se trouvent deux formes de Zanzibar, toutes deux UTM 37, mais l'une est WGS84 et l'autre ARC1960:
Non: ces deux formes ne sont pas identiques, et c'est par conception. La raison en est que dans certains cas, vous souhaitez affecter un CRS à un objet qui n'a pas de CRS ou modifier un CRS sans changer les coordonnées, et dans d'autres cas, vous souhaitez convertir ou transformer les coordonnées d'un CRS en un autre CRS. Le premier (attribuer, remplacer) est obtenu par
et le second (convertir, transformer) par
Parce que vous n'êtes pas le premier à penser que la première commande fait réellement ce que fait la deuxième commande,
sp
donne l'avertissement suivant lorsque vous essayez le premier formulaire mais aa
déjà un CRS différent:(ce qui n'est plus tout à fait correct, car
spTransform
c'est une fonctionsp
qui appelle des méthodes dansrgdal
).la source