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.