ArcGIS Spatial Analyst를 사용하여 래스터 세트에 대한 연속 픽셀 값을 계산합니까?


23

Spatial Analyst와 함께 ArcGIS 10을 사용하고 있습니다.

각 셀마다 1 또는 0을 포함하는 래스터 세트 (총 8 개)가 있습니다. 각 래스터는 서로 다른 수년간의 데이터를 나타냅니다. 논쟁은 1 년에서 8 년 사이에 이루어졌다.

모든 래스터를 함께 추가하여 0에서 8 사이의 값을 가진 최종 그리드를 제공 할 수 있습니다. 8은 셀이 래스터 세트 (모든 연도)에 대해 지속적으로 1임을 나타냅니다.

각 셀에 대해 가장 긴 연속 1 수를 찾고 싶습니다.

예를 들어, 총 그리드는 단일 셀에 대해 5와 같은 값을 기록 할 수 있지만 8 그리드에서 셀의 최대 연속 수는 1과 3입니다. 그런 다음 0과 1 사이에서 진동하기 시작했습니다.

래스터 처리 기술이 벡터 처리 기술만큼 뜨겁지 않고 ESRI 도움말 파일을 잘 보았지만 선반 지리 처리 도구를 사용하여 어떻게이 작업을 수행 할 수 있는지 알 수 없습니까?

어떤 아이디어?


1
그것은 실제로 매우 멋진 분석입니다. 평소와 같이 수행하려는 작업을 수행하는 방법은 여러 가지가 있습니다. 그래도 모든 조합을 반복하기 위해 프로그래밍을해야한다고 생각합니다.
MLowry

1
일반적인 의견 (@MLowry의이 발언에서 영감을 얻음) : 흥미로운 것처럼 보이거나 명확하게 표현 될 때마다 질문 을 투표 하십시오 . 좋은 질문은 우리 사이트의 모든 것을 이끌어줍니다. 요청하는 사람들에게 보상하기 위해 할 수있는 일을합시다!
whuber

답변:


14

이 작업은 로컬 작업이므로 단일 셀에 대해 수행하는 방법을 알아 봅니다. Map Algebra가 나머지를 처리합니다.

먼저 래스터 의 순서 는 중요합니다. 따라서 셀 합계와 같은 단일 샷 셀 통계는 그렇지 않습니다.

주어진 셀에서 01110101과 같은 시퀀스를 만나면 처음부터 끝까지 처리하고

  1. 카운트를 0으로 시작하십시오.

  2. 1이 발생할 때마다 개수를 증가시킵니다.

  3. 마지막 카운트를 저장 한 후 0이 발생할 때마다 카운트를 재설정하십시오 .

  4. 마지막으로, 최대 저장된 카운트 (최종 카운트 포함)를 가져옵니다.

1 단계는 상수 제로 그리드로 구현됩니다. 2 단계와 3 단계는 발생하는 항목에 따라 다릅니다 . 따라서 조건부 작업입니다. 4 단계는 지역 최대 값입니다. 우리는 이것을 다음과 같이 조금 더 공식적으로 코딩 할 것입니다.

count = 0
result = 0
For each value:
    If (value==1):
        count=count+1
    else
        result = max(result, count)
        count=0
result = max(result, count)

그리드가 많을 때 파이썬 스크립트를 사용하는 것이 가장 좋지만 8을 사용하면 루프를 풀고 손으로 단계를 작성하는 것이 번거롭지 않습니다. 이것은 약간의 문제를 보여줍니다. 이것은 result=max(longest,count)래스터 작업으로 코딩하기 어려운 일종의 "부작용"입니다. (하지만 아래의 두 번째 솔루션에 표시된 것처럼 수행 할 수 있습니다.) 각 단계마다 추가 계산을 추가하기 때문에 비효율적입니다. 따라서 max작업을 끝까지 연기하기 위해 접근 방식을 약간 수정합니다 . 각 단계마다 별도의 카운트를 저장해야합니다 .

이 과정을 진행하면서 첫 번째 단계에 대한 바로 가기도 발견했습니다. 이 방법은 약간 길고 RAM을 많이 사용하지만 간단하고 빠르게 실행되는 단계를 포함하는 다음 솔루션으로 이어집니다.

result1 = "grid1"
result2 = con("grid2"==1, "result1"+1, 0)
result3 = con("grid3"==1, "result2"+1, 0)
result4 = con("grid4"==1, "result3"+1, 0)
result5 = con("grid5"==1, "result4"+1, 0)
result6 = con("grid6"==1, "result5"+1, 0)
result7 = con("grid7"==1, "result6"+1, 0)
result8 = con("grid8"==1, "result7"+1, 0)
CellStatistics(["result1", "result2", "result3", "result4", "result5", "result6", "result7" "result8"], "max")

실제 구문은 사용중인 ArcMap 버전에 따라 다릅니다. (예를 들어 CellStatistics버전 10이 처음이지만 로컬 최대 작업을 항상 사용할 수 있다고 생각합니다.)

입력 01110101이있는 예에서 "result *"그리드의 시퀀스에는 값 0, 1, 2, 3, 0, 1, 0, 1이 포함되므로 끝에는 CellStatistics가장 긴 문자열의 길이 인 3이 리턴됩니다. 1입니다.

RAM이 부족한 경우 실행 시간을 약 2 배로 늘리면서 중간 결과를 재사용하도록 솔루션을 수정할 수 있습니다.

result = "grid1"
temp = con("grid2"==1, "result"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
temp = con("grid3"==1, "temp"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
...
temp = con("grid8"==1, "temp"+1, 0)
CellStatistics[["temp", "result"], "max"]

입력 01110101이있는 예에서 ( "temp", "result") 값은 첫 번째 라인 이후 및 ( "Con", "CellStatistics") 각 조작 후에 (NoData, 0)이됩니다. 값은 (1 , 1), (2, 2), (3, 3), (0, 3), (1, 3), (0, 3), (1, 3). 다시 한번 최종 값은 3입니다.

두 솔루션 중 하나의 Map Algebra 표현식 패턴은 각 반복에 따라 색인을 변경하여 스크립트에서 알고리즘을 루프로 코딩하는 방법을 나타냅니다.


형식 코드 블록에 오타가있을 수 있습니다. count = count = 1은 count = count + 1
이어야합니다.

1
@ ML 감사합니다 (좋은 눈!) : 이제 수정되었습니다. 의사 코드를 절대적으로 정확하게 만드는 것은 어렵습니다. 인간 검토는 오류를 찾는 데있어 실질적인 자산입니다. 또한 ArcGIS에서 솔루션을 테스트하지는 않았지만 R에서 첫 번째 솔루션을 구현했기 때문에 접근 방식이 올바른지 확신 할 수 있습니다.
whuber

1
"whuber"또 다시 당신은 아는 사람입니다! 당신이 버스로 도망 치면 하나님은 우리의 나머지를 도와주세요! 귀하의 초기 파이썬 접근 방식은 내가 생각한 방향이지만 래스터를 사용하면 종종 입증 된 모든 것을 할 수 있다는 것을 알고 있습니다. 영국에서 자신을 발견하면 최고의 실내 온도 플랫 맥주 한 잔을 구입하는 것이 영광입니다! :)
Hornbydd

고마워요 Duncan : Andy Harfoot의 탁월한 솔루션을 확인하십시오!
whuber

14

이에 대해 채팅하고 입력 그리드를 이진 스트림으로 처리하여 문제에 접근 할 수 있는지 궁금합니다. 이렇게하면 시퀀스에 대해 고유 한 요약 정수 (예 : 01110101 = 117)를 제공하기 위해 이들을 조합 할 수 있습니다. 그런 다음이 값을 재 분류하여 최대 연속 1 수를 제공 할 수 있습니다.

다음은 8 개의 그리드를 결합하는 한 가지 방법을 보여주는 예입니다.

2*(2*(2*(2*(2*(2*(2*"g8" + "g7") + "g6") + "g5") + "g4") + "g3") + "g2") + "g1"

이 단계에서 비트 단위 작업을 수행 할 수도 있습니다. 또는 결합 후 필드 계산을 사용할 수 있습니다 . (필드 계산에는 이전 계산과 비슷한식이 있습니다.)

재 분류 표 위해서는 00000000B = 0 11111111B = 255 사이의 모든 값에 대한 최대 런 길이를 제공 할 수 있으며, 여기에 그들이있다 :

0, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8

이 방법은 ArcGIS에서 약 20 개의 그리드로 제한됩니다. 이보다 많은 것을 사용하면 다루기 어려운 속성 테이블을 만들 수 있습니다. ( Combine특히 20 그리드로 제한됩니다.)


거대한 +1 : 이것은 매우 좋은 생각입니다. (단 하나의 제한은 31 개 이상의 그리드가 관련 될 때 사용할 비트가 부족하다는 것입니다.) 나는 다른 사람들이 구현하기가 얼마나 쉬운 지 알 수 있도록 아이디어를 조금씩 구체화 할 자유를 얻었습니다.
whuber

3

값을 0과 1에서 2의 거듭 제곱 (1,2,4,8,16,32)의 값으로 변경한다고 생각 했습니까? 8 개의 그리드를 결합하면 각 셀에 대해 고유 한 값을 얻게되며 연속적인 정보를 제공합니다 (예 : 3의 값은 1 년과 2 년을 의미하며 54의 값은 6 ~ 8 년입니다).

그냥 생각


이것은 @Andy Harfoot이 몇 시간 일찍 제안한 것입니다. Ryan. :-)
whuber

고마워 미안 휴가 중에 휴대 전화에서이 내용을 읽습니다.
Ryan Garnett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.