Apertura dello shapefile in R? [chiuso]


64

Ho bisogno di aprire uno shapefile da ArcMap in R per usarlo per ulteriori analisi geostatistiche. L'ho convertito in file di testo ASCII, ma in R è riconosciuto come data.frame. La funzione di coordinate non funziona non appena x e y vengono riconosciuti come non numerici.

Potresti aiutare ad affrontarlo?


1
Che tipo di shapefile? Sto assumendo punti dal momento che ha una colonna X e Y?
Simbamangu,

Risposte:


54

Usa direttamente lo shapefile. Puoi farlo facilmente con i pacchetti rgdalo sfe leggere la forma in un oggetto. Per entrambi i pacchetti è necessario fornire dsn- l'origine dati, che nel caso di uno shapefile è la directory , e layer- che è il nome dello shapefile, meno l'estensione:

# Read SHAPEFILE.shp from the current working directory (".")

require(rgdal)
shape <- readOGR(dsn = ".", layer = "SHAPEFILE")

require(sf)
shape <- read_sf(dsn = ".", layer = "SHAPEFILE")

(Per rgdal, in OSX o Linux non è possibile utilizzare la scorciatoia '~' per la directory home come directory dell'origine dati ( dsn), altrimenti verrà visualizzato un messaggio inutile "Impossibile aprire l'origine dati". Il sfpacchetto non hanno questa limitazione, tra gli altri vantaggi.)

Questo ti darà un oggetto che è un DataFrame spaziale * (punti, linee o poligoni) - i campi della tabella degli attributi sono quindi accessibili a te allo stesso modo di un normale frame di dati, cioè shape$IDper la colonna ID.

Se si desidera utilizzare il file ASCII importato, è sufficiente convertire i campi di testo (carattere) xey in numeri, ad esempio:

shape$x <- as.numeric(as.character(shape$x))
shape$y <- as.numeric(as.character(shape$y))
coordinates(shape) <- ~x + y

Modifica 18/01/2015 : nota che rgdal è un po 'meglio dei maptools (che inizialmente ho suggerito qui), principalmente perché legge e scrive automaticamente le informazioni di proiezione.

Appunti:

  • le as.numeric(as.character())funzioni nidificate : se il testo ASCII è stato letto come un fattore (probabilmente), ciò assicura che si ottengano i valori numerici anziché i livelli dei fattori.
  • rgdale sfavere modi confusi di accedere a diversi tipi di file e database (ad es. per un file GPX, dsn è il nome del file e sovrappone i singoli componenti come waypoint, trackpoint, ecc.) ed è necessaria un'attenta lettura degli esempi online.

R dovrebbe analizzare i campi numerici, quindi immagino che ci sia un tipo di carattere speciale in xey. Inoltre, al momento dell'importazione, se non diversamente specificato, i campi di caratteri saranno obbligati in un fattore. Pertanto, una semplice decelerazione "as.numeric" non funzionerà. Vorrei anche usare "readORG" in "rgdal" piuttosto che maptools.
Jeffrey Evans,

@Jeffrey, readOGR è sicuramente il modo migliore per andare - vedi alcune discussioni sulle domande R successive qui su gis.SE. Buon punto sulla coercizione dei fattori; verrà aggiornato con nidificato as.characterper aggirare il problema.
Simbamangu,

Potresti usare ~, ma dovresti chiamare path.expand nella directory, ad esempio readOGR (dsn = path.expand ("~ / Downloads / cb_2016_us_zcta510_500k /"), layer = "cb_2016_us_zcta510_500k")
hd1

3
In qualche modo avevo ancora bisogno di un chiarimento per questa risposta effettivamente corretta: dsn="directory where the shapefile, projection file, etc are located" layer="name of the file without .shp extention"
Ufo

Voglio notare che l' dsnargomento non dovrebbe contenere barre finali --- ad esempio dsn = "C:/Users/Downloads/"dovrebbe esserlo dsn = "C:/Users/Downloads". Spero che questo risolva la frustrazione di qualcuno ...
Kim

21

Sono d'accordo con il Simbamangu e gissolved in termini di mantenimento dello shapefile ma voglio indirizzare la tua attenzione specificamente sulla libreria rgdal. Segui il link suggerito da Gissolved per il NCEAS e segui le indicazioni per rgdal. Può essere difficile installarlo su alcune macchine, ma può migliorare sostanzialmente i risultati quando si tratta di proiezioni.

La libreria maptools è eccellente e ti consente di definire la proiezione per lo shapefile in cui stai leggendo, ma per farlo devi sapere come specificare quella proiezione nel formato proj4. un esempio potrebbe assomigliare a:

project2<-"+proj=eqdc +lat_0=0 +lon_0=0 +lat_1=33 +lat_2=45 +x_0=0 +y_0=0 +ellps=GRS80    
   +datum=NAD83 +units=m +no_defs" #USA Contiguous Equidistant Conic Projection
data.shape<-readShapePoly("./MyMap.shp",IDvar="FIPS",proj4string=CRS(project2))
plot(data.shape)

Se vuoi seguire questa strada, allora raccomando http://spatialreference.org come il posto dove andare per capire come appare la tua proiezione nel formato proj4. Se ti sembra una seccatura, rgdal renderà più semplice la lettura del file .prj del file di forma ESRI (il file che contiene la definizione di proiezione di ESRI per il file di forma. Per utilizzare rgdal sullo stesso file, dovrai semplicemente scrivere:

library(rgdal)
data.shape<-readOGR(dsn="C:/Directory_Containing_Shapefile",layer="MyMap")
plot(data.shape)

Probabilmente puoi pattinare senza farlo se stai solo lavorando con un singolo file di forma, ma non appena inizi a guardare più fonti di dati o a sovrapporre a Google Maps, mantenere le tue proiezioni in buona forma diventa essenziale.

Per alcune utili procedure dettagliate sui dati spaziali in R, tra cui un sacco di cose sull'importazione e l'utilizzo di schemi di punti, ho alcuni vecchi materiali del corso online su https://csde.washington.edu/workshop/point-patterns-and-raster -superfici / (altri workshop possono essere trovati qui ) che potrebbero aiutarti a vedere come questi metodi si confrontano nella pratica.


+1 per informazioni di riferimento spaziale ... in particolare per enfatizzare il mantenimento delle proiezioni!
Simbamangu,

@csfowler, ho provato a utilizzare readOGR ma non importa il file .prj. Qualche idea sul perché? Sono anche in UW, nel dipartimento di biologia.
Herman Toothrot,

@ user4050, difficile da sapere senza vedere il tuo codice. Presumo che ci sia un file .prj nella stessa directory? e che hai usato il valore encoding = "ESRI Shapefile" per assicurarti che rgdal sappia che è un shapefile?
csfowler,


17

Puoi usare la sflibreria per aprire Shapefile direttamente dentro R. È più veloce della rgdallibreria, controlla qui: Funzionalità semplici per R - Benchmark . Per ulteriori informazioni sul sfpacchetto, consultare la homepage del progetto r-spazial .

# Load library
library('sf')

# Load shapefile
shapename <- read_sf('~/path/to/file.shp')

11

Una soluzione semplice nel 2017 è la shapefile()funzione in rasterlibreria.

#Load library
library(raster)

#Load shapefile
shp <- shapefile("myshapefile")

AGGIORNAMENTO: Questa è ancora una buona opzione nel 2019.


Può essere usato per importare da una fonte online? I
I Del Toro,

@IDelToro Non direttamente. Dovrai prima scaricarlo sul tuo disco rigido e poi caricarlo da lì.
Christopher,

6

Un'altra alternativa è utilizzare la libreria fastshp che offre:

Routine per la gestione di shapefile ESRI di grandi dimensioni (.shp). Ciò include la lettura, l'assottigliamento dei punti e l'adattamento dei punti al contenimento delle forme. L'obiettivo principale di questo pacchetto è fornire la velocità per supportare file di forma di grandi dimensioni (milioni di punti). È più veloce di alcuni ordini di maginute rispetto ad altri pacchetti shapefile.

Ecco la mia domanda su SE su come usarlo con ggplot2:

Come posso tracciare lo shapefile caricato tramite fastshp in ggplot2?


1
Trovo un po 'fastidioso che la funzione read.shp non comporti un oggetto sp. Dato che la comunità spaziale R sta convergendo su questo come standard di fatto per la gestione di oggetti spaziali, trovo che questo sia un po 'sciatto. Data la RAM sufficiente e un sistema operativo a 64 bit, la lettura di dati di grandi dimensioni non è un grosso problema. Con 8 GB di RAM ho letto 30 milioni di punti e 2,5 milioni di poligoni usando rgdal senza problemi. Ecco alcune indicazioni sull'uso di oggetti sp con ggplot2: github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
Jeffrey Evans,
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.