所以我在R中有一个spatialpolygons对象;但我不确定为什么我无法从中检索“区域”插槽。
这是我的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"
答案 0 :(得分:18)
首先,您应该知道@area
广告位不是SpatialPolygons*
对象实际区域的可靠信息来源。正如?"Polygons-class"
中所述,@area
广告位仅用作绘图的附属物(防止较小的多边形被较大的多边形绘制),并且不尊重投影或正确解释多边形中的洞。< / p>
要获得准确的区域,您应该使用rgeos::gArea()
表示具有投影坐标参考系的图层,或geosphere::areaPolygon()
表示拉长坐标参考系统(即CRS(+proj=longlat)
)。
有了这些警告,下面显示了如果你确实想要它们,你如何获得@area
插槽的内容。
主要的复杂因素是区域槽属于多边形对象,而不属于 SpatialPolygons 对象(其中多边形对象是一个元素)。因此,您需要首先深入了解 SpatialPolygons 对象,以提取到单个多边形对象。
您已经完成了这项工作,您只需使用@
运算符即可提取区域广告位的内容。
以下示例使用在sp
package vignette (warning, pdf)的第7节中创建的 SpatialPolygons 对象:
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
答案 1 :(得分:8)
您可以使用Josh的示例数据计算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
....
请注意,此值可能与 'Polygons'类的'area'槽,因为这个值没有 减去几何中任何孔的面积。
?"Polygons-class"
...
'area':类“数字”的对象';总平面面积 多边形列表但不是重复计算孔(已更改 从0.9-58 - 岛屿相加,孔被忽略 比减去);这些值用于确保 在a的多边形之后绘制较小区域的多边形 面积较大,不尊重投影作为对象 class没有定义投影