여러 개의 겹치는 래스터에서 셀 값을 임의로 선택하여 래스터를 만드시겠습니까?


10

Spatial Analyst 확장과 함께 ArcGIS Desktop 10을 사용하고 있습니다.

겹치는 셀 값에서 항상 임의로 선택하여 여러 래스터를 하나로 결합하는 방법은 무엇입니까?

나는 이것을 더 잘 설명 할 수있는 이미지를 가지고있다 :

예

답변:


7

이와 같은 문제에 대해 Pick 이 만들어졌습니다. "con"의 "스위치"(또는 "케이스") 버전으로 생각하면 "if ... else"의 맵 대수 구현입니다.

예를 들어 3 개의 겹치는 래스터가있는 경우 (Python) 구문은 다음과 같습니다.

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

pick0이 아닌 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 개의 그리드 만 사용하여 선택할 수 있지만 원하는 수의 그리드로 쉽게 일반화하는 방식으로 작성했습니다. 그리드가 많으면 반복 작업을 반복하기 위해 스크립트를 작성하는 것이 매우 중요합니다.


계산에서 NoData 값을 무시할 수있는 방법을 알고 있습니까 (래스터 계산기 및 Python 사용)?
Sam

샘, "무시"어떻게, 정확히? 기본 동작은 하나 이상의 입력 래스터가 NoData 인 곳마다 NoData를 출력하는 것이라고 생각합니다 (그러나 pickinPositionRaster와 선택한 래스터가 모두 셀에 유효한 값을 가지고 있다면 그 결과는 확실하지 않습니다) 그 셀은 다른 래스터 중 무엇을 포함하는지에 관계없이 선택한 래스터의 값이어야합니다. 어떤 대체 행동을 생각하고 있습니까?
whuber

정수 값 중 하나만 선택하면됩니다. 세 개의 래스터가 있다고 가정 해 봅시다. 셀의 경우 값은 4,5, NoData입니다. Outraster가 해당 셀에 4 또는 5를 갖기를 원하지만 NoData는 절대 사용하지 않기를 바랍니다.
Sam

이 1 + Int (n * CreateRandomRaster ())가 작동하는 데 문제가 있습니다.
Sam

어떤 의미에서 "문제"? 구체적으로 작성하십시오!
whuber

4

파이썬과 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조각을 생략 할 수 있도록 값을 추가하지 않는다는 것을 깨달았 습니다.


저는 여전히 파이썬 기술을 연구하고 있습니다. 프로세스에서 NoData 값을 제외시키는 래스터 계산기에 이것을 입력하는 방법이 있습니까? 나는 10 개의 래스터를 가지고 있으며 일부는 다른 사람들이 값을 갖는 NoData를 가지고 있습니다.
Sam

래스터 계산기에서 이와 같은 것을 사용하여 조건을 만들 수 있다고 생각합니다.Con(IsNull(ras1), 0, ras2)
djq

불행히도 이것은 실제로 NoData 값을 배제하지는 않습니다. 단지 0으로 대체합니다. 경우에 따라 적절할 수도 있지만 여기서는 그렇지 않을 수도 있습니다!
whuber

흠, 좋은 점 @ whuber. 따라서 제외한다는 것은 무엇을 의미 NoData합니까? 무작위로 선택할 때 선택되지 않도록하는 것입니까?
djq

이것이 내가 해석 한 방법 (이 스레드에서 편집 된 답변 참조)이지만 여전히 좋은 질문입니다. 이 방식으로 ND 값을 무시하면 나머지 그리드가 더 큰 확률로 선택되어 바람직하지 않은 부작용이 될 수 있습니다. 그것은 모두 계산의 목적에 달려 있습니다.
whuber

1

나는 같은 범위와 셀 크기 의 무작위 래스터 ( help )를 만들 것 입니다. 그런 다음 CON ( help )을 사용하여 무작위 래스터의 셀 값이 <128 (임의의 래스터가 0-255 인 경우)이면 1 번째 래스터에서 값을 선택하도록 설정하십시오. 그렇지 않으면 2 차 래스터에서 값을 선택하십시오.

말이되는 희망 :)


값이있는 래스터에서만 선택하는 방법을 알고 있습니까? 예를 들어 내 그림에는 NoData와 겹치는 4 개의 2와 3이 있습니다. NoData가 아닌 셀에 값이있는 래스터에서만 선택하고 싶습니다.
Sam

응답하지 않아서 죄송합니다. 여전히 NoData 문제로 어려움을 겪고 있습니까?
jareks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.