사용자 입력과 함께 ModelBuilder를 사용하여 속성별로 추출 하시겠습니까?


11

ModelBuilder를 사용하여 사용자가 모양 파일을 추출하는 데 사용할 값을 선택할 수있는 도구를 만들고 싶습니다.

"Parcel_Type"필드가있는 소포 레이어가 있습니다. 사용자가 추출 할 소포의 유형을 선택할 수 있기를 바랍니다. 따라서 사용자가 "EL"유형의 소포를 추출하려면 "EL"만 변수로 입력하면됩니다. "EL"및 "CDD"유형을 원하면 다중 변수로 입력해야합니다. 그것은 모델과 인간의 유일한 상호 작용 일 것입니다.

내 모델에서 해당 변수를 어떻게 사용할 수 있습니까?

답변:


14

이 유형의 작업에는 거의 항상 WHERE 절을 작성해야 하므로 적어도 약간의 Python을 사용하는 것이 좋습니다.

또한 이는 IMO ModelBuilder와 관련이있을 수 있지만, 사용자 지정 유효성 검사 및 매개 변수 설정에 대한 제어 기능이 강화 된 Python 스크립트 도구 를 만들면 더 나은 사용자 경험을 제공 할 수 있습니다 (예 : FieldMultiValue * 매개 변수 드롭 다운 메뉴). 입력하지 않고 값을 선택할 수 있습니다.

* MultiValue 매개 변수에 대해 실제로 확실하지 않은 경우

그러나 이것은 다른 주제에 대한 고급 연습이므로 Python을 사용하여 WHERE 절을 만드는 ModelBuilder 접근 방식을 고수합니다.

  1. 새 모델 만들기
  2. 입력 피처 레이어 , 필드다중 값 매개 변수에 대해 변수를 작성하십시오 (빈 캔버스를 마우스 오른쪽 단추로 클릭하고 변수 추가 클릭 ) .
  3. 이들 각각을 마우스 오른쪽 버튼으로 클릭하고 모델 매개 변수를 선택하십시오.
  4. 캔버스에 값 계산 (데이터 관리) 도구를 추가하십시오 . 3 개의 변수를 전제 조건으로 연결하십시오 (이 경우에만 표시되지만 다른 상황에서는 실행 순서가 달라질 수 있음).
  5. 값 계산 도구를 두 번 클릭하여 설정하십시오.

    5a. 다음을 표현식 상자에 복사하여 붙여 넣습니다 (변수 이름과 일치하도록 조정).

    buildWhereClauseMultiValue(r"%Feature Layer%","%Field%","%Values%")

    5b. 다음을 코드 블록 상자에 복사하여 붙여 넣습니다 .

    import arcpy
    
    def buildWhereClauseMultiValue(table, field, values):
        """Takes a semicolon-delimited list of values and constructs a SQL WHERE
        clause to select those values within a given field and table."""
    
        # Add DBMS-specific field delimiters
        fieldDelimited = arcpy.AddFieldDelimiters(arcpy.Describe(table).path, field)
    
        # Split multivalue at semicolons and strip quotes
        valueList = [value[1:-1] if (value.startswith("'") and value.endswith("'")) else value for value in values.split(';')]
    
        # Determine field type
        fieldType = arcpy.ListFields(table, field)[0].type
    
        # Add single-quotes for string field values
        if str(fieldType) == 'String':
            valueList = ["'%s'" % value for value in valueList]
    
        # Format WHERE clause in the form of an IN statement
        whereClause = "%s IN(%s)" % (fieldDelimited, ', '.join(valueList))
        return whereClause

    5c. 출력 데이터 유형을 SQL 표현식으로 설정하십시오 .

    5d. 확인을 클릭하고 값 계산 도구에서 출력 변수를 마우스 오른쪽 단추로 클릭하고 이름을 "WHERE 절"과 같이보다 설명적인 이름으로 바꾸십시오.

  6. 추가 속성으로 선택 레이어 (데이터 관리) 캔버스에 도구를. 피처 레이어 및 WHERE 절 변수를 속성 별 레이어 선택 도구에 연결하십시오.
  7. 캔버스에 복사 기능 (데이터 관리) 도구를 추가하십시오 . 속성 별 레이어 선택 도구의 출력을 기능 복사 도구에 연결하십시오. 출력 피쳐 클래스 변수를 마우스 오른쪽 버튼으로 클릭하고 모델 매개 변수 및 (선택 사항) 디스플레이에 추가 옵션을 확인하십시오.

    이 시점에서 다음과 같이 보일 것입니다 : 모델 캔버스

  8. 언더 모델 -> 모델 속성 메뉴가 그것에게 좋은 이름과 라벨을 부여하고 저장하고 닫습니다.

  9. ArcToolbox에서 모델을 두 번 클릭하여 모델 대화 상자를 엽니 다. 매개 변수를 입력하고 확인을 클릭하십시오. 선택한 기능을 새 기능 클래스로 내보내고 맵에 추가해야합니다 (출력 기능 클래스에서 "디스플레이에 추가"를 선택한 경우).

    모델 대화 상자

메모:

  • 피처 레이어 나 필드 매개 변수처럼 사용자가 변경하지 않게하려는 변수를 "파라미터 화"하지 않고 항상 값을 하드 코딩 할 수 있습니다. 나는 일반적인 / 재사용 가능한 도구를 가지고 있기 때문에 모델 매개 변수를 만들었습니다. 실제로 내가 할 일은 단순히 일반 모델을 새 모델로 끌어다 놓은 다음 미리 정의 된 매개 변수를 설정하는 것입니다. 이렇게하면 미리 정의 된 여러 "래퍼"모델을 만들 수 있지만 작업을 수행하는 하나의 기본 모델 만 가질 수 있습니다. 기능을 변경해야하는 경우 한 곳에서만 변경하면됩니다.

  • 운이 좋으면 모델검증 하지 않아도되고 유효성 검사 후에 모델 을 제거하기 위해 더미 데이터를 제공 할 필요가 없습니다 (모든 모델 요소가 공백 / 흰색으로 표시되어 "실행할 준비가되지 않음"을 의미 함) -하지만 모델 대화 상자에서 매개 변수를 채울 때 어쨌든 실행할 수있었습니다).


3

GUI 요구 사항이 @ blah238로 표시된 정확한 대화 상자에 맞지 않는 경우 Select라는 간단한 지오 프로세싱 도구를 사용하여이 워크 플로를 달성 할 수 있습니다.

검색 창을 사용하여 찾거나 ArcToolbox> 분석 도구> 추출> 선택으로 이동하십시오.

선택 (분석) 도구를 사용하면 기능 클래스에서 모든 필드 (속성)를 사용하여 특징을 추출 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.