Tạo raster bằng cách chọn ngẫu nhiên giá trị ô từ nhiều raster chồng chéo?


10

Tôi đang sử dụng ArcGIS Desktop 10 với phần mở rộng Spatial Analyst.

Làm cách nào để kết hợp nhiều trình quét thành một, luôn luôn chọn ngẫu nhiên từ các giá trị của các ô chồng lấp?

Tôi có một hình ảnh có thể giải thích điều này tốt hơn:

thí dụ

Câu trả lời:


7

Pick được tạo ra cho các vấn đề như thế này. Hãy nghĩ về nó như là phiên bản "chuyển đổi" (hoặc "trường hợp") của "con", đây là cách thực hiện đại số bản đồ của "nếu ... khác."

Ví dụ, nếu có 3 trình quét chồng chéo, cú pháp (Python) sẽ giống như

inPositionRaster = 1 + int(3 * CreateRandomRaster())
Pick(inPositionRaster, [inRas01, inRas02, inRas03])

Lưu ý rằng pickbắt đầu lập chỉ mục ở 1, không phải 0.


Biên tập

(xem chủ đề bình luận)

Để đối phó với các giá trị NoData, trước tiên, bạn cần tắt xử lý NoData của ArcGIS. Thực hiện việc này bằng cách tạo các lưới có giá trị đặc biệt (nhưng hợp lệ) thay cho NoData, chẳng hạn như 99999 (hoặc bất cứ điều gì: nhưng đảm bảo chọn một giá trị lớn hơn bất kỳ số hợp lệ nào có thể xuất hiện: điều này sẽ có ích sau này) . Điều này yêu cầu sử dụng yêu cầu IsNull, như trong

p01 = Con(IsNull(inRas01), 99999, inRas01)
p02 = Con(IsNull(inRas02), 99999, inRas01)
p03 = Con(IsNull(inRas03), 99999, inRas01)

Ví dụ, hãy xem xét trường hợp của các lưới một hàng này (NoData được hiển thị là "*"):

inRas01:  1  2 19  4  *  *  *  *
inRas02:  9  2  *  * 13 14  *  *
inRas03: 17  *  3  * 21  * 23  *

Kết quả là đặt 99999 thay cho mỗi "*".

Tiếp theo, hãy tưởng tượng tất cả các raster này là các mảng phẳng của các khối gỗ có NoData tương ứng với các khối (lỗ) bị thiếu. Khi bạn xếp theo chiều dọc các raster này, các khối sẽ rơi vào bất kỳ lỗ nào bên dưới chúng. Chúng tôi cần hành vi đó để tránh chọn các giá trị NoData: chúng tôi không muốn có bất kỳ khoảng trống dọc nào trong ngăn xếp các khối. Thứ tự của các khối trong mỗi tháp không thực sự quan trọng. Để kết thúc này, chúng ta có thể có được mỗi tháp bằng cách xếp hạng dữ liệu :

q01 = Rank(1, [p01, p02, p03])
q02 = Rank(2, [p01, p02, p03])
q03 = Rank(3, [p01, p02, p03])

Trong ví dụ này, chúng tôi có được

q01:      1     2     3     4    13    14    23 99999
q02:      9     2    19 99999    21 99999 99999 99999
q03:     17 99999 99999 99999 99999 99999 99999 99999

Lưu ý rằng các thứ hạng từ thấp nhất đến cao nhất, do đó q01 chứa các giá trị thấp nhất tại mỗi vị trí, q02 chứa giá trị thấp thứ hai, v.v. Các mã NoData không bắt đầu hiển thị cho đến khi tất cả các số hợp lệ được thu thập, bởi vì các mã đó là lớn hơn bất kỳ con số hợp lệ.

Để tránh chọn các mã NoData này trong lựa chọn ngẫu nhiên, bạn cần biết có bao nhiêu khối được xếp chồng lên nhau tại mỗi vị trí: điều này cho chúng tôi biết có bao nhiêu giá trị hợp lệ xảy ra. Một cách để xử lý việc này là đếm số lượng mã NoData và trừ đi tổng số lưới lựa chọn:

n0 = 3 - EqualToFrequency(99999, [q01, q02, q03])

Sản lượng này

n0:       3 2 2 1 2 1 1 0

Để xử lý các trường hợp n = 0 (vì vậy không có gì để chọn), đặt chúng thành NoData:

n = SetNull(n0 == 0, n0)

Hiện nay

n:        3 2 2 1 2 1 1 *

Điều này cũng sẽ đảm bảo rằng mã NoData (tạm thời) của bạn biến mất trong phép tính cuối cùng. Tạo các giá trị ngẫu nhiên trong khoảng từ 1 đến n:

inPositionRaster = 1 + int(n * CreateRandomRaster())

Ví dụ, raster này có thể trông giống như

inPositionRaster: 3 2 1 1 2 1 1 *

Tất cả các giá trị của nó nằm giữa 1 và giá trị tương ứng trong [n].

Chọn các giá trị chính xác như trước:

selection = Pick(inPositionRaster, [q01, q02, q03])

Điều này sẽ dẫn đến

selection:       17  2  3  4 21 14 23  *

Để kiểm tra xem tất cả có ổn không, hãy thử chọn tất cả các ô đầu ra có mã NoData (99999 trong ví dụ này): không nên có bất kỳ ô nào.

Mặc dù ví dụ chạy này chỉ sử dụng ba lưới để chọn, tôi đã viết nó theo cách khái quát hóa dễ dàng cho bất kỳ số lưới nào. Với rất nhiều lưới, viết một kịch bản (để lặp lại các hoạt động lặp đi lặp lại) sẽ là vô giá.


Bạn có biết làm thế nào tôi có thể bỏ qua các giá trị NoData từ các tính toán (với Máy tính Raster và Python) không?
Sam

Sam, "Bỏ qua" thế nào, chính xác? Tôi tin rằng hành vi mặc định là xuất NoData ở bất cứ nơi nào một hoặc nhiều trình quét đầu vào là NoData (nhưng tôi không hoàn toàn chắc chắn về điều đó trong trường hợp pick: nếu inPocationRaster và raster được chọn đều có giá trị hợp lệ trong một ô, thì kết quả có thể hợp lý cho ô đó phải là giá trị của raster đã chọn, bất kể những raster nào khác có thể chứa). Những hành vi thay thế bạn đang nghĩ đến?
whuber

Tôi cần nó để chỉ chọn từ các giá trị toàn bộ số. Hãy nói rằng tôi có ba raster. Đối với một ô, các giá trị của chúng như sau: 4,5, NoData. Tôi muốn outraster có 4 hoặc 5 trong ô đó nhưng không bao giờ là NoData.
Sam

Tôi gặp sự cố khi điều này 1 + Int (n * CreateRandomRaster ()) hoạt động.
Sam

"Rắc rối" theo nghĩa nào? Hãy cụ thể!
whuber

4

Sử dụng python và ArcGIS 10 và sử dụng hàm con có cú pháp sau:

Con (in_conditional_raster, in_true_raster_or_constant, {in_false_raster_or_constant}, {where_clause})

Ý tưởng ở đây là để xem giá trị trong raster ngẫu nhiên nhỏ hơn 0,5, nếu nó được chọn raster1, nếu không thì chọn raster2. NoData+ data = NoDatavì vậy trước tiên hãy đặt các giá trị này phân loại lại bất kỳ giá trị nào NoDatathành 0:

import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"

ras1_NoNull = Con(IsNull("elevation1"),0, "elevation1")  # remove NoData
ras2_NoNull = Con(IsNull("elevation2"),0, "elevation2")  # remove NoData
randRaster = CreateRandomRaster(100, 2, Extent(0, 0, 150, 150)) # raster generated between 0 and 1; 100 is seed value

outCon = Con(randRaster < 0.5, ras1_NoNull,  ras2_NoNull)  

outCon.save("C:/outcon.img")   # save raster

EDIT: Chỉ cần nhận ra rằng bạn không thêm các NoDatagiá trị để mảnh đó có thể bị bỏ lại.


Tôi vẫn đang làm việc với các kỹ năng Python của mình. Có cách nào để nhập cái này vào Máy tính Raster cũng sẽ loại trừ các giá trị NoData khỏi quy trình không? Tôi có 10 raster và một số có NoData nơi những người khác có giá trị.
Sam

Tôi nghĩ bạn có thể tạo điều kiện bằng cách sử dụng một cái gì đó như thế này trong máy tính rasterCon(IsNull(ras1), 0, ras2)
djq

Thật không may, điều này thực sự không loại trừ các giá trị NoData: nó chỉ thay thế chúng bằng các số không. Trong một số trường hợp có thể phù hợp, nhưng có lẽ không phải ở đây!
whuber

hmm, điểm tốt @whuber. Vì vậy, nó có nghĩa là gì để loại trừ NoData? Có phải chỉ để đảm bảo rằng chúng không được chọn khi chọn ngẫu nhiên?
djq

Đó là cách tôi đã giải thích nó (xem câu trả lời được chỉnh sửa của tôi trong chủ đề này), nhưng nó vẫn là một câu hỏi hay. Bỏ qua các giá trị ND theo cách này làm cho các lưới còn lại được chọn với xác suất lớn hơn, đây có thể là một tác dụng phụ không mong muốn. Tất cả phụ thuộc vào mục đích tính toán.
whuber

1

Tôi sẽ chỉ tạo một raster ngẫu nhiên ( trợ giúp ) có cùng mức độ và kích thước ô. Sau đó, sử dụng CON ( trợ giúp ) đặt nó để chọn giá trị từ raster thứ nhất nếu ô từ raster ngẫu nhiên có giá trị <128 (nếu raster ngẫu nhiên sẽ là 0 - 255) nếu không thì chọn giá trị từ raster thứ 2.

Hy vọng điều đó có ý nghĩa :)


Bạn có biết làm thế nào để chỉ chọn từ các raster có giá trị? Chẳng hạn, trong hình của tôi có bốn 2 và hai 3 trùng với NoData. Tôi muốn chắc chắn rằng nó chỉ chọn từ các raster có giá trị tại một ô chứ không phải NoData.
Sam

Xin lỗi vì không trả lời. Bạn vẫn đang vật lộn với vấn đề NoData?
jareks
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.