Alternatives de spTransform?

8

Disons que nous avons un fichier de formes avec une certaine projection.

s<-readOGR(dsn=".",layer="Spain")

Nous avons également les aéroports d'Espagne comme points dans une autre projection.

a<-readOGR(dsn=".",layer="airports")

Si nous visons à placer les points sur le fichier de formes de l'Espagne, nous devons organiser les coordonnées de sorte qu'elles soient les mêmes. Habituellement, cela se fait comme ceci:

 a<-spTransform(a,CRS(proj4string(s))

Mais est-ce la même chose avec ça?

proj4string(a)<-proj4string(s)

Si oui, alors pourquoi n'est-ce pas la manière standard de le faire car elle est plus simple et doit recourir à la spTransform?

gsa
la source

Réponses:

6

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)

entrez la description de l'image ici

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)

entrez la description de l'image ici

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:

entrez la description de l'image ici

Simbamangu
la source
Essayez au lieu de proj4string (tz.37.b) <- CRS ("+ init = epsg: 32737") de faire comme je l'ai fait dans le post pro4string (tz.37.b) <- proj4string (un shapefile avec le proj u sont après) et voir si cela fonctionne parce que je l'ai fait comme je l'ai mentionné dans la description et il est apparu dans la bonne position.
gsa
Donc, si un shp n'a pas de CRS, quelle est la première étape avant d'appliquer le spTransform? Donnez-lui les crs que nous voulons, puis appliquez le spTransform et tout va bien?
gsa
Vous devez certainement trouver le bon CRS et l'appliquer en premier, sinon spTransform n'aura pas de base pour re-projeter l'objet!
Simbamangu
4

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

proj4string(a)<-proj4string(s)

et le second (convertir, transformer) par

a<-spTransform(a,CRS(proj4string(s))

Parce que vous n'êtes pas le premier à penser que la première commande fait réellement ce que fait la deuxième commande, spdonne l'avertissement suivant lorsque vous essayez le premier formulaire mais a adéjà un CRS différent:

Warning message:
In ReplProj4string(obj, CRS(value)) :
  A new CRS was assigned to an object with an existing CRS:
+init=epsg:28992 +proj=sterea [etc]
without reprojecting.
For reprojection, use function spTransform in package rgdal

(ce qui n'est plus tout à fait correct, car spTransformc'est une fonction spqui appelle des méthodes dans rgdal).

Edzer Pebesma
la source