Proyectando objetos sp en R

35

Tengo una serie de shapefiles en diferentes CRS (principalmente WGS84 lat / lon) que me gustaría transformar en una proyección común (probablemente Albers Equal Area Conic, pero puedo pedir ayuda para elegir otra pregunta una vez que mi problema mejore) -definido).

Pasé unos meses haciendo cosas de estadísticas espaciales en R, pero fue hace 5 años. Por mi vida, no puedo recordar cómo transformar un spobjeto (por ejemplo SpatialPolygonsDataFrame) de una proyección a otra.

Código de ejemplo:

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

Ahora tengo una SpatialPolygonsDataFrameinformación de proyección adecuada, pero me gustaría transformarla en la proyección deseada. Recuerdo que hay una función con un nombre poco intuitivo para esto, pero no puedo recordar qué es.

Tenga en cuenta que no solo quiero cambiar el CRS sino cambiar las coordenadas para que coincidan ("reproyectar", "transformar", etc.).

Editar

Excluyendo AK / HI, que están molestamente ubicados en México para este archivo de forma:

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
fuente
Respuesta anterior sobre proyectar usando el paquete proj4 aquí . Sin embargo, no he probado esto con SpatialPolygonsDataFrame.
Simbamangu
En realidad, parece que proj4 no funciona con objetos espaciales, pero vea la respuesta a continuación.
Simbamangu
2
Siempre está la Vista de tareas espaciales: cran.r-project.org/web/views/Spatial.html y mis notas sobre Datos espaciales [conector descarado]: maths.lancs.ac.uk/~rowlings/Teaching/UseR2012
Spacedman

Respuestas:

44

Puede usar los spTransform()métodos en rgdal; con su ejemplo, puede transformar el objeto en NAD83 para 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)

no proyectado

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

proyectado

Para guardarlo en la nueva proyección:

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

EDITAR : O, según la sugerencia de @ Spacedman (que escribe un archivo .prj con la información de CRS):

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

Si no está seguro de qué CRS proyectar, consulte la siguiente publicación:

Y si uno quiere definir / asignar un CRS cuando los datos no tienen uno, consulte:

Simbamangu
fuente
10
tenga en cuenta que writePolyShape NO escribe el archivo .prj! Debe usar writeOGR desde rgdal (y usar readOGR para leer archivos de forma) si desea escribir y leer el archivo .prj para establecer el CRS de sus objetos espaciales en R!
Spacedman
Mucho mejor (editado en consecuencia) - gracias; ¡no me había dado cuenta de que crea el archivo .prj! Impresionante hoja de trucos en tu página, por cierto.
Simbamangu
1
Es extraño cómo la proyección en México afecta la apariencia de las inserciones de Alaska y Hawai :-).
whuber
@whuber - hmm, sí ... alguien ha editado mi publicación que no tenía los mapas reales que mostraban esas inserciones bastante inapropiadas ... nunca las planeé yo mismo para ver que estaban allí.
Simbamangu
@Simbamangu Lo siento, olvidé que este archivo .shp incluía de manera inapropiada las inserciones cuando intenté ser útil para agregar los gráficos.
Ari B. Friedman
8

Desde la introducción del paquete sf (eche un vistazo a las viñetas sf1 , sf2 , sf3 , sf4 y una guía de migración aquí ) puede usar st_transform()para volver a proyectar sus datos vectoriales:

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 sustituirá sp en el futuro y, debido a su simplicidad y velocidad, ofrece varias ventajas en comparación con sp.

andschar
fuente