2014-10-28 26 views
13

Sto provando a creare un set di poligoni dalle posizioni dei vertici, salvati in formato X, Y. Per favore nuda con me come sono nuovo a R e ho passato un bel po 'di tempo a cercare altri post oggi.SpatialPolygons - Creazione di un set di poligoni in R dalle coordinate

Ecco un esempio dei miei dati: ogni riga rappresenta i vertici per un poligono. i poligoni sono piazze

square <- rbind(c(255842.4, 4111578, 255862.4, 4111578, 255862.4, 4111558, 
        255842.4, 4111558, 255842.4, 4111578, 255842.4, 4111578), 
       c(257397.0, 4111309, 257417.0, 4111309, 257417.0, 4111289, 
        257397.0, 4111289, 257397.0, 4111309, 257397.0, 4111309)) 

ID <- c("SJER1", "SJER2")' 

Sto usando SpatialPolygons, quindi i miei dati devono essere in un elenco. così ho creato un ciclo per tentare di ottenere i miei dati in un formato elenco da una matrice.

Ho creato un loop seguendo il codice che ho trovato in alcune altre domande su questo sito. Ho fatto fuori ogni passo per cercare di capire perché sto ottenendo solo un poligono come output anche se ho 2 set di punti.

for (i in 1:2) { 
    pts <- rbind(c(square[i,1], square[i,2]), c(square[i,3], square[i,4]), 
       c(square[i,5],square[i,6]), c(square[i,7],square[i,8]), 
       c(square[i,9],square[i,10])) 
    sp1 <- list(Polygon(pts)) 
    sp2 <- list(Polygons(sp1,i)) 
    sp = SpatialPolygons(sp2) 
} 
plot(sp) 

Potete per favore aiutarmi a capire come aggiusto il codice per scrivere due poligoni invece di uno solo? E anche, come assegno l'ID a ogni poligono dato che sto usando una matrice (quadrato) come set di dati di partenza e se assegno un id di carattere, trasforma tutti i miei dati in un personaggio.

Il mio obiettivo finale è di due poligoni nell'oggetto SpatialPolygons, la prima con l'ID SJER1 e la seconda con l'ID SJER2 memorizzato nell'oggetto SpatialPolygons.

Quindi scriverò su uno shapefile.

Grazie per qualsiasi consiglio e per la vostra pazienza. leah

risposta

23

Ci sono alcune informazioni a ?'SpatialPolygons-class', ma è più o meno vogliono effettuare le seguenti operazioni:

polys <- SpatialPolygons(list(
    Polygons(list(Polygon(matrix(square[1, ], ncol=2, byrow=TRUE))), ID[1]), 
    Polygons(list(Polygon(matrix(square[2, ], ncol=2, byrow=TRUE))), ID[2]) 
)) 

plot(polys) 

enter image description here

La sostanza di base è che è necessario creare Polygon oggetti (ad esempio, , da matrici a 2 colonne con coordinate x nella prima colonna e coordinate nella seconda). Questi sono combinati in elenchi per creare oggetti Polygons (ognuno dei quali dovrebbe avere un ID univoco). Questi oggetti Polygons vengono combinati in un elenco per creare un oggetto SpatialPolygons. È possibile aggiungere un CRS se lo si desidera, con l'argomento proj4string su SpatialPolygons (vedere ?SpatialPolygons).

Per scriverlo in un file di forma ESRI, è necessario convertirlo in un oggetto SpatialPolygonsDataFrame combinando l'oggetto polys che abbiamo creato e alcuni dati. Aggiungeremo gli ID come dati per mancanza di qualcosa di più interessante.

polys.df <- SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID)) 

e poi scrivere fuori ...

writeOGR(polys.df, '.', 'fancysquares', 'ESRI Shapefile') 

Il secondo argomento ('.') dice di scrivere fuori per la directory di lavoro corrente.


EDIT

per creare rapidamente una SpatialPolygonsDataFrame quando si dispone di molti file che descrivono poligoni, è possibile utilizzare il seguente:

# Example data 
square <- t(replicate(50, { 
    o <- runif(2) 
    c(o, o + c(0, 0.1), o + 0.1, o + c(0.1, 0), o) 
})) 
ID <- paste0('sq', seq_len(nrow(square))) 

# Create SP 
polys <- SpatialPolygons(mapply(function(poly, id) { 
    xy <- matrix(poly, ncol=2, byrow=TRUE) 
    Polygons(list(Polygon(xy)), ID=id) 
}, split(square, row(square)), ID)) 

# Create SPDF 
polys.df <- SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID)) 

plot(polys.df, col=rainbow(50, alpha=0.5)) 

enter image description here

+0

vi ringrazio molto. penso di capirlo meglio comunque, puoi dirmi perché questo: 'for (i in 1: 2) { polys <- SpatialPolygons (list ( Polygons (list (Polygon (matrix (square [i, ], ncol = 2, byrow = TRUE))), ID [i]) )) } ' O ' un <- vettore ('list', la lunghezza (2)) per (i in 1 : 2) { a [[i]] <- elenco ( poligoni (elenco (poligono (matrice (quadrato [i,], ncol = 2, byrow = TRUE))), ID [i]) ) } Paziali spaziali (a) ' non funzionano? ho bisogno di eseguire questo su molti punti quindi ho bisogno di una sorta di ciclo. il tuo tempo e la tua spiegazione sono molto apprezzati. Ho anche revisionato la documentazione. –

+0

@LWasser Il primo sovrascrive 'polys' ogni volta attraverso il ciclo, quindi si finisce con un oggetto' SpatialPolygons' che contiene solo l'ultimo poly. Il secondo funzionerà se si rimuove la 'lista() più esterna, vale a dire solo' a [[i]] <- Poligoni (lista (Poligono (matrice (quadrato [i,], ncol = 2, byrow = TRUE))), ID [i]) '. Questo perché 'a' è già una lista. – jbaums

+0

@LWasser, vedere la mia modifica per un approccio che può essere utilizzato per automatizzare il processo se si dispone di più righe. (Inoltre, mi scuso, in qualche modo ho dimenticato di includere il codice che crea il SPDF.) – jbaums