Получение значения слота S4 объектов?
Итак, у меня есть пространственный объект polygons в R; но я не уверен, почему я не могу извлечь из него слот" area".
Вот мой сеанс R:
> spatialpolygons
An object of class "SpatialPolygons"
Slot "polygons":
[[1]]
An object of class "Polygons"
Slot "Polygons":
[[1]]
An object of class "Polygon"
Slot "labpt":
[1] 20.50516 57.72918
Slot "area":
[1] 36.85484
Slot "hole":
[1] FALSE
Slot "ringDir":
[1] 1
Slot "coords":
[,1] [,2]
[1,] 16.48438 59.73633
[2,] 22.59277 61.14258
[3,] 24.74609 55.03418
[4,] 17.49512 55.12207
[5,] 16.48438 59.73633
Slot "plotOrder":
[1] 1
Slot "labpt":
[1] 20.50516 57.72918
Slot "ID":
[1] "myMultiPolygons"
Slot "area":
[1] 36.85484
Slot "plotOrder":
[1] 1
Slot "bbox":
min max
x 16.48438 24.74609
y 55.03418 61.14258
Slot "proj4string":
CRS arguments:
+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
> spatialpolygons@bbox
min max
x 16.48438 24.74609
y 55.03418 61.14258
> spatialpolygons@area
Error: no slot of name "area" for this object of class "SpatialPolygons"
> slotNames(spatialpolygons)
[1] "polygons" "plotOrder" "bbox" "proj4string"
> names(spatialpolygons)
[1] "myMultiPolygons"
2 ответа:
Во-первых, вы должны знать, что слот
@area
не является надежным источником информации о фактической площади объектаSpatialPolygons*
. Как отмечалось в?"Polygons-class"
, слот@area
используется только в качестве дополнения к построению графика (предотвращая закрашивание меньших полигонов более крупными) и не учитывает проекцию или должным образом учитывает отверстия в полигонах.Чтобы получить точные области, вы должны вместо этого использовать
rgeos::gArea()
для слоев с проекционными координатными системами отсчета илиgeosphere::areaPolygon()
для тех, которые в lat-длинные координатные системы отсчета (т. е.CRS(+proj=longlat)
).С этими оговорками в сторону, ниже показано, как вы можете получить содержимое слотов
@area
, Если вы действительно хотите их получить.
Основная сложность заключается в том, что ячейка области принадлежит объекту Polygon, а не объекту SpatialPolygons (из которых Объект Polygon является одним элементом). Таким образом, вам нужно сначала покопаться в объекте SpatialPolygons , чтобы извлечь к индивидуальный полигональный объект(ы).После того, как вы это сделали, вы можете просто использовать оператор
@
для извлечения содержимого слота области.В следующем примере используется объект SpatialPolygons , созданный в Разделе 7
sp
виньетка пакета (предупреждение, pdf):require(sp) # Example pasted in from Section 7 of the sp vignette Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2))) Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2))) Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5))) Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) Srs1 = Polygons(list(Sr1), "s1") Srs2 = Polygons(list(Sr2), "s2") Srs3 = Polygons(list(Sr3, Sr4), "s3/4") SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3) # To extract the area of the first (or in your case only) Polygon SpP@polygons[[1]]@area # [1] 5.5 # Extract the areas of all three component Polygons sapply(SpP@polygons, function(x) x@area) # [1] 5.5 1.5 10.0 ## For areas, rgeos::gArea() or geosphere::areaPolygons() are generally more appropriate ## (Note, for instance, that it properly accounts for the hole in the 3rd polygon.) rgeos::gArea(SpP, byid=TRUE) # s1 s2 s3/4 # 5.5 1.5 9.0
Вы можете вычислить область с функциями в пакете
rgeos
, примеры ниже, используя примерные данные Джоша. Это может быть более уместно, так как слотarea
предназначен только для построения графика.library(rgeos) gArea(SpP[1,]) ## [1] 5.5 gArea(SpP[2,]) ##[1] 1.5 gArea(SpP[3,]) ## [1] 10
Все сразу:
gArea(SpP) [1] 17
Следует учитывать используемую систему координат, это всего лишь сырая геометрическая область.
На страницах справки обсуждается слот
area
.?gArea ....
Обратите внимание, что это значение может отличаться от слот’ area 'класса' Polygons ' как это значение не имеет вычтите площадь всех отверстий в геометрии.
?"Polygons-class" ...
'area’: объект класса 'numeric'; общая плоская площадь полигонального списка, но не двойного счета отверстий (изменено от 0.9-58-острова суммируются, дырки скорее игнорируются чем вычитается); эти значения используются для того, чтобы убедиться, что полигоны меньшей площади строятся после полигонов меньшей площади. большая площадь, не уважает проекцию в качестве объектов такого класс не имеет определенной проекции