Nhận các giá trị raster từ lớp phủ đa giác trong các giải pháp GIS mở


16

Tôi có hai lớp. Một lớp hình đa giác có nhiều gạch và lớp raster chứa lớp phủ mặt đất CORINE 2006 với nhiều loại trong một sơ đồ màu. Tôi muốn thu được cho mỗi đa giác trong shapelayer một tổng của mỗi loại che phủ đất của lớp raster.

Ví dụ: có một đa giác có id '2' và tôi muốn Thuộc tính như thế này cho đa giác này (tính bằng phần trăm hoặc mét vuông):

  • Đất canh tác: 15%
  • Rừng: 11%
  • Đường phố: 2% (... và một)

Tôi đã cố gắng làm điều đó trong cỏ, qgis (không có chức năng), saga (chỉ tính tổng mỗi giá trị) r (tổng cộng), nhưng tôi vẫn không tìm thấy giải pháp. Hầu hết các plugin (thống kê khu vực trong qgis) chỉ hỗ trợ các lớp raster 0-1. v.rast.stats cũng không giúp được gì. Tôi mở cho bất kỳ giải pháp tốt và thông minh!. Có lẽ tôi thậm chí đã sử dụng một cách tiếp cận sai hoặc phạm sai lầm.

Trong Arcgis nhiệm vụ này khá dễ dàng, nếu tôi nhớ đúng, nhưng tôi vẫn đang thiếu một giải pháp tốt cho người dùng linux hàng ngày của bạn.

Tôi đang chạy một hệ thống linux debian và đây là lý do tại sao tôi chỉ có thể sử dụng các chương trình cho HĐH này.


EDIT: Bởi vì câu hỏi này vẫn có rất nhiều lượt xem và khách truy cập: Tôi đã viết một plugin QGIS, cũng có khả năng tính toán vùng đất của lớp raster. Tôi chưa mã hóa lớp phủ đa giác, nhưng nó chắc chắn đã được lên kế hoạch. Tìm plugin tại đây và cài đặt thư viện Scipy trước.


Nó chắc chắn có thể được thực hiện trong R, nó chỉ là một câu hỏi để tìm ra chức năng nào. Bạn cần phủ chồng từng đa giác với raster, sau đó sử dụng bảng () để có được một bản tóm tắt các pixel "cắt cookie". Gói raster, rgdal và rgeos có thể hữu ích. Đọc "R Chế độ xem nhiệm vụ không gian" (google sẽ tìm thấy nó)
Spacesman

chắc chắn, nhưng làm thế nào tôi có thể nhận được một bản tóm tắt như vậy. Bạn có thể dễ dàng phủ lớp đa giác bằng lớp raster với! Is.na (lớp phủ (Poly, Raster)), nhưng với các lệnh như trích xuất, tôi chỉ có thể tính tổng diện tích trong pixel cắt cookie và không phải là các loại khác nhau của sơ đồ màu . Tôi không biết rgeos, nhưng tôi đã xem qua api và không tìm thấy chức năng nào để làm điều này.
Curlew

Kiểm tra r.univar trong GRASS, như xem grasswiki.osgeo.org/wiki/Zonal_statistic
markusN

Chào! Cảm ơn bạn đã tạo một plugin QGIS! Tôi chỉ muốn đề cập rằng plugin gặp sự cố (> 13000 đa giác). Sẽ thật tuyệt nếu nó chia nhỏ nhiệm vụ để không gặp sự cố. Và thật tuyệt vời khi có một tùy chọn để thêm tất cả các lớp cùng một lúc (ví dụ: bảng thuộc tính nhận được 2 trường mới LandcoverID và Landcover% trong đó cả hai đều giữ một danh sách CSV với các giá trị) :)
Mfbaer 18/03/17

@Joran: Nếu bạn nghĩ rằng đây là một lỗi, hãy đưa ra một báo cáo lỗi thay vì viết nó trong một bình luận ( github.com/Martin-Jung/LecoS/issues ). Hơn nữa, nó không phải là công việc bổ trợ để tuần tự hóa hoặc xử lý hàng loạt các nhiệm vụ của bạn. Chạy nó trên các tập con nhỏ hơn sau đó. 2) Chắc chắn. Sẽ có nhiều điều tuyệt vời để thêm. Mã là mã nguồn mở, Hãy thoải mái mã hóa nó :)
Curlew

Câu trả lời:


13

Sử dụng 'giải nén' để phủ các tính năng đa giác từ SpatialPolygonsDataFrame (có thể được đọc từ một shapefile bằng maptools: readShapeSpatial) trên raster, sau đó sử dụng 'bảng' để tóm tắt. Thí dụ:

> c=raster("cumbria.tif") # this is my CORINE land use raster
> summary(spd)
Object of class SpatialPolygonsDataFrame
[...]
> nrow(spd)  # how many polygons:
[1] 2
> ovR = extract(c,spd)
> str(ovR)
List of 2
 $ : num [1:542] 26 26 26 26 26 26 26 26 26 26 ...
 $ : num [1:958] 18 18 18 18 18 18 18 18 18 18 ...

Vì vậy, đa giác đầu tiên của tôi bao gồm 542 pixel và thứ hai của tôi bao gồm 958. Tôi có thể tóm tắt từng trong số chúng:

> lapply(ovR,table)
[[1]]

 26  27 
287 255 

[[2]]

  2  11  18 
 67  99 792 

Vì vậy, đa giác đầu tiên của tôi là 287 pixel của lớp 26 và 255 pixel của lớp 27. Đủ dễ dàng để tổng hợp và chia và nhân với 100 để có tỷ lệ phần trăm.


Tuyệt vời, cảm ơn rất nhiều cho những nỗ lực. Tôi sẽ thử điều đó và báo cáo lại :-)
Curlew

6

Tôi muốn báo cáo lại và tôi đây. Giải pháp của Spacesman hoạt động rất tốt và tôi đã có thể xuất tất cả thông tin cho mọi đa giác trong hình dạng của mình. Chỉ trong trường hợp ai đó có cùng một vấn đề, đây là cách tôi đi trước:

...
tab <- apply(ovR,table)
# Calculate percentage of landcover types for each polygon-field.
# landcover is a datastream with the names of every polygon
for(i in 1:length(tab)){
 s <- sum(tab[[i]])
 mat <- as.matrix(tab[[i]])
 landcover[i,paste("X",row.names(mat),sep="")] <- as.numeric(tab[[i]]/s)
}

3

nếu tôi hiểu chính xác những gì bạn muốn và giả sử bạn có lớp vectơ 'mypolygonlayer' và lớp raster 'corina' đã có trong cơ sở dữ liệu GRASS GIS của bạn:

Đầu tiên tôi sẽ chuyển đổi vector sang raster. Con mèo sẽ đảm bảo bạn sẽ có một mã định danh duy nhất cho mỗi đa giác. Nếu bạn có một cột với số nhận dạng số duy nhất, bạn có thể sử dụng cột đó để thay thế. Nhãn màu là tùy chọn:

v.to.rast input = mypolygonlayer layer = 1 output = mypolygons use = cat nhãncolumn = NameMappingUnit

Sau đó chạy r.stats để lấy số liệu thống kê của bạn:

r.stats -a -l input = mypolygons, corina separator =; đầu ra = / home / paulo / corinastats.csv

Bước cuối cùng là mở corinastats.csv, ví dụ: LibreOffice và tạo bảng xoay hoặc sử dụng R để tạo bảng chéo của bạn


3

Tôi biết bài đăng này khá cũ nhưng gần đây tôi rất thích thực hiện phân tích tương tự nhưng việc tải xuống các chương trình như R là một chút rắc rối trên máy tính làm việc của tôi và cần được phê duyệt. Sau nhiều giờ nghiên cứu một phương pháp mà tôi chỉ có thể sử dụng với QGis và Excel, tôi thấy phương pháp này hiệu quả nhất với tôi và muốn cung cấp nó cho mọi người trong cùng một tình huống.

  1. Clip đa giác thành lớp raster (Raster → trích xuất → clipper: input file = raster layer, chọn bạn tên và vị trí đầu ra, nhấp vào layer mask, chọn bạn đa giác → ok)

  2. Đa giác lớp clipper (Raster → Chuyển đổi → đa giác: tệp đầu vào = lớp clip của bạn, lưu đầu ra → ok)

  3. Tính toán số pixel (Nhấp vào tệp hình dạng bạn vừa tạo → máy tính trường mở: tick Tạo tạo trường mới và thêm tên trường, Hàm = hình học → diện tích → ok). Bây giờ bạn sẽ có một cột mới trong bảng thuộc tính hiển thị số lượng pixel.

  4. Lưu lớp đa giác (Nhấp chuột phải vào lớp đa giác, lưu dưới dạng: format = tệp DBF, lưu dưới dạng → ok)

  5. Tóm tắt số pixel cho mỗi môi trường sống (bắt đầu excel, mở tệp, nếu bạn không có tiêu đề, hãy thêm một pixel ngay bây giờ cho mỗi cột, nhấp vào một ô trống, vào tab DATA, hợp nhất, đảm bảo rằng đó là tổng, nhấp vào mũi tên màu đỏ bên cạnh Duyệt duyệt Sắp xếp và chọn cho bạn hai cột (bao gồm các tiêu đề), nhấp vào Thêm add và đánh dấu vào cả hàng đầu trên đỉnh Trò chơi và cột bên trái cột Hộp → ok)

  6. Nếu, giống như tôi, bạn có rất nhiều đa giác để phân tích và cần so sánh chúng trong cùng một bảng, bước này sẽ có ích. Trong sổ làm việc excel mới liệt kê các số môi trường sống của bạn trong cột A (đối với tôi từ 1 đến 48) và đặt hai cột bạn vừa hợp nhất vào cột B và C (môi trường sống ở B và số pixel trong C). Trong ô D1, viết công thức sau: = IFNA (INDEX (C: C; MATCH (A2; B: B; 0)); "") và kéo (hoặc nhấp đúp vào góc dưới bên phải) xuống giá trị cuối cùng của bạn (vì vậy nếu bạn có 48 môi trường sống xuống ô D48). Số lượng pixel hiện có trong các ô tương ứng với môi trường sống của bạn và bạn có thể lặp lại quy trình này cho tất cả các đa giác của mình.


2

Cách chuyển đổi dữ liệu CORINE thành tập dữ liệu đa giác vector bằng cách sử dụng QGIS ( Raster> Converter> Polygonize ) và sau đó sử dụng hàm Union ( Vector> Công cụ xử lý địa lý> Liên kết) để kết hợp với đa giác. Tập dữ liệu vectơ kết quả sẽ chứa các vùng của mỗi lớp CORINE trong mỗi đa giác.


cảm ơn vì lời đề nghị này Chưa nghĩ về liên minh vector. Có lẽ tôi sẽ thử điều đó, nếu xử lý R bằng cách nào đó thất bại.
Curlew

0

Quốc tế

Trong trung kế của QGIS, có một phiên bản khác của ZonalStats, nó được gọi là Thống kê Zonal.

Điều này thực hiện các chức năng bạn yêu cầu.

Về quy trình làm việc, tôi không rõ bạn có bao nhiêu raster bạn có hay họ chỉ là các ban nhạc trong một raster?


cảm ơn vì bình luận, nhưng Zonal Statistics chỉ ăn raster mà không có danh mục. Iam sử dụng QGIS Trunk 1.9
Curlew

0

Đối lập với hầu hết các câu trả lời ở trên, tôi cho rằng lựa chọn tốt hơn là rasterize đa giác của bạn và làm việc với hai bộ dữ liệu raster thay vì hai bộ dữ liệu đa giác. Điều này ít xử lý chuyên sâu hơn và do đó là giải pháp dễ thực hiện duy nhất để xử lý các trình quét lớn và các tệp đa giác lớn trong R.

Sau khi raster đa giác của bạn đến cùng một mức độ và độ phân giải của dữ liệu raster, bạn có thể lập bảng thống kê tóm tắt như được giải thích ở đây , phù hợp nếu raster của bạn phù hợp với bộ nhớ (các lớp raster nhỏ / trung bình) hoặc bạn có thể nhị phân từng loại với reclasschức năng và hơn là tính toán zonalthống kê cho mỗi lớp. Đây là một giải pháp kết hợp các thống kê rasterization và zonal vào một chức năng và hoạt động tốt với các bộ dữ liệu rất lớ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.