공간 폴리곤을 SpatialPolygonsDataFrame으로 변환하고 속성 테이블에 열을 추가하는 방법


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 

위에서 4가있는 범주를 가져 와서 새 열에 0으로 넣습니다.

이 시점에서, 열 이름 ratings도 원합니다 bc. 버퍼 내부에 있으면 0이, 외부에 있으면 1이 걸립니다. 문제는 bcis SpatialPolygons이고 속성 테이블이 포함되어 있지 않다는 것입니다.

분명히 SpatialPolygon객체에 열을 추가하려면 열을 로 변환해야 SpatialPolygonsDataFrame하지만 어떻게 해야할지 모르겠습니다.

나는 이것을 시도했다 :

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

그러나이 오류가 나타납니다.

row.names of data and Polygons IDs do not match 

1
글쎄, gBuffer에 대한 도움말을 읽으면 byid = TRUE이면 결과가 SpatialPolygonsDataFrame이라는 것을 알 수 있습니다.
Jeffrey Evans

답변:


11

"해안", "ro"및 "bc"개체는 문제와 어떤 관련이 있습니까? "readShapeSpatial"을 사용하는 중일 수 있습니다. rgdal에서 readOGR을 사용해 보셨습니까? 다각형 shapefile을 읽는 경우 readOGR은 SpatialPolygonsDataFrame 객체를 생성합니다.

실제로 SpatialPolygons 객체가 있고 SpatialPolygonsDataFrame으로 강제 변환하려면 지정된 데이터 프레임의 행 이름이 폴리곤 슬롯의 폴리곤 ID와 일치해야합니다. 다음은 간단한 예입니다.

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

나는 "해안", "ro"및 "bc"와 같은 나머지 코드를 보여 주어 내가 일반적으로하려는 일에 대한 아이디어를 얻는 데 도움을줍니다. 나는 내가 요구하는 것에 대해 더 많은 대답을 얻을 필요가 있으며 더 이해하기 쉽도록 내 자신의 변수를 사용하는 것이 현명 할 것입니다. "bc"에는 새 열을 추가 해야하는 공간 폴리곤 객체 인 도로 버퍼가 포함되어 있으므로 먼저 spacePolygonsDataFrame으로 변환해야합니다.
gsa

10

시험:

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

match.ID 경기 폴리곤 ID에 행 이름을 요구하지 않습니다.


4
반대하지 마십시오. 감사하지 않습니다! "복잡한"답변이 제공된 이유는 2015 년에 문제가 해결되었을 때 match.ID 인수를 강제 방법에서 사용할 수 없기 때문입니다.
Jeffrey Evans

7

아주 간단합니다 :

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" 

"행의 데이터 이름과 다각형 ID가 일치하지 않습니다"오류가 발생 하면이 솔루션이 도움이 될 것 같습니다. 다각형의 ID와 일치하도록 데이터 프레임의 ID 이름을 바꾸십시오.

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

2
여기 몇 단계가 확실하지 않습니다. 이 강제는 모호하다 : as.data.frame (polygons). 예를 들어 객체를 동일한 클래스로 강제 변환합니다. 또한 실제 예에서는 데이터 프레임의 행 이름이 다각형 슬롯의 ID와 일치하지 않으므로 오류가 발생합니다. 강요하기 전에 다각형 ID를 당겨서 행 이름에 할당해야합니다.
Jeffrey Evans

@ JeffreyEvans, 이것은 작업 코드에서 복사하여 붙여 넣습니다. 오류가 없으며 모든 것이 작동합니다. SpatialPolygonsDataFrame작성 방법에 대한 문서를 읽으십시오 .
SS_Rebelious

4
그러나 예제에서 readOGR을 사용하기 때문에 SpatialPolygonsDataFrame으로 시작하고 있으며 원래 sp 개체에서 가져 왔기 때문에 하위 집합의 데이터 프레임에 올바른 행 이름이 이미 있습니다. 이것은 스트로 맨의 예입니다.
Jeffrey Evans

@ JeffreyEvans, 나는 의미를 명확히하기 위해 대답을 편집했습니다.
SS_Rebelious

메인 게시물의 마지막 편집을보고 내가 잘못한 원인을 알려주십시오. 귀하의 의견에 따라 작성한 것으로 생각되지만 오류가 발생합니다. 더 이해하기 쉽게 내 변수를 사용하십시오. 감사합니다
gsa

0

다음 솔루션이 일반적으로 작동한다는 것을 알았습니다.

먼저 ID를 필드로 사용하여 빈 데이터 프레임을 만듭니다.

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

그런 다음 공간 다각형의 ID를 가져옵니다 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

그런 다음 공간 데이터 프레임 변환 함수의 두 번째 인수로 df를 사용하십시오.

spatial_df <- SpatialPolygonsDataFrame(bc, df)

데이터 프레임 개체 df와 마찬가지로 spatial_df열을 쉽게 추가 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.