2012-01-03 24 views
8

Vì vậy, tôi có một đối tượng spatialpolygons trong R; nhưng tôi không chắc tại sao tôi không thể lấy lại vùng "khu vực" từ nó.Nhận giá trị của một vị trí của S4 đối tượng?

Dưới đây là phiên R của tôi:

> 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 

> [email protected] 
     min  max 
x 16.48438 24.74609 
y 55.03418 61.14258 
> [email protected] 
Error: no slot of name "area" for this object of class "SpatialPolygons" 
> slotNames(spatialpolygons) 
[1] "polygons" "plotOrder" "bbox"  "proj4string" 
> names(spatialpolygons) 
[1] "myMultiPolygons" 

Trả lời

16

Trước hết, bạn nên biết rằng khe @area không phải là một nguồn đáng tin cậy của thông tin về diện tích thực tế một đối tượng của SpatialPolygons*. Như đã ghi chú trong ?"Polygons-class", khe @area chỉ được sử dụng làm phụ trợ để vẽ đồ thị (ngăn các đa giác nhỏ hơn bị các vật thể lớn vẽ lên) và không tôn trọng phép chiếu hoặc chiếm đúng lỗ trong đa giác.

Để có được khu vực chính xác, thay vào đó bạn nên sử dụng rgeos::gArea() cho các lớp với dự kiến ​​phối hợp hệ thống tham chiếu hoặc geosphere::areaPolygon() cho những người lat dài hệ tọa độ tham chiếu (ví dụ: CRS(+proj=longlat)).

Với những lưu ý đó, cách sau cho biết cách bạn có thể lấy nội dung của các khe @area nếu bạn thực sự muốn chúng.


Các biến chứng chính là khe khu vực thuộc Polygon đối tượng, không để các SpatialPolygons đối tượng (trong đó Polygon đối tượng là một trong những yếu tố). Do đó, bạn cần phải tìm hiểu kỹ đối tượng SpatialPolygons để trích xuất đối tượng Đa giác đối tượng.

Một trong những bạn đã làm điều đó, bạn chỉ có thể sử dụng toán tử @ để trích xuất nội dung của vùng khu vực.

Ví dụ sau đây sử dụng SpatialPolygons đối tượng được tạo ra trong Mục 7 của sp package vignette (warning, 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 
[email protected][[1]]@area 
# [1] 5.5 

# Extract the areas of all three component Polygons 
sapply([email protected], function(x) [email protected]) 
# [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 
+0

như vậy cho trường hợp của tôi, nơi có chỉ 1 đa giác, 'spatialpolygons @ polygons [[1]] @ area' hoạt động. –

+0

Chính xác và vui mừng vì nó làm việc cho bạn. Tôi sẽ thêm nó vào câu trả lời cho sự hoàn chỉnh. –

+4

Chỉ để cho vui, điều này cũng sẽ hoạt động: 'slot (slot (Sp," polygons ") [[1]]," area ")'. :) Bạn cũng có thể kiểm tra các tên khe bằng 'slotNames'. –

6

Bạn có thể tính toán diện tích với các chức năng trong gói rgeos, ví dụ dưới đây sử dụng dữ liệu ví dụ Josh. Điều này có thể phù hợp hơn vì khe area chỉ đơn thuần là để vẽ đồ thị.

library(rgeos) 
gArea(SpP[1,]) 
## [1] 5.5 
gArea(SpP[2,]) 
##[1] 1.5 
gArea(SpP[3,]) 
## [1] 10 

Tất cả cùng một lúc:

gArea(SpP) 
[1] 17 

Hệ thống phối hợp trong việc sử dụng cần được xem xét, đây chỉ là liệu khu vực hình học.

Trang trợ giúp thảo luận về vị trí area.

?gArea 
.... 

Lưu ý rằng giá trị này có thể khác nhau từ ‘khu vực’ khe của lớp ‘Đa giác’ như giá trị này không trừ đi diện tích của bất kỳ lỗ hổng trong hình học.

?"Polygons-class" 
... 

‘khu vực’: đối tượng của lớp ‘số"’; tổng diện tích mặt bằng phẳng của danh sách Đa giác nhưng không đếm hai lỗ (thay đổi từ 0,9-58 - đảo được tổng hợp, các lỗ bị bỏ qua thay vì trừ đi); những giá trị này được sử dụng để đảm bảo rằng đa giác của một khu vực nhỏ hơn được vẽ sau khi đa giác của một khu vực lớn hơn, không tôn trọng chiếu như đối tượng của lớp này không có dự định

+0

Rất tốt để biết về 'gArea' . Cảm ơn bạn đã thêm điều đó. –

+0

@mdsummer: mẹo tuyệt vời. CẢM ƠN BẠN! –

Các vấn đề liên quan