Câu trả lời:
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 pick
bắt đầu lập chỉ mục ở 1, không phải 0.
(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á.
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?
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 = NoData
vì 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 NoData
thà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 NoData
giá trị để mảnh đó có thể bị bỏ lại.
Con(IsNull(ras1), 0, ras2)
NoData
? Có phải chỉ để đảm bảo rằng chúng không được chọn khi chọn ngẫu nhiên?
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 :)