Прежде всего, вы должны знать, что слот @area
не является надежным источником информации о фактической области SpatialPolygons*
объекта.Как отмечалось в ?"Polygons-class"
, слот @area
используется только в качестве дополнения к построению (предотвращая закрашивание более мелких полигонов более крупными) и не учитывает проекцию или должным образом учитывает дыры в многоугольниках.
Чтобы получить точные области, вы должны вместо этого использовать rgeos::gArea()
для слоев с проецированными системами координат координат или geosphere::areaPolygon()
для слоев в системах координат координат широты (то есть CRS(+proj=longlat)
).
С этими предупрежденияминиже показано, как вы можете получить содержимое слотов @area
, если вы действительно этого хотите.
Основная сложность заключается в том, что слот области принадлежит объекту Polygon , а не объекту SpatialPolygons (из которых Polygon объект является одним элементом).Таким образом, вам нужно сначала копаться в объекте SpatialPolygons для извлечения в отдельный объект (ы) Polygon .
Когда вы это сделали, вы можете просто использоватьоператор @
для извлечения содержимого слота области.
В следующем примере используется объект 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