ArcPy를 사용하여 레이블 스타일 (글꼴, 색상, 크기 등)을 변경 하시겠습니까?


9

다른 유형의 아파트를 기반으로 레이어의 포인트 레이블 지정 프로세스를 자동화하는 ArcGIS 10.2 용 Python 매크로를 작성하려고합니다. 예를 들어, 한 스타일의 아파트는 하나의 레이블로 흰색 굵은 텍스트가있는 파란색 정사각형을 갖습니다. 다른 하나는 검은 굵은 글씨로 된 분홍색 사각형입니다. 다른 하나는 흰색 굵은 글씨로 된 빨간색 사각형이 있습니다.

이 레이블의 스타일을 바꾸기 위해 arcpy에서 어떤 표현이나 함수를 사용 하시겠습니까?

현재 스크립트는 맵 코드로 아파트에 레이블을 지정하고 TOC의 이름을 아파트로 변경합니다.

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

이제 레이블의 글꼴, 그래픽 및 크기를 변경하여 고유 한 레이블을 만든 다음 이러한 레이어 중 하나를 수행해야 할 때마다 프로세스를 누르고 자동화하는 버튼을 만듭니다.

Python 스크립팅 (ArcPy, IDLE 등)을 사용하여 글꼴, 레이블 및 그래픽을 변경할 수있는 방법이 있습니까?


나는이 게시물을 편집하여 내가 여기에 가고있는 것에 대한 최종 설명을 제공하기로 결정했기 때문에 혼란스럽지 않습니다. 기본적으로 맵의 포인트는 위의 그림에서 다음과 같이 보입니다.

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


lblClass.expression함수를 사용해 보았지만 사용 하려는 코드가 작동하지 않습니다. 나는 그것이 올바른 방향으로 나아가는 단계라고 생각합니다. 아래는 labelClass.expression을 사용하여 레이블의 글꼴을 변경하려고 시도한 일부 코드입니다.

for lblClass in aptLayer.labelClasses:
lblClass.showClassLabels = True
def getLabel (Code, Type):
if Type == "MRR":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TAX":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "MRT":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "GSS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TGS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
else:
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"

lblClass.expression = getLabel( [Map_Code],[Type])

답변:


7

arcpy.mapping API는 직접 수정할 수있는 제한된 수의 레이어 속성에만 액세스 할 수 있지만 레이어 속성 대화 상자에있는 모든 속성은 UpdateLayer 함수를 사용하여 수정할 수 있습니다. 정보는 소스 레이어에서 추출되어 업데이트가 필요한 맵 문서의 레이어에 적용됩니다. source_layer는 레이어 (.lyr) 파일이거나 맵 문서 내의 레이어 일 수 있습니다. UpdateLayer는 여러 가지 다른 방식으로 사용하여 다른 결과를 생성 할 수 있으므로 강력한 기능입니다.

기호 / 라벨을 원하는 방식으로 만들어 레이어 파일에 저장해야합니다. 그런 다음 arcpy.mapping.UpdateLayer ()를 사용하여 해당 레이어 파일을로드하십시오 .

여러 사람이 파이썬 추가 기능을 실행해야하는 경우 공용 네트워크 드라이브와 같은 모든 사람이 계층 파일에 액세스 할 수 있도록해야합니다.


결국 사용자 정의 업데이트 레이어 속성 도구 상자를 만들었습니다 . ArcMap TOC에서 레이어를 선택한 다음 입력 레이어 파일을 선택할 수 있습니다. 그런 다음 도면층 파일 내의 모든 특성으로 도면층을 업데이트하고 원래 피쳐 클래스로 다시 소싱합니다. gdb, mdb, shp 또는 sde에있는 데이터로 작동합니다.

소스 코드보기

궁금한 점이 있으면 알려주세요.

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


나는 모든 세트 (기호 및 레이블)가있는 다른 점 기반 데이터 레이어에서 별도의 레이어 파일을 만들었지 만 실행되지만 레이블이없는 기호가없는 아파트 파일 (추가하기로 선택한 파일)을 완전히 대체하는 것만 같습니다. sourceLayer 아파트 파일. "업데이트 심볼 만"섹션의 False 때문이라고 가정합니다. 이것을 수행 할 수있는 방법이 있습니까? 심볼과 라벨을 적용하지만 포인트를 다른 위치로 옮기지 마십시오.
Tyler 스피어스

어떤 종류의 기능을 찾고 있습니까? 리 소싱에 익숙하지 않습니다. 그건 그렇고 당신의 도움에 감사드립니다.
Tyler 스피어스

내 코드에 맞게 이것을 조정하려고했습니다. UpdateLayer 함수를 통해 작동하지만 35 번째 줄 refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]에서 인덱스가 범위를 벗어났다는 오류가 발생합니다.
Tyler Spears

즉, arcpy.mapping.ListLayers메서드가 현재 mxd에서 이름과 동일한 이름을 가진 레이어를 찾지 못합니다 input_layer_file( [0]색인을 범위 밖으로 벗어난 인덱스는 목록에 항목이 없음을 의미합니다).
XIY

나는 그렇게했다고 생각하지만 UpdateLayer 부분이 끝난 후 다음과 같은 오류가 발생합니다. Traceback (most recent call last): File "E:\_Tyler Temp\Python\IanTest.py", line 30, in <module> refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0] IndexError: list index out of range
Tyler Spears

6

또 다른 옵션은 파이썬을 사용하여 레이어에 사용자 정의 레이블 표현식을 설정하는 것입니다 (크기 및 색상 등 변경).

예 :

def FindLabel ( [NAME], [POPULATION] ):
  if long([POPULATION]) >= 250000:
    return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
  else:
    return [NAME]

라벨 표현 작성

다음을 통해 설정 될 수 있습니다.

LabelClass (arcpy.mapping)

편집하다:

이 시도:

def FindLabel ([Code], [Type]):
  if [Type] == "MRR":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TAX":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "MRT":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "GSS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TGS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  else:
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"

다른 줄 문장 (for loop, labClass 및 call to function)을 제거 할 수 있습니다. 또한 함수는 FindLabel이라고합니다.


나는 이와 같은 기능과 비슷한 것을 사용하려고했습니다. 정의를 호출 def getLabel (Code, Type)한 다음 사용하는 다른 맵 코드에 대해 if-else 문을 설정 한 후 'lblClass.expression = getLabel ( "[Map_Code]", "[Type]")'을 설정했습니다. 오류가 TypeError: unsupported operand type(s) for &: 'str' and 'str'나는 기본적으로 ESRI의 웹 사이트의 예를 다음과 같은거야. 글꼴을 변경할 수 있다는 것을 간단하게 증명할 수 있으면 레이블의 모양, 배경 및 색상과 같이 더 어려운 부분을 조정할 수 있습니다.
Tyler 스피어스

@Tyler Spears, 필드 이름 주위에 큰 따옴표를 제거하십시오.
artwork21

그렇게하면 매개 변수가 정의되지 않았다고 말합니다.
Tyler 스피어스

@ 타일러 스피어스, 질문에 코드를 게시 할 수 있습니까? 함수 괄호 밖에 작은 따옴표가 있습니다.
artwork21

물론 코드를 표시하도록 질문을 업데이트했습니다.
Tyler 스피어스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.