Mam dwa wielokąty. Jedno zawiera pola (X, Y, Z), a drugie zawiera typy gleby (A, B, C, D). Chcę wiedzieć, który obszar na każdym polu zawiera rodzaj gleby. Próbowałem następujące:
library(rgdal)
library(rgeos)
Field<-readOGR("./","Field")
Soil<-readOGR("./","Soil")
Results<-gIntersects(Soil,Field,byid=TRUE)
rownames(Results)<-Field@data$FieldName
colnames(Results)<-Soil@data$SoilType
> Results
A B C D
Z TRUE FALSE FALSE FALSE
Y FALSE TRUE TRUE FALSE
X TRUE TRUE TRUE TRUE
i osiągnąłem dobre wyniki, mówiąc mi, które pole zawiera rodzaj gleby. Jak jednak zamiast tego uzyskać obszar?
Odpowiedzi:
Ta metoda korzysta z
intersect()
funkcji zraster
pakietu. Przykładowe dane, których użyłem, nie są idealne (z jednej strony mają nie rzutowane współrzędne), ale myślę, że to przenosi pomysł.Wyniki:
źródło
raster::intersect
ponadrgeos::gIntersection
ponieważ były dołącza dane atrybut z dwóchSpatialPolgonsDataFrame
obiektów, podczas gdy ten ostatni wydaje się spadać dane atrybutów.gIntersection
; jednak identyfikatory funkcji wejściowych nie są podawane bezpośrednio, są konkatenowane i przechowywane w identyfikatorze funkcji danych wyjściowych. Oznacza to dodatkowe etapy parsowania identyfikatorów, a następnie dołączania atrybutów. Chciałbymraster::intersect
uwzględnić te identyfikatory wejściowe jako dodatkowe atrybuty w danych wyjściowych.Oto alternatywne podejście z wykorzystaniem nowego
sf
pakietu, który ma zastąpićsp
. Wszystko jest znacznie czystsze i przyjazne dla rur:źródło