R에서 다각형 shapefile을 사용하여 래스터에서 래스터 추출


13

R을 처음 사용하고 래스터 패키지를 사용하고 있습니다. 기존 래스터 파일에서 다각형을 추출하는 데 문제가 있습니다. 내가 사용하면

extract(raster, poly_shape)

래스터의 기능은 항상 데이터가있는 목록을 만듭니다. 내가 정말로 원하는 것은 ArcGIS로 다시로드 할 수있는 다른 래스터 파일을 추출하는 것입니다. 조금 더 읽은 후에는 자르기 기능이 실제로 필요한 것이라고 생각합니다. 그러나이 기능을 사용하려고하면

crop(raster, poly_shape)

이 오류가 발생합니다.

Error in .local(x, y, ...) : extents do not overlap
In addition: Warning message:
In intersect(extent(x), extent(y)) : Objects do not overlap

파일 래스터와 poly_shape는 두 기능에서 동일합니다. 여기서 무엇이 잘못 될 수 있는지 말해 줄 수 있습니까? 자르기 기능이 목록이 아닌 다른 래스터를 만드는 것이 옳습니까?

편집 : extent () 함수가 작동하지 않습니다. 여전히 같은 오류가 발생합니다. 그러나 2 개의 데이터 세트가 겹칠 것이라고 확신합니다! 와 더불어

extract(raster, poly_shape)

올바른 데이터를 얻습니다. 내가 원하는 것처럼 래스터가 아닌 목록처럼. 방금 전에 ArcGIS에 데이터 세트를로드했으며 잘 맞았으므로 투영을 확인하지 않았습니다. 이제 나는 시도했다

projection(raster) # "+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs"
projection(poly_shape) # "+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs"

투영이 맞지 않는 것을 볼 수 있습니다. 추출 기능은 파일을 올바른 방식으로 자동 변환 할 수있는 것 같습니다. 나는 다음을했기 때문에 알고 있습니다.

  • ArcGIS에서도 R로 추출한 다각형의 정확한 부분을 잘라냅니다
  • 추출 된 R 다각형 (목록)의 모든 값의 합계를 계산했습니다.
  • ArcGIS에서 잘라낸 모든 래스터 셀의 합계를 계산했습니다.

2는 동일한 결과를 가지므로 추출 기능이 올바르게 작동했다는 결론을 내릴 것입니다. 이제 두 가지 옵션이 있습니다.

  1. 추출 된 목록에서 래스터를 다시 가져 오는 방법이 필요합니다.
  2. 2 개의 데이터 세트 (래스터 + poly_shape)는 동일한 프 젝션을 사용해야하며 자르기 기능이 작동해야합니다

여기서 무엇을 제안 하시겠습니까?


4 밴드 rgbi 래스터이면 어떻게 되나요? 밴드는 지금까지 잃어버린 ...
Doris

GIS SE에 오신 것을 환영합니다! 신규 사용자 인 경우 짧은 둘러보기 를 수행하십시오 . 그런 다음 추가 정보와 참조를 제공하기 위해 답을 편집하십시오. 좋은 답변을 작성하려면 어떻게합니까?를 참조하십시오 . 더 많은 정보를 위해서.
Andy

새로운 질문이 있으면 질문하기 버튼 을 클릭하여 질문하십시오 . 컨텍스트를 제공하는 데 도움이되는 경우이 질문에 대한 링크를 포함하십시오. - 리뷰에서
Erik

답변:


19

추출 기능이 정확하게 동작합니다. 자르기 함수가 다각형의 범위를 사용하도록 강제 한 다음 객체를 마스크하여 다각형 영역을 나타내는 정확한 래스터를 반환 할 수 있습니다. 오류가 계속 발생하면 실제로 데이터가 겹치지 않음을 의미합니다.

R은 "즉석"투영을 수행하지 않으므로 투영을 확인하십시오. "extent ()"함수를 사용하여 익스텐트가 겹치는 지 확인할 수 있습니다.

다음은 다각형 범위를 사용하여 자르고 "래스터 화 된"다각형을 사용하여 결과 래스터를 마스킹하는 예입니다.

# Add required packages
require(raster)
require(rgeos)
require(sp)

# Create some data using meuse 
data(meuse)
  coordinates(meuse) <- ~x+y
    proj4string(meuse) <- CRS("+init=epsg:28992")
data(meuse.grid)
  coordinates(meuse.grid) = ~x+y
    proj4string(meuse.grid) <- CRS("+init=epsg:28992")
      gridded(meuse.grid) = TRUE    
        r <- raster(meuse.grid) 
          r[] <- runif(ncell(r))

# Create a polygon
f <- gBuffer(meuse[10,], byid=FALSE, id=NULL, width=250, 
                         joinStyle="ROUND", quadsegs=10)   

# Plot full raster and polygon                       
plot(r)
  plot(f,add=T)

# Crop using extent, rasterize polygon and finally, create poly-raster
#          **** This is the code that you are after ****  
cr <- crop(r, extent(f), snap="out")                    
  fr <- rasterize(f, cr)   
    lr <- mask(x=cr, mask=fr)

# Plot results
plot(lr)
  plot(f,add=T)

4
extract () 즉석 재 투영을 수행하지만 crop ()은 수행하지 않습니다. 일부 혼란 그 힘 계정
mdsumner

@Jefferey crop () 및 mask ()는 다각형의 사각형 범위에 따라 래스터를 자르고 다각형의 경계 내에서 자르지 않습니다. 주어진 다각형의 경계 내에서 래스터를자를 수있는 명령은 무엇입니까?
csheth

1
@Chintan Sheth, 다각형 내에서 마스크를 서브셋하려면 다각형 내의 값을 나타내는 래스터가 있어야합니다. 이것이 서브셋 폴리곤을 래스터 화 한 다음 마스크하는 이유입니다. 자르기 단계는 래스터의 범위를 하위 세트 다각형과 동일하게 줄이며, 과거에 건너 뛴 경우에는 범위 불일치 오류가 발생합니다.
Jeffrey Evans

spTransform로부터 sp(때때로 자동으로 다른 공간 R 패키지와로드) 패키지 재 투영 받을수 두 파일이 동일한 투영 예에되도록. good_poly=spTransform(spolygon, CRSobj=crs(raster_file))
user3386170

@ user3386170, 응? 무엇을 받고 있는지 확실하지 않습니다. 이 질문은 래스터 패키지가 기능 중 일부에서 "즉석 투영"을 방금 추가했을 때 발생했습니다. 이러한 함수는 프로젝션이 일치하지 않을 때 이전에 오류를 발생 시켰지만이 게시물은 2014 년입니다. sp :: spTransform ()을 사용할 때 항상 rgdal을로드해야한다는 점을 알고 있어야합니다.
Jeffrey Evans

8

내가 실제로 검색 한 것은 mask()기능이었습니다.

mask(raster, poly_shape)

오류없이 작동하고 내가 찾은 것을 반환합니다.


2
동일한 투영 공간에 있도록 데이터를 다시 투영하십시오. 즉석 투영이 자동 인 ArcGIS에서도 다른 투영에서 분석을 수행하는 것은 매우 나쁜 습관입니다. 다른 예측의 데이터를 사용하면 데이터가 공통 범위를 공유하지 않으므로 오류가 발생합니다.
Jeffrey Evans

projectExtent ()를 사용하여 래스터 자르기 정도를 가져옵니다.
mdsumner

사이트의 Q & A 형식에 맞추려면 질문의 본문에 편집 / 업데이트로 배치해야합니다 (그런 다음 "답변"으로 답변에 주석을 추가하여 더 많은 내용을 알 수 있도록하십시오).
matt wilkie

@mattwilkie 형식을 맞지 않아서 죄송하지만 내 텍스트가 너무 길어서 여기에 의견을 게시 할 수 없습니다. @JeffreyEvans 나는 다음을 시도했다. projection(raster) = projection(poly_shape)다른 방법으로 projection(poly_shape) = projection(raster)두 가지 방법으로 같은 오류가 발생한다 Error in .local(x, y, ...) : extents do not overlap In addition: Warning message: In intersect(extent(x), extent(y)) : Objects do not overlap. extract () 함수를 사용하여 어떤 프로젝션이 즉시 사용되는지 확인할 수있는 방법이 있습니까?
Lars

1
실제로 검색 한 것은 mask () 함수였습니다. mask(raster, poly_shape)오류없이 작동하고 내가 찾은 것을 반환합니다.
Lars

-1

익스텐트는 정상적으로 작동합니다 ... 익스텐트의 Xmin, Xmax, Ymin 및 Ymax는 래스터의 X 및 Y와 다릅니다. 즉, 반대로 설정됩니다.

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