R에서 교차 영역 추출


19

두 개의 다각형이 있습니다. 하나는 들판 (X, Y, Z)을 포함하고 다른 하나는 토양 유형 (A, B, C, D)을 포함합니다. 모든 분야에서 어떤 종류의 토양이 포함되어 있는지 알고 싶습니다. 나는 다음을 시도했다.

여기에 이미지 설명을 입력하십시오

library(rgdal)
library(rgeos)
Field<-readOGR("./","Field")
Soil<-readOGR("./","Soil")
Results<-gIntersects(Soil,Field,byid=TRUE)
rownames(Results)<-Field@data$FieldName
colnames(Results)<-Soil@data$SoilType

> Results
      A     B     C     D
Z  TRUE FALSE FALSE FALSE
Y FALSE  TRUE  TRUE FALSE
X  TRUE  TRUE  TRUE  TRUE

어떤 필드에 어떤 토양 유형이 들어 있는지 알려주는 좋은 결과를 얻었습니다. 그러나 대신 영역을 어떻게 얻습니까?


1
참고로, 포인트가 위도 및 경도이면 st_intersection이 작동하지 않습니다. 토양 유형에 대해 이야기하고 있기 때문에 힌트를 받았지만 지리적 좌표가 있음을 지정하지 않았습니다.
푸리에

답변:


24

이 방법은 패키지 의 intersect()기능을 사용합니다 raster. 내가 사용한 예제 데이터는 이상적이지 않지만 (예를 들어 투영되지 않은 좌표에있는 것) 아이디어를 얻습니다.

library(sp)
library(raster)
library(rgdal)
library(rgeos)
library(maptools)

# Example data from raster package
p1 <- shapefile(system.file("external/lux.shp", package="raster"))
# Remove attribute data
p1 <- as(p1, 'SpatialPolygons')
# Add in some fake soil type data
soil <- SpatialPolygonsDataFrame(p1, data.frame(soil=LETTERS[1:12]), match.ID=F)

# Field polygons
p2 <- union(as(extent(6, 6.4, 49.75, 50), 'SpatialPolygons'),
             as(extent(5.8, 6.2, 49.5, 49.7), 'SpatialPolygons'))
field <- SpatialPolygonsDataFrame(p2, data.frame(field=c('x','y')), match.ID=F)
projection(field) <- projection(soil)

# intersect from raster package
pi <- intersect(soil, field)
plot(soil, axes=T); plot(field, add=T); plot(pi, add=T, col='red')

# Extract areas from polygon objects then attach as attribute
pi$area <- area(pi) / 1000000

# For each field, get area per soil type
aggregate(area~field + soil, data=pi, FUN=sum)

임 구르

결과 :

    field soil         area
1      x    A 2.457226e+01
2      x    B 2.095659e+02
3      x    C 5.714943e+00
4      y    C 5.311882e-03
5      x    D 7.620041e+01
6      x    E 3.101547e+01
7      x    F 1.019455e+02
8      x    H 7.106824e-03
9      y    H 2.973232e+00
10     y    I 1.752702e+02
11     y    J 1.886562e+02
12     y    K 1.538229e+02
13     x    L 1.321748e+02
14     y    L 1.182670e+01

2
명확히하기 위해 : 나는 선호 raster::intersect이상의 rgeos::gIntersection전자가 두에서 속성 데이터 조인 때문에 SpatialPolgonsDataFrame개체를 후자의 속성 데이터를 삭제하는 것 동안.
Matt SM

자세한 내용과 정답에 감사드립니다. 당신은 저에게 많은 도움을주었습니다 !!!
user2386786

4
"gIntersection"에서 byid = TRUE를 사용하면 속성 IDS를 반환하고 속성 IDS를 병합과 함께 사용하여 속성을 연결할 수 있습니다. 기능이 다르므로 방법에 유의해야합니다. "교차"기능은 겹치는 범위를 사용하는 반면 "g 교차"는 벡터 지오메트리의 명시 적 교차입니다. 교차 접근은 실제 다각형의 교차가 아닌 정사각형 / 직사각 교차입니다. 범위와 bbox를 사용하여 범위를 다시 정의 할 수 있습니다. 두 가지 방법 모두 장점이 있습니다.
Jeffrey Evans

1
@JeffreyEvans 좋은 지적 다시 gIntersection; 그러나 입력 기능 ID는 직접 제공되지 않으며 연결되어 출력의 기능 ID에 저장됩니다. 이는 ID를 구문 분석 한 다음 속성에 참여하는 추가 단계를 의미합니다. raster::intersect이 입력 ID를 출력에 추가 속성으로 포함하고 싶습니다 .
Matt SM

1
지적 해 주셔서 감사합니다, 나는 intersect_sp를 완전히 놓쳤습니다. 흥미롭게도 gIntersects를 사용합니다. 속성을 결합하려면 멋진 지름길입니다.
Jeffrey Evans

23

다음은 새로운 sf패키지를 사용하는 대체 접근법 sp입니다. 모든 것이 훨씬 깨끗하고 파이프 친화적입니다.

library(sf)
library(tidyverse)

# example data from raster package
soil <- st_read(system.file("external/lux.shp", package="raster")) %>% 
  # add in some fake soil type data
  mutate(soil = LETTERS[c(1:6,1:6)]) %>% 
  select(soil)

# field polygons
field <- c("POLYGON((6 49.75,6 50,6.4 50,6.4 49.75,6 49.75))",
        "POLYGON((5.8 49.5,5.8 49.7,6.2 49.7,6.2 49.5,5.8 49.5))") %>% 
  st_as_sfc(crs = st_crs(soil)) %>% 
  st_sf(field = c('x','y'), geoms = ., stringsAsFactors = FALSE)

# intersect - note that sf is intelligent with attribute data!
pi <- st_intersection(soil, field)
plot(soil$geometry, axes = TRUE)
plot(field$geoms, add = TRUE)
plot(pi$geometry, add = TRUE, col = 'red')

# add in areas in m2
attArea <- pi %>% 
  mutate(area = st_area(.) %>% as.numeric())

# for each field, get area per soil type
attArea %>% 
  as_tibble() %>% 
  group_by(field, soil) %>% 
  summarize(area = sum(area))

여기에 이미지 설명을 입력하십시오

   field  soil      area
   <chr> <chr>     <dbl>
1      x     A  24572264
2      x     B 209573036
3      x     C   5714943
4      x     D  76200409
5      x     E  31015469
6      x     F 234120314
7      y     B   2973232
8      y     C 175275520
9      y     D 188656204
10     y     E 153822938
11     y     F  11826698
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.