Cách chuyển đổi một spatialpolygon thành SpatialPolygonsDataFrame và thêm một cột vào bảng thuộc tính


19
coast<-readShapeSpatial("coastline.shp")
landc<-readShapeSpatial("landcover.shp")
ro<-readShapeSpatial("roads.shp")
bc<-gBuffer(ro,width=100)
landc$ratings=1
landc$ratings[landc$LANDUSE_ID==4]=0 

Ở trên, tôi lấy bất kỳ danh mục nào có 4 và trong cột mới đặt nó là 0.

Tại thời điểm này, tôi muốn cột cũng được đặt tên ratingscho bc, trong đó nó sẽ lấy 0 nếu nó nằm trong bộ đệm và 1 nếu nó ở bên ngoài. Vấn đề là các bcSpatialPolygonsvà nó không chứa các bảng thuộc tính.

Rõ ràng để thêm một cột vào một SpatialPolygonđối tượng bạn phải chuyển đổi nó thành một SpatialPolygonsDataFrame, nhưng tôi không biết làm thế nào.

Tôi đã thử điều này:

buf_df<-as.data.frame(bc)
s_po<-SpatialPolygonsDataFrame(bc,buf_df)
s_po$ratings=0

nhưng lỗi này bật lên:

row.names of data and Polygons IDs do not match 

1
Chà, nếu bạn đọc trợ giúp cho gBuffer, bạn sẽ biết rằng nếu byid = TRUE thì kết quả là SpatialPolygonsDataFrame.
Jeffrey Evans

Câu trả lời:


11

Các đối tượng "bờ biển", "ro" và "bc" có liên quan gì đến vấn đề của bạn? Vấn đề có thể nằm ở chỗ bạn đang sử dụng "readShapeSpatial". Bạn đã thử readOGR trong rgdal chưa? Nếu bạn đang đọc một shapefile đa giác, readOGR sẽ dẫn đến một đối tượng SpatialPolygonsDataFrame.

Nếu bạn trong thực tế, hãy có một đối tượng SpatialPolygons và muốn ép buộc vào SpatialPolygonsDataFrame, khung dữ liệu được chỉ định sẽ cần phải có các tên gọi phù hợp với ID đa giác trong khe đa giác. Dưới đây là một ví dụ nhanh.

library(sp)

# create some SpatialPolygons with ID's "2" and "3"
( p <- SpatialPolygons(list(Polygons(list(Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))), "2"),
     Polygons(list(Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))), "3"))) )
class(p)    

# Create a dataframe and display default rownames
( p.df <- data.frame( ID=1:length(p)) ) 
rownames(p.df)

# Try to coerce to SpatialPolygonsDataFrame (will throw error)
p <- SpatialPolygonsDataFrame(p, p.df) 

# Extract polygon ID's
( pid <- sapply(slot(p, "polygons"), function(x) slot(x, "ID")) )

# Create dataframe with correct rownames
( p.df <- data.frame( ID=1:length(p), row.names = pid) )    

# Try coersion again and check class
 p <- SpatialPolygonsDataFrame(p, p.df)
 class(p) 

# Now we can add a column
p@data$ratings <- 1:2 

# Or modify an existing one
p[p$ID < 2 ,] <- 5

tôi đã chỉ ra phần còn lại của mã như "bờ biển", "ro" và "bc" để giúp bạn có ý tưởng về những gì tôi đang cố gắng làm nói chung. Tôi cần có thêm câu trả lời chính xác cho những gì tôi đang hỏi và sẽ là khôn ngoan khi sử dụng các biến của riêng tôi để dễ hiểu hơn. Thêm vào đó, thỏa thuận với readOGR và readShapeSpatial là gì? "Bc" chứa bộ đệm đường là đối tượng spatialpolygons mà tôi cần thêm cột mới, do đó trước tiên tôi phải chuyển đổi nó thành spatialPolygonsDataFrame.
gsa

10

Thử:

#Code taken from the question:
s_po <- SpatialPolygonsDataFrame(bc, buf_df, match.ID = F) 

match.ID tránh yêu cầu của các tên gọi cho ID đa giác khớp


4
Đừng ngược lại, nó không được đánh giá cao! Lý do các câu trả lời "phức tạp" được cung cấp là vì vào năm 2015, khi câu hỏi được giải quyết, đối số match.ID không có sẵn trong phương thức coersion.
Jeffrey Evans

7

Nó khá đơn giản:

library("rgdal")
polygons <- readOGR('path_to/file.shp',
                      layer = 'file')
class(polygons)
>[1] "SpatialPolygonsDataFrame"
>attr(,"package")
>[1] "sp"

poly_df <- as.data.frame(polygons)
# do some staff with "poly_df" that doesn't support SpatialPolygonsDataFrame
# then convert it to SPDF back again
s_poly <- SpatialPolygonsDataFrame(polygons, poly_df)
# add new column to SPDF:
s_poly$new_column <- "some data" 

Khi Lỗi: "hàng. Tên dữ liệu và ID đa giác không khớp" phát sinh giải pháp này có vẻ hữu ích: đổi tên ID của khung dữ liệu để khớp với ID của đa giác:

newdata <- data.frame(whatever you want in here)
row.names(newdata) <- (however the new polygons are labeled)
polygons <- SpatialPolygonsDataFrame(polygons, newdata)

2
Không chắc chắn về một vài bước ở đây. Sự ép buộc này là không rõ ràng: as.data.frame (đa giác). Bạn ví dụ là ép buộc đối tượng vào cùng một lớp. Ngoài ra, trong một ví dụ thực tế, bạn sẽ đưa ra một lỗi vì các tên gọi của khung dữ liệu sẽ không khớp với ID trong (các) khe đa giác. Bạn cần phải kéo ID đa giác và gán chúng cho các tên gọi trước khi ép buộc.
Jeffrey Evans

@JeffreyEvans, đây là bản sao chép từ mã làm việc. Không có lỗi, mọi thứ đều hoạt động. Chỉ cần đọc một số tài liệu về cách SpatialPolygonsDataFrameđược tạo ra.
SS_Rebelious

4
Nhưng, vì bạn sử dụng readOGR trong ví dụ của mình, bạn đang bắt đầu với SpatialPolygonsDataFrame và khung dữ liệu mà bạn đặt lại đã có các tên gọi chính xác vì bạn đã kéo nó từ đối tượng sp ban đầu. Đó là một ví dụ người rơm.
Jeffrey Evans

@JeffreyEvans, tôi đã chỉnh sửa câu trả lời của mình để làm rõ nghĩa.
SS_Rebelious

xem chỉnh sửa cuối cùng của tôi trong bài viết chính và cho tôi biết những gì tôi đã làm sai vì tôi nghĩ rằng tôi đã làm nó theo nhận xét của bạn nhưng nó cho lỗi. Sử dụng các biến của riêng tôi để làm cho nó dễ hiểu hơn. Cảm ơn
gsa

0

Tôi tìm thấy giải pháp sau đây thường hoạt động.

Đầu tiên, tạo một khung dữ liệu trống với ID là trường:

df <- data.frame(ID=character(), stringsAsFactors=FALSE )

Sau đó lấy ID của đa giác không gian bc:

for (i in bc@polygons ) { df <- rbind(df, data.frame(ID=i@ID, stringsAsFactors=FALSE))  }
# and set rowname=ID
row.names(df) <- df$ID

Sau đó sử dụng df làm đối số thứ hai cho hàm chuyển đổi khung dữ liệu không gian:

spatial_df <- SpatialPolygonsDataFrame(bc, df)

dfspatial_dflà các đối tượng khung dữ liệu, các cột có thể dễ dàng được thêm vào

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.