Tuesday 27 October 2015

coordinate system - Projecting sp objects in R


I have a number of shapefiles in different CRSs (mostly WGS84 lat/lon) that I'd like to transform into a common projection (likely Albers Equal Area Conic, but I may ask for help on choosing in another question once my problem gets better-defined).


I spent a few months doing spatial stats stuff in R, but it was 5 years ago. For the life of me, I cannot remember how to transform an sp object (e.g. SpatialPolygonsDataFrame) from one projection to another.


Example 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

Now I have a SpatialPolygonsDataFrame with appropriate projection information, but I'd like to transform it to the desired projection. I recall there being a somewhat unintuitively-named function for this, but I can't remember what it is.


Note that I do not want just to change the CRS but to change the coordinates to match ("reproject", "transform", etc.).


Edit


Excluding AK/HI which are annoyingly placed in Mexico for this shapefile:


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

Answer



You can use the spTransform() methods in rgdal - using your example, you can transform the object to NAD83 for 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)

unprojected


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

projected


To save it in the new projection:


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


EDIT: Or, as per @Spacedman's suggestion (which writes a .prj file with the CRS info):


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



If one is not certain which CRS to project from, refer to the following post:



And if one wants to define/assign a CRS when data doesn't have one, refer to:



No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...