QGIS 프로젝트에서 동적 레이어 이름을 가질 수 있습니까?


9

현재 날짜를 사용하는 PostGIS SQL 쿼리를 기반으로 레이어가있는 QGIS 프로젝트가 있습니다. 데이터베이스의 데이터가 변경되므로 이러한 쿼리는 매일 다른 데이터를 반환합니다.

레이어 트리 패널에서 레이어 이름을 동적으로 변경하여 현재 날짜를 나타낼 수 있습니까? (예 : 레이어 이름은 Traffic on 24.01.2015매일 변경됩니다). 캡션에 대한 데이터는 레이어의 피처 속성에서 가져와야합니다. 모두 필드 값이 동일합니다 traffic_date.


데이터베이스 테이블, "트래픽"또는 현재 날짜에서 정확히 무엇을 추출 하시겠습니까?
Germán Carrillo

현재 날짜의 데이터를 한 레이어로 추출하고 다른 레이어로 데이터를 예측하고 있습니다. 따라서 "24.01.2015"는 실제로 데이터베이스에서 가져온 필드 값입니다. 날짜에 따라 자동으로 변경하려면 프로젝트의 레이어 이름이 필요합니다.
mofoyoda

프로젝트가로드 될 때마다 이름을 변경해도 괜찮습니까?
Nathan W

답변:


13

내가 맞다면 QGIS는 동적 레이어 이름을 지원합니다.

프로젝트를 열 때마다 실행되도록 Python 매크로를 작성해야합니다. 이것은 워크 플로우입니다.

  1. 다음 Python 코드로 이동하여 QGIS->Project->Project Properties대체하십시오 openProject().

    def openProject():
        import re, qgis     
        iface = qgis.utils.iface
        layers = iface.mapCanvas().layers()
        for lyr in layers:
            # Get date from layer
            it=lyr.getFeatures()
            feat = next(it)
            idx = lyr.fieldNameIndex('traffic_da')
            currDate = feat.attributes()[idx]
    
            # Set new layer name
            name = lyr.name()
            if re.search(' on \d{2,2}.\d{2,2}.\d{4,4}$', name):
                 name = name[:-14]
            name = name + " on " + currDate
            lyr.setLayerName( name )
    

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

    참고 1 : shapefile에서 테스트 했으므로 날짜를 가져 오는 필드는 traffic_daShapefile이 필드 이름에서 더 많은 문자를 지원하지 않기 때문입니다. 코드에서 레이어에서 작동하도록 조정하십시오.

    참고 2 : 프로젝트 구성에 따라 원하는 레이어에서만 작동하도록 유효성 검사 코드를 추가해야합니다. 예를 들어, 래스터 레이어에서 코드를 실행하면 오류가 확실하게 나타납니다. 도움이 필요하시면 새로운 질문을여십시오. 도와 드리겠습니다.

  2. 다음과 같은 방법으로 프로젝트에서 매크로를 활성화하십시오. Settings->Options->General->Enable macros: Always

  3. 레이어를 프로젝트에로드하십시오.

  4. 프로젝트를 저장하십시오.

이 시점에서 프로젝트를 열 때마다 레이어 이름이 동적이되고 날짜는 traffic_date각 레이어의 속성 테이블에 있는 필드 에서 가져옵니다 .

프로젝트를 처음 열면 레이어 이름이 동적으로 생성되는 방식입니다.

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

시작하는 데 도움이 될 것 같습니다. 명백한 문제가 발생하면 알려주십시오.


나는 답변을 제출하기 전에 1을 게시하여 귀하의 의견을 읽음으로써 그것을 알아 냈습니다. 레이어의 특정 배열에 맞게 코드에서 일부 조정을 수행해야하지만 @mofoyoda가 해당 레이어를 처리 할 수 ​​있기를 바랍니다.
Germán Carrillo

1
네, 먼저 가세요. on정규식을 사용하여 절약하기 위해 색인을 찾아서 끝에서 끝까지 제거 할 수도 있습니다 .
Nathan W

1
@gcarrillo 강렬! 그러나 위대하다!
DPSSpatial

1
@gcarrillo 감사합니다! 여전히 특정 레이어에만 적용하는 방법을 찾으려고 노력하고 있습니다. 좋은 답변 주셔서 감사합니다!
mofoyoda 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.