2014-10-28 37 views
13

Próbuję utworzyć zestaw wielokątów z wierzchołków, zapisanych w formacie X, Y. Proszę o mnie, ponieważ jestem nowy dla R i spędziłem sporo czasu szukając innych postów dzisiaj.SpatialPolygons - Tworzenie zestawu wielokątów w R od współrzędnych

Oto przykład moich danych - każdy wiersz reprezentuje wierzchołki dla jednego wielokąta. wielokąty są kwadratami

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

Używam SpatialPolygons, więc moje dane muszą być na liście. więc stworzyłem pętlę, aby spróbować pobrać moje dane do formatu listy z macierzy.

Tworzę pętlę za kodem, który znalazłem w kilku innych pytaniach na tej stronie. Zaczynałem każdy krok, aby spróbować zrozumieć, dlaczego otrzymuję tylko jeden wielokąt jako wynik, nawet jeśli mam 2 zestawy punktów.

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) 

Czy możesz mi pomóc zrozumieć, w jaki sposób dostosowuję kod, aby wypisać dwa wielokąty zamiast jednego? A także, w jaki sposób przypiszę identyfikator do każdego z wielokątów, biorąc pod uwagę, że używam matrycy (kwadratu) jako mojego początkowego zestawu danych i jeśli przypiszę identyfikator postaci, przekształca ona wszystkie moje dane w znak.

Moim ostatecznym celem jest dwa wielokąty w obiekcie SpatialPolygons, pierwsza z identyfikatorem SJER1 a drugi z identyfikatorem SJER2 przechowywane w obiekcie SpatialPolygons.

Potem zapiszę to do shapefile.

Dziękujemy za wskazówki i cierpliwość. Leah

Odpowiedz

23

Istnieje kilka informacji na ?'SpatialPolygons-class', ale bardziej lub mniej chcemy wykonać następujące czynności:

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

Podstawowym Istotą jest to, że trzeba stworzyć Polygon obiektów (np , z 2-kolumnowych macierzy z x współrzędnych w pierwszej kolumnie i y współrzędnych w drugiej). Są one łączone na listach w celu utworzenia obiektów (każdy z nich powinien mieć unikalny identyfikator). Obiekty te są łączone na liście w celu utworzenia obiektu SpatialPolygons. Możesz dodać CRS, jeśli chcesz, z argumentem proj4string do SpatialPolygons (patrz ?SpatialPolygons).

Aby napisać to na Shapefile ESRI, musisz przekonwertować go na obiekt SpatialPolygonsDataFrame, łącząc utworzony obiekt i niektóre dane z obiektu polys. Po prostu dodamy identyfikatory jako dane z braku czegoś ciekawszego.

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

a następnie zapisać go na zewnątrz ...

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

Drugi argument ('.') mówi napisać ją do bieżącego katalogu roboczego.


EDIT

Aby szybko utworzyć SpatialPolygonsDataFrame gdy masz wiele wierszy opisujących wielokątów, można użyć następujących:

# 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

bardzo dziękuję. Myślę, że rozumiem to lepiej, czy możesz mi powiedzieć dlaczego tak: 'for (i in 1: 2) { polys <- SpatialPolygons (lista ( Wielokąty (lista (wielokąt (macierz (kwadrat [i, ] Ncol = 2, byrow = PRAWDA))), identyfikator [i]) )) } ' lub 'a <- wektor ('lista', długość (2)) do (I, 1 : 2) { a [[i]] <- lista ( Wieloboki (lista (wielokąt (macierz (kwadrat [i,], ncol = 2, byrow = PRAWDA))), ID [i]) ) } SpatialPolygons (a) ' nie działają? Muszę uruchomić to w wielu punktach, więc potrzebuję jakiejś pętli. Twój czas i wyjaśnienie są doceniane. Sprawdziłem również dokumentację. –

+0

@LWasser Pierwszy zastępuje 'polys' za każdym razem przez pętlę, więc kończysz z obiektem' SpatialPolygons', który zawiera tylko ostatni poli. Drugi zadziała, jeśli usuniesz najbardziej zewnętrzną 'list()', tj. Po prostu wykonaj 'a [[i]] <- Wielokąty (lista (wielokąt (macierz (kwadrat [i,], ncol = 2, byrow = PRAWDA))), ID [i]) '. Dzieje się tak, ponieważ 'a' jest już listą. – jbaums

+0

@LWasser, zobacz moją edycję dla podejścia, które może być użyte do zautomatyzowania procesu, jeśli masz wiele wierszy. (Również, przepraszam, jakoś zapomniałem dołączyć kod, który tworzy SPDF.) – jbaums