2016-09-12 3 views
0

Der Versuch, es ohne Iterationen über mapply oder ähnliches zu erledigen - ich habe einen räumlichen Datenrahmen in R und möchte alle komplizierteren Formen unterteilen - dh Formen mit 10 oder mehr Koordinaten. Das Shapefile ist wesentlich (10k Formen) und die Methode, die für eine kleine Probe in Ordnung ist, ist sehr langsam für eine große. Das iterative Verfahren istR-Funktion zum Zählen von Koordinaten

Street$cc <-0 
i <- 1 
while(i <= nrow(Street)){ 
    Street$cc[i] <-length(coordinates(Street)[[i]][[1]])/2 
    i<-i+1 
} 

Wie kann ich den gleichen Effekt in jedem Array Weg? Ich habe ein Problem mit dem Zugriff auf wenige Stufen von oben nach unten (Shape-Datei/Linien/Linien/Koord)

I versucht:

Street$cc <- lapply(slot(Street, "lines"), 
    function(x) lapply(slot(x, "Lines"), 
    function(y) length(slot(y, "coords"))/2)) 

/Division durch 2, wie jeder Koordinate ist ein Paar von 2 Werten/ aber gibt immernoch eine Liste mit der Anzahl der Items pro Zeile zurück, nicht die ganze Zahl, die mir sagt, wie viele Items es gibt. Wie kann ich die Anzahl der Koordinaten pro Form in einem räumlichen Datenrahmen ermitteln? Entschuldigung, ich habe kein reproduzierbares Beispiel, aber Sie können jede räumliche Datei überprüfen - es geht eher um den Zugriff auf Eigenschaften auf niedriger Ebene als um ein sehr spezifisches Problem.

EDIT: beschloß ich, die Frage - Funktion

tail() 

Antwort

1

Hier verwendet, ist ein reproduzierbares Beispiel. Etwas anders als bei Ihnen, weil Sie keine Daten zur Verfügung gestellt haben, aber das Prinzip ist das gleiche. Das 'Prinzip' beim Bohren in komplexe S4-Strukturen besteht darin, darauf zu achten, ob es sich bei jeder Ebene um eine Liste oder einen Slot handelt, wobei [[]] für den Zugriff auf Listen und @ für Slots verwendet wird.

Lassen Sie uns zuerst einen räumlichen Trick holen. Ich werde die US-Staatsgrenzen benutzen;

library(maps) 
local.map = map(database = "state", fill = TRUE, plot = FALSE) 
IDs = sapply(strsplit(local.map$names, ":"), function(x) x[1]) 
states = map2SpatialPolygons(map = local.map, ID = IDs) 

Jetzt können wir die Polygone mit weniger als 200 Eckpunkten wie dieser Untergruppe:

# Note: next line assumes that only interested in one Polygon per top level polygon. 
# I.e. assumes that we have only single part polygons 
# If you need to extend this to work with multipart polygons, it will be 
# necessary to also loop over values of lower level Polygons 
lengths = sapply(1:length(states), function(i) 
      NROW([email protected][[i]]@Polygons[[1]]@coords)) 

simple.states = states[which(lengths < 200)] 
plot(simple.states) 

enter image description here

Verwandte Themen