Không thể tính tổng các raster vì các pixel nốt


11

Tôi có một bộ raster (.vrt) với dữ liệu độ ẩm đất hàng ngày. Tôi muốn tính tổng số pixel của tất cả các trình quét để có số đo theo tháng. Tuy nhiên, toàn bộ thế giới không được bảo hiểm mỗi ngày, điều này dẫn đến các giá trị nốt ở những nơi mà các biện pháp tồn tại cho những ngày khác.

Những gì tôi muốn làm, là tổng các giá trị của mỗi raster. Tuy nhiên, dường như mỗi khi một pixel nốt được tính tổng, pixel kết quả được phân loại trực tiếp thành nốt. Tôi muốn có điều ngược lại: bỏ qua tất cả các giá trị nốt và tóm tắt phần còn lại.

Tôi nghĩ ra 2 cách giải quyết vấn đề:

  1. tổng hợp các raster bỏ qua các giá trị nốt
  2. chuyển đổi các pixel nốt thành giá trị 0, sau đó tổng hợp tất cả các trình quét

nhập mô tả hình ảnh ở đây

Thật không may, tôi không thể tìm thấy bất kỳ công cụ để làm điều này.

Ai giúp tôi với?


Tôi tự hỏi làm thế nào kết quả có thể giải thích được: sau tất cả, các khoản tiền sẽ không bao gồm các giá trị cho những ngày bị thiếu, cho thấy chúng sẽ bị sai lệch thấp bởi số lượng khác nhau tùy thuộc vào lượng dữ liệu bị thiếu. Nếu có bất kỳ số tiền đáng kể của thiếu dữ liệu, sau đó bạn nên xem xét thay imputing hoặc dự đoán các giá trị tại các tế bào bị mất và sau đó thực hiện tổng.
whuber

1
Cảm ơn vì nhận xét này. Tôi đã hỏi những người quản lý dữ liệu và họ nói rằng họ đã tính giá trị trung bình bằng cách tính tổng tất cả dữ liệu có sẵn, sau đó chia cho số ngày trong tháng khi các quan sát có sẵn trên pixel đó.
Damien

2
Điều đó giống hệt với trung bình cục bộ của một nhóm các trình quét, trong đó GIS được hướng dẫn chỉ cần bỏ qua tất cả các ô NoData, điều này gợi ý một cách khác để bạn đi. Nhân tiện, quy trình này vẫn có khả năng bị sai lệch khi các quan sát bị thiếu có tương quan với các giá trị. Chẳng hạn, khi bạn bị thiếu dữ liệu do mây che phủ, điều hợp lý là vào những ngày đó độ ẩm của đất có thể cao hơn (trung bình) so với bình thường.
whuber

1
Được rồi, tôi vừa kiểm tra công cụ thống kê tế bào với 'bỏ qua gật đầu' và nó thực hiện chính xác những gì tôi muốn. Tôi nhận thức được những thiếu sót của phương pháp đó. Tuy nhiên, công việc của tôi ở quy mô khá lớn, cả về không gian và thời gian, vì vậy tôi cho rằng những thành kiến ​​như vậy sẽ ít quan trọng hơn. Dù sao, tôi thực sự không có quá nhiều sự lựa chọn về dữ liệu.
Damien

Thang đo sẽ không liên quan đến số lượng sai lệch. Tầm quan trọng của sự thiên vị phụ thuộc vào kích thước của nó và độ nhạy của ứng dụng của bạn với nó. Mặc dù bạn có thể không có thể làm bất cứ điều gì về dữ liệu, bạn làm có thể kiểm soát các thủ tục để phân tích chúng. Có rất nhiều cách để cải thiện điều này. Trong số các lựa chọn của bạn là nội suy theo thời gian và hồi quy với các đồng biến có thể tương quan với độ ẩm của đất và có sẵn ngay cả vào những ngày bị thiếu. (Có cả một nhánh thống kê dành cho việc "bỏ qua" các giá trị còn thiếu.)
whuber

Câu trả lời:


1

Nếu bạn có quyền truy cập vào ArcGIS thì công cụ Thống kê di động có tùy chọn bỏ qua nốt mà bạn tính tổng \ mean \ min \ max các trình quét của bạn.


Nếu bạn sửa đổi câu trả lời này để thay thế "tổng" bằng "trung bình", thì nó sẽ đúng: xem chủ đề bình luận cho câu hỏi cho lý do.
whuber

Tổng kết chỉ là một phần của vấn đề của tôi vì tôi muốn nhận được giá trị trung bình. Tôi vừa mới kiểm tra, và công cụ thống kê tế bào cũng là cách dễ nhất để tổng hợp các trình quét không quan tâm đến các pixel nốt.
Damien

11

Đầu tiên, bạn có thể sử dụng gdal_calc.py để thay đổi tất cả -9999 thành 0 và đặt giá trị NoData thành 0.

Ví dụ:

gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --calc="A+9999*(A==-9999)" --NoDataValue=0

Sau đó, bạn có thể bỏ qua giá trị NoData bằng cách sử dụng gdal_translate với tùy chọn -a_nodata theo sau là không có .

giá trị -a_nodata :

Gán một giá trị nốt được chỉ định cho các dải đầu ra. Bắt đầu với GDAL 1.8.0, có thể được đặt thành không để tránh đặt giá trị nốt cho tệp đầu ra nếu có tồn tại cho tệp nguồn

Thí dụ:

gdal_translate -a_nodata none input_with_NoData.tif output_without_NoData.tif

Cảm ơn vì tiền hỗ trợ. Tôi đã chơi một chút với tham số -a_nodata và tôi quản lý để có giá trị -9999 thay vì NULL. Tuy nhiên, tôi vẫn cần thay đổi tất cả -9999 pixel thành 0
Damien

1
Bạn có thể sử dụng gdal_calc.py để thay đổi tất cả -9999 thành 0 trước khi áp dụng gdal_translate -a_nodata none .... Ví dụ: gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --type=Int16 --calc="A+9999*(A==-9999)" --NoDataValue=0
Antonio Falciano

Tôi đã thử một số lệnh, nhưng tôi thực sự nghĩ rằng tôi có vấn đề với gdal_calc.py. Chẳng hạn, tôi chỉ cố gắng thêm 1 vào toàn bộ raster ( i.imgur.com/WiZG7MC.png ) và tôi đã nhận được lỗi Maxrepeat này. Tôi không hiểu, tôi đã chạy lệnh trực tiếp từ shell OSGeo và mô-đun này dường như được cài đặt chính xác vì nó xuất hiện trong danh sách khi tôi mở shell ( i.imgur.com/fgtMZQZ.png ). Là cài đặt của tôi bị hỏng?
Damien

Có vẻ như là một vấn đề regex ... Hãy thử thay đổi thư mục làm việc của bạn bằng cách sử dụng cdlệnh và thử lại để chỉ có -A test.tif.
Antonio Falciano

1
Nó hoạt động với tôi, nhưng tôi đã cài đặt tất cả những thứ này thông qua trình cài đặt OSGeo4W . Thay vào đó, tôi thấy rằng bạn đã cài đặt QGIS thông qua trình cài đặt độc lập. Vì vậy, hãy cố gắng làm mới / cập nhật thiết lập của bạn.
Antonio Falciano

5

Trong R:

library(raster)
s <- stack('file1', 'file2', ...)
ss <- sum(s, na.rm=TRUE)

Bạn có thể thêm một lời giải thích cho mã này (nếu bạn đã viết nó) hoặc một liên kết đến nơi bạn tìm thấy nó, với một bản tóm tắt ngắn từ trang web?
Paul

1
Đầu tiên ở trên tải gói raster, sau đó tạo một "ngăn xếp" (một mảng 3 chiều của các tệp raster có cùng độ phân giải và độ phân giải, trong đó mỗi tệp trở thành một lát của ngăn xếp này) bao gồm các tệp được chỉ định bởi các tên tệp được phân tách bằng dấu phẩy . Dòng cuối cùng thực hiện tổng các ô thông minh trên tất cả các lát của ngăn xếp s, với đối số na.rm=TRUEdẫn đến NAcác giá trị bị bỏ qua. Đối tượng đầu ra sslà một rasterđối tượng có thể được xuất với writeRaster(xem ?writeRaster). (@RobertH là người tạo ra rastergói R. )
jbaums

1

Công cụ có điều kiện trong Phân tích không gian là một cách dễ dàng để chuyển đổi giá trị null thành số không. Sau đó, các khoản tiền nên được một snap.


Cảm ơn bạn đã trả lời của bạn. Tôi đã theo dõi bài đăng này: support.esri.com/fr/ledgeledridease/techarticles/detail/34932 và có thể chuyển đổi tất cả các pixel null thành 0. Tuy nhiên, tôi muốn có thể thực hiện thao tác này cho tất cả các trình quét trong một danh mục. 'Phân loại lại các giá trị lưới' trong QGIS dường như có thể làm điều này, nhưng tất cả tôi không biết nó hoạt động như thế nào. Tôi chọn phương thức "Bảng đơn giản" và yêu cầu nó đặt null thành 0 và không thay đổi các giá trị khác, nhưng raster kết quả nằm trong khoảng từ -0,99 đến 0,08 trong khi ban đầu kéo dài từ 428 đến 3491
Damien

Bạn có thể đăng một đoạn trích của raster ban đầu của bạn ở đâu đó, để chúng tôi có thể có một cái nhìn?
til_b

2
Nếu bạn nhấp chuột phải vào công cụ, bạn có thể chạy một quy trình hàng loạt trên bao nhiêu tệp tùy thích, tức là toàn bộ thư mục.
brock

Cảm ơn câu trả lời của bạn. Tuy nhiên, tôi có thể chuyển đổi tất cả các NULL thành 0 cho một tệp bằng cách sử dụng 'phân tích không gian / đại số bản đồ / máy tính Raster'. Nếu tôi bấm đúng vào công cụ này, tôi có thể bó một thư mục, nhưng cú pháp để tự động tính đến từng tệp là gì? ( i.imgur.com/aYaUCzz.png )
Damien

Tôi đã xem qua công cụ 'phân tích không gian / Reclass / Reclassify' và nó thực hiện chính xác những gì tôi muốn. Tôi quản lý để sử dụng cửa sổ lô để xử lý nhiều tệp cùng một lúc. Tôi có một vấn đề cuối cùng: nếu tôi nhấp chuột phải / điền vào 'raster đầu ra', nó sẽ sao chép cùng một tệp đầu ra cho tất cả các raster đầu vào. Làm thế nào tôi có thể làm để làm cho nó tạo ra một đầu ra khác nhau cho mỗi đầu vào? ( i.imgur.com/jzTI2x9.png )
Damien

1

Tôi đã có cùng một vấn đề trước đây và tôi đã giải quyết nó.

Cũng giống như một lưu ý về việc hiển thị các giá trị nốt trong QGIS: các giá trị nốt luôn được hiển thị dưới dạng giá trị nốt trong cửa sổ bản đồ và khi sử dụng công cụ "thông tin đối tượng", bất kể chúng có thực sự có giá trị -9999, 0, NULL, v.v. Vì vậy, sau khi phân loại lại các giá trị gật đầu thành 0, nếu bạn đi vào cài đặt lớp, bạn sẽ tìm thấy trong Siêu dữ liệu mà gật đầu có giá trị 0.

Cuối cùng tôi đã tìm thấy công cụ hoàn hảo cho nhiệm vụ, GRASS r.series. Với cài đặt "hoạt động tổng hợp" "tối đa" và không được chọn "tuyên truyền NULL", công cụ sẽ tạo một Lớp phù hợp với yêu cầu của bạn.


0

Tôi nhớ có vấn đề này một thời gian trở lại. Như một giải pháp tôi nghĩ rằng tôi đã thực hiện +1 cho tất cả các ô trong raster, cộng các raster lại với nhau, sau đó thực hiện phép trừ cuối cùng (tuy nhiên có nhiều +1 bạn đã thêm). Nó khá thô nhưng nếu nó hoàn thành công việc ...!

Hoặc, sử dụng 'Phân loại lại các giá trị lưới' trong hộp công cụ Xử lý trong QGIS để chuyển đổi giá trị null của bạn thành 0.


Xin chào, tôi đã thử nhiều cách sử dụng công cụ 'phân loại lại các giá trị lưới' nhưng không thành công. Tôi đã bắt đầu trên một raster nơi tôi đã chuyển đổi tất cả các pixel NULL thành -9999. Tôi đã cố gắng phân loại lại bằng cách sử dụng phương thức [0] đơn và đặt 'giá trị cũ = -9999', 'giá trị mới = 0,0', 'toán tử: [0] =', nhưng tất cả những gì tôi nhận được là một raster đầy 'nan' điểm ảnh. Tôi đang làm gì sai?
Damien
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.