답변:
이와 같은 문제에 대해 Pick 이 만들어졌습니다. "con"의 "스위치"(또는 "케이스") 버전으로 생각하면 "if ... else"의 맵 대수 구현입니다.
예를 들어 3 개의 겹치는 래스터가있는 경우 (Python) 구문은 다음과 같습니다.
inPositionRaster = 1 + int(3 * CreateRandomRaster())
Pick(inPositionRaster, [inRas01, inRas02, inRas03])
pick
0이 아닌 1에서 색인 을 시작합니다.
(댓글 스레드 참조)
NoData 값을 처리하려면 먼저 ArcGIS의 NoData 처리를 해제해야합니다. 같은 99999과 같은 특별한 (그러나 유효) NODATA 대신에 값이 격자를 생성하여이 작업을 수행 (또는 무엇이든 :하지만 확인하는 값을 선택하는 큰 이 나중에 편리 할 것입니다 : 나타날 수있는 유효한 숫자보다가) . 다음 과 같이 IsNull 요청을 사용해야 합니다 .
p01 = Con(IsNull(inRas01), 99999, inRas01)
p02 = Con(IsNull(inRas02), 99999, inRas01)
p03 = Con(IsNull(inRas03), 99999, inRas01)
예를 들어,이 1 행 그리드의 경우를 고려하십시오 (NoData는 "*"로 표시됨).
inRas01: 1 2 19 4 * * * *
inRas02: 9 2 * * 13 14 * *
inRas03: 17 * 3 * 21 * 23 *
결과는 각 "*"대신 99999를 넣는 것입니다.
다음으로,이 모든 래스터는 누락 된 블록 (구멍)에 해당하는 NoData를 가진 평평한 나무 블록 배열로 상상해보십시오. 이 래스터를 세로로 쌓으면 블록이 그 아래 구멍에 빠집니다. NoData 값을 선택하지 않으려면 해당 동작이 필요합니다. 블록 스택에서 수직 간격을 원하지 않습니다. 각 타워의 블록 순서는 실제로 중요하지 않습니다. 이를 위해 데이터 순위를 매겨 각 타워를 얻을 수 있습니다 .
q01 = Rank(1, [p01, p02, p03])
q02 = Rank(2, [p01, p02, p03])
q03 = Rank(3, [p01, p02, p03])
이 예에서 우리는
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
q01은 각 위치에서 가장 낮은 값을 포함하고 q02는 두 번째로 가장 낮은 값을 포함합니다. NoData 코드는 유효한 모든 숫자가 수집 될 때까지 표시되지 않습니다. 있는 큰 유효한 숫자보다.
무작위 선택 중에 이러한 NoData 코드를 선택하지 않으려면 각 위치에 쌓인 블록 수를 알아야합니다. 이는 유효한 값의 수를 나타냅니다. 이를 처리하는 한 가지 방법 은 NoData 코드 수를 세고 총 선택 그리드 수에서 빼는 것입니다.
n0 = 3 - EqualToFrequency(99999, [q01, q02, q03])
이 결과
n0: 3 2 2 1 2 1 1 0
n = 0 인 경우를 처리하려면 (선택할 수있는 항목이 없음)이를 NoData로 설정하십시오.
n = SetNull(n0 == 0, n0)
지금
n: 3 2 2 1 2 1 1 *
이것은 또한 (임시) NoData 코드가 최종 계산에서 사라지는 것을 보장합니다. 1과 n 사이의 임의의 값을 생성하십시오.
inPositionRaster = 1 + int(n * CreateRandomRaster())
예를 들어이 래스터는
inPositionRaster: 3 2 1 1 2 1 1 *
모든 값은 1과 [n]의 해당 값 사이에 있습니다.
이전과 동일하게 값을 선택하십시오.
selection = Pick(inPositionRaster, [q01, q02, q03])
결과는
selection: 17 2 3 4 21 14 23 *
모든 것이 정상인지 확인하려면 NoData 코드 (이 예에서는 99999)가있는 모든 출력 셀을 선택하십시오.
이 실행 예제는 3 개의 그리드 만 사용하여 선택할 수 있지만 원하는 수의 그리드로 쉽게 일반화하는 방식으로 작성했습니다. 그리드가 많으면 반복 작업을 반복하기 위해 스크립트를 작성하는 것이 매우 중요합니다.
pick
inPositionRaster와 선택한 래스터가 모두 셀에 유효한 값을 가지고 있다면 그 결과는 확실하지 않습니다) 그 셀은 다른 래스터 중 무엇을 포함하는지에 관계없이 선택한 래스터의 값이어야합니다. 어떤 대체 행동을 생각하고 있습니까?
파이썬과 ArcGIS 10을 사용 하고 다음 구문을 가진 con 함수를 사용 합니다.
Con (in_conditional_raster, in_true_raster_or_constant, {in_false_raster_or_constant}, {where_clause})
여기서 랜덤 래스터의 값이 0.5보다 작은 지, raster1을 선택한 경우 raster2를 선택하는 것이 좋습니다. NoData
+ data = NoData
따라서 먼저 값 NoData
을 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
편집 : 그냥 NoData
조각을 생략 할 수 있도록 값을 추가하지 않는다는 것을 깨달았 습니다.
Con(IsNull(ras1), 0, ras2)
NoData
합니까? 무작위로 선택할 때 선택되지 않도록하는 것입니까?
나는 같은 범위와 셀 크기 의 무작위 래스터 ( help )를 만들 것 입니다. 그런 다음 CON ( help )을 사용하여 무작위 래스터의 셀 값이 <128 (임의의 래스터가 0-255 인 경우)이면 1 번째 래스터에서 값을 선택하도록 설정하십시오. 그렇지 않으면 2 차 래스터에서 값을 선택하십시오.
말이되는 희망 :)