So I have a spatialpolygons object in R; but I am not sure why I am unable to retrieve the “area” slot from it.
Here’s my R session:
> 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"
First off, you should be aware that the
@areaslot is not a reliable source of information about aSpatialPolygons*object’s actual area. As noted in?"Polygons-class", the@areaslot is just used as an adjunct to plotting (preventing smaller polygons from getting painted over by larger ones) and does not respect projection or properly account for holes in polygons.To get accurate areas, you should instead use
rgeos::gArea()for layers with projected coordinate reference systems orgeosphere::areaPolygon()for those in lat-long coordinate reference systems (i.e.CRS(+proj=longlat)).With those caveats out of the way, the following shows how you can get the contents of the
@areaslots if you do in fact want them.The main complication is that the area slot belongs to the Polygon object, not to the SpatialPolygons object (of which the Polygon object is one element). You thus need to first dig down into the SpatialPolygons object to extract to the individual Polygon object(s).
One you have done that, you can just use the
@operator to extract the contents of the area slot.The following example uses the SpatialPolygons object created in Section 7 of the
sppackage vignette (warning, pdf):