QGIS Modeler if / else 조건, Modeler 용 사용자 정의 스크립트


10

내 모델 내에서 간단한 if / else 함수를 만들고 싶습니다. 가능한지 여부를 알고 싶었습니다.

여기에 이미지 설명을 입력하십시오

'세그먼트 레이어'에 대한 입력을 선택하면 '세그먼트 (평균 이동)'을 실행할 필요가 없으며 다음 프로세스의 입력으로 '세그먼트 레이어'를 대신 사용하기를 원합니다.

'Segmentation (meanshift)'의 입력은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

Joseph의 답변을 구현하려고 시도한 후 업데이트 : 다음 코드를 사용 하고이 오류가 발생했습니다. 여기에 이미지 설명을 입력하십시오

업데이트 2, 매개 변수를 교체 한 후 28 번째 줄에 오류가 발생합니다.

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    -BGREN\
    -0\
    -70\
    -70\
    -0.1\
    -100\
    -100\
    -0\
    -0\
    -0\
    -'True'\
    -'False'\
    -1\
    -0.1\
    -'Layer'\
    -'DN'\
    -1024\
    -1\
    -0\
    -output)
else:
    output=Segment_Layer

여기에 이미지 설명을 입력하십시오

작동 방식 업데이트 :) 몇 번의 시도 후 Joseph 이이 코드를 매력처럼 작동시키는 데 도움이되면 마지막 트릭은 두 개의 선택적 값을 '없음'으로 바꾸는 것이 었습니다.

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    BGREN, \
    0, \
    70, \
    70, \
    0.1, \
    100, \
    100, \
    0, \
    0, \
    None, \
    True, \
    False, \
    1, \
    0.1, \
    'Layer', \
    'DN', \
    1024, \
    1, \
    None, \
    output)
else:
    output=Segment_Layer

3
if / else 문을 올바르게 사용하려면 모델러 내 에서 사용자 정의 스크립트 를 사용해야한다고 생각 합니다.
Joseph

1
@Joseph 저도 그렇게 생각했습니다. 문제는 제가 원하는만큼 스크립팅이 좋지 않다는 것입니다. 전혀 경험이 없습니다 ...
Andreas

1
@Andreas 나는 Joseph이 그 의견에 쓴 것을 확인합니다. 그러나 질문을 편집하고 파이썬으로 힌트를 얻을 수있는 가능성을 주면 커뮤니티에서 더 많은 도움을받을 수 있다고 생각합니다 (적절한 태그 추가).
mgri

1
@Andreas-내 게시물을 편집했습니다. 또한 문제를 해결 한 후에 답변 수락해야 합니다.)
Joseph

1
@Joseph 나는 지금 작동하는 코드로 내 게시물을 편집했다. 당신의 도움이 많이 필요했고 나는 당신이 이것을 도와주기 위해 당신의 소중한 시간을 보냈다 :) 결과를 위해 그러나 정말로 유망한 것처럼 보입니다, 다시 감사합니다 :)
Andreas

답변:


8

내 의견에서 언급했듯이 사용자 지정 스크립트 가이 상황에 갈 수 있습니다. 다음 중 하나를 만들 수 있습니다.

Processing Toolbox > Scripts > Tools > Create new script

다음 스크립트는 레이어를 포함하는 매개 변수에 따라 if / else 문과 함께 입력 매개 변수를 선택적 으로 설정합니다 . 따라서에 대해 레이어를 선택한 경우 세그먼트 도구를 수행 하고 출력을 설정합니다. 그렇지 않으면 출력은에서 선택된 레이어가됩니다 .BGRENSegment_Layer

가능한 스크립트는 다음과 같습니다.

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    -BGREN, \
    -filter, \
    -filter.meanshift.spatialr, \
    -filter.meanshift.ranger, \
    -filter.meanshift.thres, \
    -filter.meanshift.maxiter, \
    -filter.meanshift.minsize, \
    -mode, \
    -mode.vector.outmode, \
    -mode.vector.inmask, \
    -mode.vector.neighbor, \
    -mode.vector.stitch, \
    -mode.vector.minsize, \
    -mode.vector.simplify, \
    -mode.vector.layername, \
    -mode.vector.fieldname, \
    -mode.vector.tilesize, \
    -mode.vector.startlabel, \
    -mode.vector.ogroptions, \
    -output)
else:
    output=Segment_Layer

otb:segmentationmeanshift외모에 대한 매개 변수는 무섭습니다! 불행히도 Orfeo가 설치되어 있지 않으므로이 도구를 테스트 할 수 없습니다. 그러나 매개 변수는 여기표시 되며 GUI를 사용하는 대신 입력하면됩니다. 완료되면 BGRENSegment_Layer입력 레이어를 사용하여 스크립트를 모델러에 추가하십시오 .

스크립트 매개 변수

또한 모델러에서 및 의 필수 매개 변수 정의 를 변경해야 할 수도 있습니다 .BGRENSegment_Layer

파라미터 정의

그런 다음 스크립트의 출력을 NDVI 도구에 연결하십시오.


어떤 입력 레이어를 선택했는지에 따라 다른 도구를 사용하여 어느 정도까지 이것을 테스트 했으므로 모델러에서 작동하기를 바랍니다.



편집하다:

다음은 약간 수정 한 코드입니다 (매개 변수를 구분하려면 쉼표가 필요 True하며 False명령문은 따옴표가 필요하지 않습니다. 역 슬래시는 가독성을 위해 하나의 라이너로 포함됩니다).

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    BGREN, \
    0, \
    70, \
    70, \
    0.1, \
    100, \
    100, \
    0, \
    0, \
    0, \
    True, \
    False, \
    1, \
    0.1, \
    'Layer', \
    'DN', \
    1024, \
    1, \
    0, \
    output)
else:
    output=Segment_Layer

또는 단일 라이너로 :

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift',BGREN,0,70,70,0.1,100,100,0,0,0,True,False,1,0.1,'Layer','DN',1024,1,0,output)
else:
    output=Segment_Layer

1
@Andreas가 질문을 편집하도록 격려하고 더 많은 도움을 받기 위해 Python으로 힌트를 얻을 수있는 의견을 추가하고 있었지만 더 빨랐습니다!
mgri

1
@mgri-OP가 일부 세부 정보를 편집하고 다른 사람들이 가능한 해결책을 게시하도록 권장 할 수 있기 때문에 의견을 게시하는 것이 좋습니다.)
Joseph

1
@Joseph 젠장, 그게 내가 생각했던 것보다 훨씬 더 : O 어쨌든 나는 이것을 재현하고 그것을 시도하면 피드백을 남길 것입니다 : 미리 감사드립니다 :)
Andreas

1
가장 환영합니다! @mgri이 제안한 것처럼보다 적합한 파이썬 솔루션 등을 게시 할 수 있도록 질문을 편집하는 것이 좋을 것입니다. =)
Joseph

1
@Andreas-전혀 바보가 아닙니다. 모든 사람 은 처음부터 배워야합니다 =)
Joseph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.