Projection d'objets sp dans R

35

J'ai un certain nombre de fichiers de formes dans différents CRS (principalement WGS84 lat / lon) que je voudrais transformer en une projection commune (probablement conique d'Albers Equal Area Conic, mais je pourrais demander de l'aide pour choisir une autre question une fois mon problème résolu -défini).

J'ai passé quelques mois à faire de la statistique spatiale en R, mais c'était il y a 5 ans. Pour ma vie, je ne me souviens pas comment transformer un spobjet (par exemple SpatialPolygonsDataFrame) d'une projection à une autre.

Exemple de code:

P4S.latlon <- CRS("+proj=longlat +datum=WGS84")
hrr.shp <- readShapePoly("HRR_Bdry"), verbose=TRUE, proj4string=P4S.latlon) 
# Shapefile available at 
#   http://www.dartmouthatlas.org/downloads/geography/hrr_bdry.zip 
#   but you must rename all the filenames to have the same 
#   capitalization for it to work in R

J'ai maintenant une SpatialPolygonsDataFrameinformation de projection appropriée, mais j'aimerais la transformer en projection souhaitée. Je me souviens qu'il existait une fonction quelque peu involontairement nommée pour cela, mais je ne me souviens plus de quoi il s'agit.

Notez que je ne veux pas simplement changer le CRS mais changer les coordonnées pour les faire correspondre ("reproject", "transformer", etc.).

modifier

En excluant AK / HI qui sont déplacés au Mexique pour ce fichier de formes:

library(taRifx.geo)
hrr.shp <- 
  subset(hrr.shp, !(grepl( "AK-" , hrr.shp@data$HRRCITY ) |
                                     grepl( "HI-" , hrr.shp@data$HRRCITY )) )
proj4string(hrr.shp) <- P4S.latlon
Ari B. Friedman
la source
Réponse précédente sur la projection en utilisant le paquet proj4 ici . Je n'ai cependant pas essayé cela avec SpatialPolygonsDataFrame.
Simbamangu
En fait, on dirait que proj4 ne fonctionne pas avec les objets spatiaux - mais voir la réponse ci-dessous.
Simbamangu
2
Il y a toujours la vue Spatial Task: cran.r-project.org/web/views/Spatial.html et mes notes sur Spatial Data [fiche éhontée]: maths.lancs.ac.uk/~rowlings/Teaching/UseR2012
Spacedman

Réponses:

44

Vous pouvez utiliser les spTransform()méthodes de rgdal - en utilisant votre exemple, vous pouvez transformer l'objet en NAD83 pour le Kansas (26978):

library(rgdal)
library(maptools)

P4S.latlon <- CRS("+proj=longlat +datum=WGS84")
hrr.shp <- readShapePoly("HRR_Bdry", verbose=TRUE, proj4string=P4S.latlon)
plot(hrr.shp)

sans projet

hrr.shp.2 <- spTransform(hrr.shp, CRS("+init=epsg:26978"))
plot(hrr.shp.2)

projeté

Pour le sauvegarder dans la nouvelle projection:

writePolyShape(hrr.shp.2, "HRR_Bdry_NAD83")

EDIT : Ou, selon la suggestion de @ Spacedman (qui écrit un fichier .prj avec les informations sur le CRS):

writeOGR(hrr.shp.2, dsn = getwd(), layer = "HRR_Bdry_NAD83", driver="ESRI Shapefile")

Si vous ne savez pas par quel CRS projeter, reportez-vous au post suivant:

Et si on veut définir / assigner un CRS quand les données n'en ont pas, se référer à:

Simbamangu
la source
10
notez que writePolyShape N'écrit PAS le fichier .prj! Vous devez utiliser writeOGR de rgdal (et readOGR pour lire les fichiers de formes) si vous souhaitez écrire et lire le fichier .prj afin de définir le SCR de vos objets spatiaux dans R!
Spacedman
Bien mieux (édité en conséquence) - merci; n'avait pas réalisé qu'il crée le fichier .prj! Au fait, une feuille de triche impressionnante sur votre page.
Simbamangu
1
Il est étrange que la projection au Mexique affecte l'apparence des encarts Alaska et Hawaii :-).
whuber
@whuber - hmm, oui ... quelqu'un a édité mon message qui ne contenait pas de cartes montrant ces encoches plutôt inappropriées ... ne les ai jamais complotés moi-même pour voir qu'ils étaient là.
Simbamangu
@Simbamangu Désolé, j'ai oublié que ce fichier .shp incluait plutôt mal les encarts lorsque j'ai tenté de m'aider à ajouter les graphiques!
Ari B. Friedman
8

Depuis l'introduction du paquet sf (regardez les vignettes sf1 , sf2 , sf3 , sf4 et un guide de migration ici ), vous pouvez utiliser st_transform()pour reprojeter vos données vectorielles:

require(sf)

hrr_sf = st_read('HRR_Bdry.shp', stringsAsFactors = FALSE,
    crs = 4326) # has +proj=longlat +datum=WGS84
plot(hrr_sf)

hrr_sf2 = st_transform(hrr_sf, "+init=epsg:26978") # 1st option sp::CRS() not working/ needed
hrr_sf2 = st_transform(hrr_sf, 26978) # 2nd option - EPSG code as an integer
plot(hrr_sf2)

# don't think about doing this:
hrr_sf3 = st_read('HRR_Bdry.shp', stringsAsFactors = FALSE,
    crs = 26978)

# Output layer
st_write(hrr_sf2, dsn = getwd(), layer = "HRR_Bdry_NAD83", driver = "ESRI Shapefile")

sf remplacera sp à l'avenir et a, en raison de sa simplicité et de sa rapidité, plusieurs avantages par rapport à sp.

andschar
la source