2012-08-30 39 views
14

Gói sp cung cấp một số lớp cho các khái niệm không gian khác nhau (điểm, đường, đa giác). Đối với một số lớp học, việc truy cập các tọa độ tính năng rất đơn giản, ví dụ: . Tất cả các ví dụ được lấy từ các trang trợ giúp của lớp tương ứng.Trích xuất tọa độ tính năng từ SpatialPolygons và các lớp sp khác

l1 = cbind(c(1,2,3),c(3,2,2)) 
l1a = cbind(l1[,1]+.05,l1[,2]+.05) 
l2 = cbind(c(1,2,3),c(1,1.5,1)) 
Sl1 = Line(l1) 
Sl1a = Line(l1a) 
Sl2 = Line(l2) 
S1 = Lines(list(Sl1, Sl1a), ID="a") 
S2 = Lines(list(Sl2), ID="b") 
Sl = SpatialLines(list(S1,S2)) 
coordinates(Sl) 
# [prints a list of two with corresponding segments] 

Để SpatialPolygons, coordinates() trả về các trung tâm đa giác như minh họa bên dưới.

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) 
coordinates(SpP) 
     [,1]  [,2] 
[1,] 2.696970 3.545455 
[2,] 3.666667 2.333333 
[3,] 6.133333 3.933333 

Có chức năng tiện dụng trong các gói phổ biến có thể trích xuất tọa độ tính năng không? Tôi đã đưa ra một chức năng cho SpatialPolygons, nhưng tôi đang tìm một cái gì đó đã được kiểm tra tốt hơn và nhất quán, có lẽ ngay cả trên hầu hết/tất cả các lớp học sp.

getEdges <- function(x) { 
    stopifnot(class(x) == "SpatialPolygons") 
    lapply([email protected], function(y) { 
       [email protected][[1]]@coords 
      }) 
} 
getEdges(SpP) 
# [returns a list of three, coordinates in a matrix] 
+1

tôi khuyên bạn nên cuốn sách rất tốt: "Ứng dụng không gian phân tích dữ liệu với R" trong serie "Sử dụng R ! " -> http://www.springerlink.com/content/978-0-387-78171-6#section=147788&page=1 – Pop

+0

Nói chung, không nên sử dụng '@ property' để trích xuất nội dung. Đây là tổ chức nội bộ của đối tượng, có thể thay đổi mà không cần thông báo. –

Trả lời

14

Cách tốt nhất tôi có thể nghĩ đến là sử dụng fortify chức năng từ ggplot2. fortify là hàm chung có các phương thức để chuyển đổi các đối tượng R chung (ví dụ: lm, v.v.) thành một số data.frameggplot2 có thể sử dụng để vẽ đồ thị. Một danh sách đầy đủ cung cấp cho:

> ggplot2:::fortify. 
ggplot2:::fortify.cld                 
ggplot2:::fortify.confint.glht               
ggplot2:::fortify.data.frame                
ggplot2:::fortify.default                
ggplot2:::fortify.glht                 
ggplot2:::fortify.Line 
ggplot2:::fortify.Lines 
ggplot2:::fortify.lm 
ggplot2:::fortify.map 
ggplot2:::fortify.NULL 
ggplot2:::fortify.Polygon 
ggplot2:::fortify.Polygons 
ggplot2:::fortify.SpatialLinesDataFrame 
ggplot2:::fortify.SpatialPolygons 
ggplot2:::fortify.SpatialPolygonsDataFrame 
ggplot2:::fortify.summary.glht 

Bạn có thể thấy điều này bao gồm một chức năng fortify cho SpatialPolygons* đối tượng. Sử dụng ví dụ dữ liệu của bạn:

> obj = fortify(SpP) 
    long lat order hole piece group id 
1  2 2  1 FALSE  1 s1.1 s1 
2  1 4  2 FALSE  1 s1.1 s1 
3  4 5  3 FALSE  1 s1.1 s1 
4  4 3  4 FALSE  1 s1.1 s1 
5  2 2  5 FALSE  1 s1.1 s1 
6  5 2  1 FALSE  1 s2.1 s2 
7  2 2  2 FALSE  1 s2.1 s2 
8  4 3  3 FALSE  1 s2.1 s2 
9  5 2  4 FALSE  1 s2.1 s2 
10 4 5  1 FALSE  1 s3/4.1 s3/4 
11 10 5  2 FALSE  1 s3/4.1 s3/4 
12 5 2  3 FALSE  1 s3/4.1 s3/4 
13 4 3  4 FALSE  1 s3/4.1 s3/4 
14 4 5  5 FALSE  1 s3/4.1 s3/4 
15 5 4  6 TRUE  2 s3/4.2 s3/4 
16 5 3  7 TRUE  2 s3/4.2 s3/4 
17 6 3  8 TRUE  2 s3/4.2 s3/4 
18 6 4  9 TRUE  2 s3/4.2 s3/4 
19 5 4 10 TRUE  2 s3/4.2 s3/4 

và âm mưu kết quả:

require(ggplot2); theme_set(theme_bw()) 
ggplot(aes(x = long, y = lat, group = group), data = obj) + geom_path() 

enter image description here

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