Получение значения слота для объектов S4? - PullRequest
10 голосов
/ 03 января 2012

Итак, у меня есть объект пространственного полигона в 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 ]

18 голосов
/ 03 января 2012

Прежде всего, вы должны знать, что слот @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 
8 голосов
/ 03 января 2012

Вы можете вычислить площадь с помощью функций в пакете 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’: объект класса ‘« числовой »’; общая общая плоская площадь из списка полигонов, но не с двойным счетом отверстий (изменено от 0,9-58 - острова суммируются, дыры скорее игнорируются чем вычитал); эти значения используются, чтобы убедиться, что полигоны меньшей площади строятся после полигонов большая площадь, не учитывает проекцию как объекты этого класс не имеет проекции

...