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