Proiettando oggetti sp in R


35

Ho un certo numero di shapefile in diversi CRS (principalmente WGS84 lat / lon) che vorrei trasformare in una proiezione comune (probabilmente Albers Equal Area Conic, ma potrei chiedere aiuto per scegliere un'altra domanda una volta che il mio problema è migliorato -defined).

Ho trascorso alcuni mesi a fare cose sulle statistiche spaziali in R, ma è stato 5 anni fa. Per la mia vita, non riesco a ricordare come trasformare un spoggetto (ad esempio SpatialPolygonsDataFrame) da una proiezione all'altra.

Codice di esempio:

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

Ora ho un SpatialPolygonsDataFramecon le informazioni di proiezione appropriate, ma mi piacerebbe trasformarle nella proiezione desiderata. Ricordo che per questo esiste una funzione in qualche modo nominata in modo non intuitivo, ma non ricordo di cosa si tratti.

Nota che non voglio solo cambiare il CRS ma cambiare le coordinate in modo che corrispondano ("riproiettare", "trasformare", ecc.).

modificare

Escludendo AK / HI che sono fastidiosamente posizionati in Messico per questo 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

Risposta precedente sulla proiezione usando il pacchetto proj4 qui . Non ho provato questo con SpatialPolygonsDataFrame però.
Simbamangu,

In realtà sembra che proj4 non funzioni con gli oggetti spaziali, ma vedi la risposta sotto.
Simbamangu,

2
C'è sempre la vista attività spaziale: cran.r-project.org/web/views/Spatial.html e le mie note sui dati spaziali [spina spudorato]: maths.lancs.ac.uk/~rowlings/Teaching/UseR2012
Spacedman

Risposte:


44

Puoi usare i spTransform()metodi in rgdal - usando il tuo esempio, puoi trasformare l'oggetto in NAD83 per 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)

non proiettato

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

proiettata

Per salvarlo nella nuova proiezione:

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

EDIT : Oppure, come suggerito da @ Spacedman (che scrive un file .prj con le informazioni di CRS):

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

Se non si è certi da quale CRS proiettare, fare riferimento al seguente post:

E se si desidera definire / assegnare un CRS quando i dati non ne hanno uno, fare riferimento a:


10
si noti che writePolyShape NON scrive il file .prj! Dovresti usare writeOGR da rgdal (e usare readOGR per leggere gli shapefile) se vuoi scrivere e leggere il file .prj per impostare il CRS dei tuoi oggetti spaziali in R!
Spacedman

Molto meglio (modificato di conseguenza) - grazie; non avevo capito che crea il file .prj! A proposito, cheatsheet fantastico sulla tua pagina.
Simbamangu,

1
È strano come la proiezione in Messico influisca sull'aspetto delle inserzioni in Alaska e Hawaii :-).
whuber

@whuber - hmm, sì ... qualcuno ha modificato il mio post che non conteneva le mappe reali che mostravano quegli inserti piuttosto inappropriati ... non li ho mai tracciati per vedere che erano lì.
Simbamangu,

@Simbamangu Siamo spiacenti, ho dimenticato che questo file .shp includeva in modo inappropriato gli inserti quando ho cercato di essere utile per aggiungere i grafici!
Ari B. Friedman,

8

Dall'introduzione del pacchetto sf (dai un'occhiata alle vignette sf1 , sf2 , sf3 , sf4 e una guida alla migrazione qui ) puoi usare st_transform()per riproiettare nuovamente i tuoi dati vettoriali:

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 sostituirà sp in futuro e per la sua semplicità e velocità ha molti vantaggi rispetto a sp.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.