Получение значения слота 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 10

2 ответа:

Во-первых, вы должны знать, что слот @area не является надежным источником информации о фактической площади объекта SpatialPolygons*. Как отмечалось в ?"Polygons-class", слот @area используется только в качестве дополнения к построению графика (предотвращая закрашивание меньших полигонов более крупными) и не учитывает проекцию или должным образом учитывает отверстия в полигонах.

Чтобы получить точные области, вы должны вместо этого использовать rgeos::gArea() для слоев с проекционными координатными системами отсчета или geosphere::areaPolygon() для тех, которые в lat-длинные координатные системы отсчета (т. е. CRS(+proj=longlat)).

С этими оговорками в сторону, ниже показано, как вы можете получить содержимое слотов @area, Если вы действительно хотите их получить.


Основная сложность заключается в том, что ячейка области принадлежит объекту Polygon, а не объекту SpatialPolygons (из которых Объект Polygon является одним элементом). Таким образом, вам нужно сначала покопаться в объекте SpatialPolygons , чтобы извлечь к индивидуальный полигональный объект(ы).

После того, как вы это сделали, вы можете просто использовать оператор @ для извлечения содержимого слота области.

В следующем примере используется объект SpatialPolygons , созданный в Разделе 7sp виньетка пакета (предупреждение, 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-острова суммируются, дырки скорее игнорируются чем вычитается); эти значения используются для того, чтобы убедиться, что полигоны меньшей площади строятся после полигонов меньшей площади. большая площадь, не уважает проекцию в качестве объектов такого класс не имеет определенной проекции