2014-10-28 20 views
13

Ich versuche zu erstellen, eine Reihe von Polygonen aus Vertex Standorten im X, Y-Format gespeichert. Entschuldige bitte, denn ich bin neu bei R und habe viel Zeit damit verbracht, andere Beiträge zu durchsuchen.SpatialPolygons - Erstellen einer Reihe von Polygonen in R von Koordinaten

Hier ist ein Beispiel für meine Daten - jede Zeile repräsentiert die Scheitelpunkte für ein Polygon. die Polygone Quadrate

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")' 

ich SpatialPolygons verwende, damit meine Daten in einer Liste sein müssen. Also habe ich eine Schleife erstellt, um zu versuchen, meine Daten aus einer Matrix in ein Listenformat zu bringen.

Ich erstelle eine Schleife folgenden Code, den ich in einigen anderen Fragen auf dieser Website gefunden habe. Ich habe jeden Schritt ausprobiert, um zu verstehen, warum ich nur ein Polygon als Ausgabe bekomme, obwohl ich 2 Sätze Punkte habe.

Können Sie mir bitte helfen zu verstehen, wie ich den Code anpassen, um zwei Polygone anstatt nur eines auszugeben? Und außerdem, wie ich die ID jedem Polygon zuordne, da ich eine Matrix (Quadrat) als mein Start-Dataset verwende und wenn ich eine Character-ID zugebe, transformiere ich alle meine Daten in ein Zeichen.

Mein Ziel ist es zwei Polygone im SpatialPolygons Objekt, das erste mit der ID SJER1 und die zweite mit der ID SJER2 im SpatialPolygons Objekt gespeichert.

Dann werde ich dies in ein Shapefile schreiben.

Vielen Dank für jede Anleitung und für Ihre Geduld. leah

Antwort

23

Es gibt einige Informationen zu ?'SpatialPolygons-class', aber sie mehr oder weniger die folgenden Aktionen ausführen möchten:

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

Der grundlegende Kern ist, dass Sie Polygon Objekte erstellen müssen (zB , aus 2-Spalten-Matrizen mit x Koordinaten in der ersten Spalte und y Koordinaten in der zweiten Spalte). Diese werden in Listen kombiniert, um Polygons Objekte zu erstellen (von denen jedes eine eindeutige ID haben sollte). Diese Polygons Objekte werden in einer Liste kombiniert, um ein SpatialPolygons Objekt zu erstellen. Sie können einen CRS hinzufügen, wenn Sie möchten, mit dem proj4string Argument zu SpatialPolygons (siehe ?SpatialPolygons).

Um es in ein ESRI-Shapefile zu schreiben, müssen Sie es in ein SpatialPolygonsDataFrame-Objekt konvertieren, indem Sie das polys-Objekt, das wir erstellt haben, und einige Daten kombinieren. Wir fügen nur die IDs als Daten hinzu, wenn es an etwas Interessanterem fehlt.

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

und dann schreiben ...

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

Das zweite Argument ('.') sagt, es zu schreiben, mit dem aktuellen Arbeitsverzeichnis.


EDIT

So erstellen Sie schnell ein SpatialPolygonsDataFrame wenn Sie viele Zeilen beschreiben Polygone haben, können Sie die folgende verwenden:

# 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

vielen Dank. Ich denke, ich verstehe das besser aber, können Sie mir bitte sagen, warum entweder dies: 'für (i in 1: 2) { polys <- SpatialPolygons (Liste ( Polygone (Liste (Polygon (Matrix (Quadrat [i, ], NcoI = 2, byrow = TRUE))), ID [i]) )) } ' OR ' a <- Vektor ('Liste', die Länge (2)) für (i in 1 : 2) { a [[i]] <- Liste ( Polygone (Liste (Polygon (Matrix (Quadrat [i,], ncol = 2, Byrow = TRUE))), ID [i]) ) } SpatialPolygons (a) ' funktionieren nicht? Ich muss dies an vielen Punkten ausführen, so dass ich eine Art Schleife brauche. Ihre Zeit und Erklärung werden sehr geschätzt. Ich habe die Dokumentation auch überprüft. –

+0

@LWasser Das erste überschreibt jedes Mal "Polys" durch die Schleife, sodass Sie am Ende ein 'SpatialPolygons'-Objekt erhalten, das nur das letzte Poly enthält. Die zweite Option funktioniert, wenn Sie die äußerste 'list()' entfernen, dh einfach 'a [[i]] <- Polygone (Liste (Polygon (Matrix (Quadrat [i,], ncol = 2, Byrow = TRUE))), ID [i]) '. Dies liegt daran, dass 'a' bereits eine Liste ist. – jbaums

+0

@LWasser, siehe meine Bearbeitung für einen Ansatz, der verwendet werden kann, um den Prozess zu automatisieren, wenn Sie viele Zeilen haben. (Entschuldigung, ich habe irgendwie vergessen, den Code einzufügen, der das SPDF erzeugt.) – jbaums

Verwandte Themen