QGIS Graphical Modeler에서 반복적 인 작업 단순화


13

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

위에 표시된 모델을 단순화하기 위해 QGIS 그래픽 모델러에서 사용할 수있는 반복자가 있습니까? 그렇지 않은 경우 모델을 단순화하는 더 좋은 방법이 있습니까?

첫 번째 열은 내 입력 레이어를 나타내고, 두 번째 열은 교차점이고, 세 번째 열은 "교차"작업의 출력이고, 네 번째 열은 "위치 별 조인 속성"작업이고 다섯 번째 열은 조인 작업의 결과입니다.

유역 분석을 위해 "교차"및 "위치 별 속성 결합"작업을 수행하고 싶습니다. 목표는 다른 차수의 스트림의 총 길이 및 평균 길이, 스트림 비율 및 분기 비율과 같은 선형 모포 메트릭 파라미터를 계산하는 것입니다.

첫 번째 단계는 "order1 스트림"을 유역과 교차시킨 다음 "Order2 스트림"을 동일한 유역과 교차시키는 것입니다. "order3 스트림"shapefile이 제공되면이 새 레이어에 대한 교차를 수행해야합니다. 따라서 "order1 스트림"및 "order2 스트림"만 필수이며 나머지는 제공된 유역 레이어에 따라 다릅니다. 예를 들어 유역이 오더 4 유역 인 경우 필요한 스트림은 "order4 스트림"까지입니다.

사용 가능한 모든 입력 레이어에 대해 교차가 완료되면 교차 스트림의 합과 평균을 얻는 옵션이있는 유역으로 위치별로 결합됩니다.

이미지는 올바른 절차를 보여줍니다. 모델러 외부에서 작업을 수행하면 결과가 정확합니다. 모델을 실행할 때이 오류가 발생합니다.

"알고리즘 Order5_plus_wshed 실행 오류 'NoneType'오브젝트에 'dataProvider'속성이 없습니다."

선택적 매개 변수 중 하나에 대한 입력을 제공하지 않은 경우 (예 : "order4 스트림"과 같은 입력) 그러나 모든 입력을 제공하면 필요한 결과를 얻습니다.

따라서이 작업을 설정하는 더 좋은 방법이 있는지 묻고 싶습니다.

답변:


12

내가 당신의 작업을 설정하는 방법 은 모델러보다 더 큰 유연성을 제공하지만 사용자와 유사한 인터페이스를 제공 할 수 있는 사용자 지정 스크립트 를 만드는 것입니다. 다음 중 하나를 만들 수 있습니다.

Processing Toolbox> 스크립트> 도구> 새 스크립트 생성

그런 다음 아래 스크립트를 복사하여 붙여넣고에 저장하십시오 C:/Users/You/.qgis2/processing/scripts.

아래 스크립트는 모델의 기능을 에뮬레이션하려고합니다. 이 스크립트는 최종 솔루션이 아닙니다 (특히 위치 도구 의 교차결합 속성에 사용한 매개 변수가 정의한 것과 다를 수 있기 때문에). 스크립트를 템플릿으로 사용하여 필요에 맞게 스크립트를 확장하고 개선 할 수 있기를 바랍니다. . 실행하려면 저장 한 후 처리 도구 상자 에서 선택하십시오 .

스크립트가 요청한 것을 수행한다고 생각합니다.

  • 처음 두 주문은 필수이므로 처리됩니다.

  • IF 명령문은 올바른 주문이 우선하는 경우에만 후속 주문이 처리되도록 보장하는 데 사용됩니다 (예 : order4는 order3이 선택된 경우에만 실행 됨).

  • 또한 처리중인 주문을 보여주는 메시지가 Python 콘솔에 인쇄 됩니다.


##Example model=name
##Order1=vector
##Order2=vector
##Order3=optional vector
##Order4=optional vector
##Order5=optional vector
##Watershed=vector
##Order2_Wshed=output vector
##Order3_Wshed=output vector
##Order4_Wshed=output vector
##Order5_Wshed=output vector

order1 = processing.getObject(Order1)
order2 = processing.getObject(Order2)
order3 = processing.getObject(Order3)
order4 = processing.getObject(Order4)
order5 = processing.getObject(Order5)
watershed = processing.getObject(Watershed)

if Order3 is None:
    print 'Processing Order1 and Order2'
else:
    print 'Processing Order1, Order2 and Order3'
    if Order4 is not None:
        print 'Processing Order1, Order2, Order3 and Order4'
        if Order5 is not None:
            print 'Processing Order1, Order2, Order3, Order4 and Order5'

output_1a = processing.runalg("qgis:intersection", order1, watershed, None)
output_1b = processing.runalg("qgis:joinattributesbylocation", output_1a['OUTPUT'], watershed, u'intersects', 0, 0, '', 0, None)
output_2a = processing.runalg("qgis:intersection", order2, watershed, None)
output_2b = processing.runalg("qgis:joinattributesbylocation", output_2a['OUTPUT'], output_1b['OUTPUT'], u'intersects', 0, 0, '', 0, Order2_Wshed)

if Order3 is None:
    pass
else:
    output_3a = processing.runalg("qgis:intersection", order3, watershed, None)
    output_3b = processing.runalg("qgis:joinattributesbylocation", output_3a['OUTPUT'], output_2b['OUTPUT'], u'intersects', 0, 0, '', 0, Order3_Wshed)
    if Order4 is None:
        pass
    else:
        output_4a = processing.runalg("qgis:intersection", order4, watershed, None)
        output_4b = processing.runalg("qgis:joinattributesbylocation", output_4a['OUTPUT'], output_3b['OUTPUT'], u'intersects', 0, 0, '', 0, Order4_Wshed)
        if Order5 is None:
            pass
        else:
            output_5a = processing.runalg("qgis:intersection", order5, watershed, None)
            output_5b = processing.runalg("qgis:joinattributesbylocation", output_5a['OUTPUT'], output_4b['OUTPUT'], u'intersects', 0, 1, 'sum, mean', 0, Order5_Wshed)

아래는 스크립트를 실행할 때 인터페이스의 스크린 샷입니다 (모델을 실행할 때와 유사 함).

스크립트 실행

몇 가지 참고할 사항 :

  • 빨간색 상자에는 필수 매개 변수가 포함됩니다

  • 녹색 상자에는 선택적 매개 변수가 포함됩니다

  • 파란색 상자에는 필수 매개 변수가 포함됩니다

  • 블랙 박스에는 결과를 출력하기위한 선택적 매개 변수가 포함되어 있습니다. 스크립트는 연관된 순서가 선택된 경우에만 레이어를 출력합니다 (예를 들어 order5에 대한 입력이 선택되지 않았지만 이에 대한 출력은 오류가 발생 함). 따라서 사용자는 입력과 관련 출력을 선택해야합니다. 이것은 의도적이지 않았지만 개인적으로 사용자가 매개 변수를 신중하게 확인하도록하는 좋은 방법이라고 생각합니다.


QGIS 2.12.3 ( 처리 플러그인 버전 2.12.2 포함)을 사용했습니다.


2
최근 QGIS 팟 캐스트에서는 처리 작성자가 있었으며, 빌드 방식으로 인해 모델 작성기에 직접 반복자를 추가 할 수 없다고 말했습니다. 추가하려면 광범위한 재기록이 필요합니다. 따라서 커스텀 스크립트는 분명히 그것을위한 방법입니다.
HeikkiVesanto

@Vesanto-매우 흥미 롭습니다. 포함 해 주셔서 감사합니다. 이 특정 팟 캐스트에 대한 링크가 있습니까?
Joseph


1
@DennisTG-사과 친구, 내 게시물에서 QGIS 2.12.3 ( 처리 플러그인 버전 2.12.2 포함)을 사용했다고 언급 했어야합니다 .
Joseph

1
@ 조셉, 그것은 나를 위해 작동합니다. 아주 통찰력, 나는 도움을 주셔서 감사합니다.
DennisTG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.