Trích xuất Raster từ Raster bằng cách sử dụng shapefile Polygon trong R


13

Tôi mới sử dụng R và sử dụng gói raster. Tôi có một vấn đề trích xuất đa giác từ một tệp raster hiện có. Nếu tôi sử dụng

extract(raster, poly_shape)

Chức năng trên raster nó luôn tạo một danh sách với dữ liệu. Điều tôi thực sự muốn là trích xuất một tệp raster khác mà tôi có thể tải lại với ArcGIS. Sau khi đọc thêm một chút tôi nghĩ hàm crop là thứ tôi thực sự cần. Nhưng khi tôi cố gắng sử dụng chức năng này

crop(raster, poly_shape)

Tôi nhận được lỗi này:

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

Các tệp raster và poly_shape giống nhau cho cả hai chức năng. Bạn có thể cho tôi biết những gì có thể sai ở đây? Có đúng không khi hàm crop tạo ra một raster khác và không phải là một danh sách?

EDIT : Hàm scope () không hoạt động đối với tôi. Tôi vẫn nhận được lỗi tương tự. Nhưng tôi chắc chắn 2 tập dữ liệu trùng nhau! Với

extract(raster, poly_shape)

Tôi nhận được dữ liệu đúng từ nó. Chỉ là một danh sách và không phải là một raster như tôi muốn có nó. Tôi mới tải các bộ dữ liệu trong ArcGIS trước đó và chúng rất phù hợp vì vậy tôi đã không kiểm tra phép chiếu. Bây giờ tôi đã thử

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"

và bạn có thể thấy rằng các phép chiếu không phù hợp. Hàm trích xuất dường như có thể tự động chuyển đổi các tệp theo đúng cách. Tôi biết điều đó bởi vì tôi đã làm như sau:

  • Tôi đã cắt bỏ phần chính xác của đa giác mà tôi đã trích xuất trong R cũng trong ArcGIS
  • Tôi đã tính tổng của tất cả các giá trị của đa giác R được trích xuất (danh sách)
  • Tôi đã tính tổng của tất cả các ô raster mà tôi đã cắt trong ArcGIS

Cả 2 có cùng kết quả chính xác nên tôi đoán kết luận là hàm trích xuất đã hoạt động chính xác. Bây giờ tôi có 2 tùy chọn tôi đoán:

  1. Tôi cần một cách để đưa Raster ra khỏi danh sách được trích xuất lại hoặc
  2. 2 bộ dữ liệu (raster + poly_shape) cần sử dụng cùng một phép chiếu và chức năng cắt sẽ hoạt động

Bạn muốn đề nghị làm gì ở đây?


Điều gì nếu nó là một raster 4 ban nhạc rgbi? Các ban nhạc bị mất cho đến nay ...
Doris

Chào mừng bạn đến với GIS SE! Là người dùng mới, hãy chắc chắn thực hiện chuyến tham quan ngắn . Sau đó xem xét chỉnh sửa câu trả lời của bạn để cung cấp thêm thông tin và tài liệu tham khảo. Xem Làm thế nào để tôi viết một câu trả lời tốt? để biết thêm.
Andy

Nếu bạn có một câu hỏi mới, vui lòng hỏi nó bằng cách nhấp vào nút Hỏi câu hỏi . Bao gồm một liên kết đến câu hỏi này nếu nó giúp cung cấp bối cảnh. - Từ đánh giá
Erik

Câu trả lời:


19

Hàm trích xuất hoạt động chính xác như bình thường. Bạn có thể buộc hàm crop sử dụng phạm vi của đa giác và sau đó che dấu đối tượng để trả về raster chính xác đại diện cho khu vực đa giác. Nếu bạn tiếp tục nhận được lỗi, điều đó có nghĩa là dữ liệu của bạn, trên thực tế, không trùng lặp.

Xin lưu ý rằng R không thực hiện phép chiếu "đang bay", vì vậy hãy kiểm tra các dự đoán của bạn. Bạn có thể kiểm tra xem phạm vi của bạn có trùng nhau hay không bằng cách sử dụng hàm "scope ()".

Dưới đây là một ví dụ về cắt xén bằng cách sử dụng phạm vi đa giác sau đó che dấu raster kết quả bằng cách sử dụng đa giác "rasterized".

# 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
trích xuất () không thực hiện trên sự từ chối bay, nhưng crop () thì không. Điều đó có thể giải thích cho một số nhầm lẫn
mdsumner

@Jefferey crop () và mask () chỉ cắt raster theo phạm vi hình chữ nhật của đa giác, nó không cắt nó từ trong ranh giới của đa giác. Bất kỳ ý tưởng nào các lệnh có thể cắt raster trong ranh giới của đa giác đã cho?
csheth

1
@Chintan Sheth, để mặt nạ tập hợp con trong đa giác, bạn cần có một raster đại diện cho các giá trị trong đa giác. Đây là lý do tại sao bạn rasterize đa giác tập hợp con và sau đó mặt nạ cho nó. Bước cắt là để giảm phạm vi của raster xuống giống như đa giác tập hợp con, mà trong quá khứ, nếu bỏ qua, sẽ đưa ra một lỗi không khớp.
Jeffrey Evans

spTransformtừ spgói (đôi khi được tự động tải với các gói R không gian khác) cho phép chiếu lại để cả hai tệp nằm trong cùng một phép chiếu, ví dụ. good_poly=spTransform(spolygon, CRSobj=crs(raster_file))
dùng3386170

@ user3386170, hả? Không chắc chắn những gì bạn đang nhận được tại. Câu hỏi này xảy ra tại thời điểm gói raster chỉ thêm "chiếu trên bay" trong một số nếu chức năng của nó. Các chức năng này trước đây đã đưa ra một lỗi khi các phép chiếu không khớp, nhưng bài đăng này là từ năm 2014. Bạn cũng nên lưu ý luôn tải rgdal khi sử dụng sp :: spTransform () vì nó bổ sung thêm chức năng quan trọng, bổ sung cho hậu trường.
Jeffrey Evans

8

Những gì tôi thực sự tìm kiếm là mask()chức năng.

mask(raster, poly_shape)

hoạt động không có lỗi và trả về những gì tôi tìm kiếm.


2
Xác định lại dữ liệu của bạn để nó nằm trong cùng một không gian chiếu. Ngay cả trong ArcGIS, nơi trình chiếu bay là tự động, việc tiến hành phân tích theo các dự đoán khác nhau là rất tệ. Với dữ liệu trong các phép chiếu khác nhau, dữ liệu của bạn sẽ không chia sẻ mức độ phổ biến, đó là lỗi bạn đang nhận được.
Jeffrey Evans

Sử dụng projectExtent () để lấy mức độ cắt xén.
mdsumner

Để phù hợp với định dạng Hỏi & Đáp của trang web, phần này phải được đặt vào phần chính của câu hỏi dưới dạng chỉnh sửa / cập nhật (và sau đó thêm một nhận xét cho câu trả lời này trong phần "trả lời" để họ biết có nhiều điều cần xem xét hơn).
matt wilkie

@mattwilkie Xin lỗi vì không phù hợp với định dạng nhưng văn bản của tôi quá dài để đăng nó dưới dạng bình luận ở đây. @JeffreyEvans Tôi đã thử như sau: projection(raster) = projection(poly_shape)và cách khác projection(poly_shape) = projection(raster)nhưng cả hai cách đều tạo ra cùng một lỗi : Error in .local(x, y, ...) : extents do not overlap In addition: Warning message: In intersect(extent(x), extent(y)) : Objects do not overlap. Có cách nào để tôi có thể xem phép chiếu nào được sử dụng khi đang bay bằng cách sử dụng hàm extract () (vì cách đó rõ ràng hoạt động)?
Lars

1
Những gì tôi thực sự tìm kiếm là hàm mask (). mask(raster, poly_shape)hoạt động không có lỗi và trả về những gì tôi tìm kiếm.
Lars

-1

Mức độ hoạt động tốt ... Tôi nghĩ rằng Xmin, Xmax, Ymin và Ymax của bạn khác với X và Y của raster của bạn - tức là chúng được đặt đối diện

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.