У меня есть два полигона. Одно содержит поля (X, Y, Z), а другое содержит типы почвы (A, B, C, D). Я хочу знать, какая область каждого поля содержит, какой тип почвы. Я попробовал следующее:
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
и добился хороших результатов, сказав мне, какое поле содержит какой тип почвы. Тем не менее, как я могу получить площадь вместо этого?
Ответы:
Этот метод использует
intersect()
функцию изraster
пакета. Данные в качестве примера, которые я использовал, не идеальны (во-первых, они находятся в непроецированных координатах), но я думаю, что это помогает понять идею.Результаты:
источник
raster::intersect
более ,rgeos::gIntersection
потому что первые присоединяется атрибутивные данные из двухSpatialPolgonsDataFrame
объектов, в то время как последние , кажется, падение данных атрибутов.gIntersection
; однако идентификаторы входных функций не предоставляются напрямую, они объединяются и сохраняются в идентификаторе функции выходных данных. Это означает дополнительные шаги синтаксического анализа идентификаторов, а затем присоединение к атрибутам. Я хотел быraster::intersect
включить эти входные идентификаторы в качестве дополнительных атрибутов в выводе.Вот альтернативный подход с использованием нового
sf
пакета, который должен заменитьsp
. Все намного чище и дружелюбнееисточник