QGIS 목차에서 레이어를 정렬 하시겠습니까?


12

PostGIS에서 QGIS에 여러 레이어를로드하면 알파벳 순서대로로드되는 것 같습니다.

QGIS TOC를 다른 순서로 신속하게 정렬 할 수있는 도구 나 플러그인이 있습니까? 예를 들어 원하는 몇 가지 옵션을 생각할 수 있습니다.

  1. 점이 맨 위에 오도록 선, 폴리곤 및 래스터가있는 지오메트리로 레이어를 정렬합니다.
  2. 이름을 기준으로 레이어를 정렬합니다 (알파벳, 알파벳 역순).
  3. 먼저 형상별로 정렬 한 다음 이름별로 정렬하십시오. 이것은 # 1과 # 2의 조합입니다. 포인트 레이어는 맨 위로 정렬되지만 (# 1과 동일) 포인트 레이어는 알파벳순으로 정렬됩니다 (포인트 a, 포인트 b, 포인트 c 등).

많은 수의 레이어를로드 할 때 맵 제작에 적합한 순서를 신속하게 구축하는 데 도움이됩니다.


아주 좋은 생각입니다! 나는 그러한 작업을 수행 할 수있는 플러그인이 없다고 생각하지 않습니다 (파이썬이 충분하면 작업 할 수는 있지만 복잡하다고 생각합니다). QGIS 개발자 팀에 기능 요청을 할 수 있습니다.
Curlew

1
이 기능 에 대한 기능 요청 을 게시했습니다 .
RyanKDalton

답변:


7

PostGIS에서 QGIS에 여러 레이어를로드하면 알파벳 순서대로로드되는 것 같습니다.

이것은 Add layer action Add PostGIS Layers ... 를 사용할 때 버그 (마스터 브랜치에서도) 인 것으로 보이며 QGIS bug tracker 에보고되어야합니다 . 그러나 새 브라우저 를 사용 하여 PostGIS 레이어를로드하면 반대로 되 돌리지 않습니다. 새로운 DB Manager는 다중 테이블 선택을 허용하지 않으므로 다중 선택 부족 이외의 문제는 없습니다.

QGIS TOC를 다른 순서로 신속하게 정렬 할 수있는 도구 나 플러그인이 있습니까? 예를 들어 원하는 몇 가지 옵션을 생각할 수 있습니다.

2) 이름을 기준으로 레이어를 정렬합니다 (알파벳, 알파벳 역순).

이것은 현재 QgsLegend ( QTreeWidget ) 의 기본 클래스의 기본 열 또는 항목 정렬을 사용하여 수행 할 수 있습니다 . 그러면 최상위 레이어 위나 아래에 그룹화 된 그룹이 아닌 레이어와 그룹 모두의 모든 항목이 정렬됩니다. 또한 그룹 내에서 정렬됩니다. 이런 정렬 방법은 없습니다.

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.utils import iface

mw = iface.mainWindow()
lgd = mw.findChild(QTreeWidget, "theMapLegend")  # get ref to object by type/objectName
lgd.sortItems(0, Qt.AscendingOrder)  # sort first column (Qt.DescendingOrder to reverse)

경고 : 주 범례가 레이어 렌더 순서도 제어하는 ​​경우 (기본값) 정상적으로 작동합니다. 레이어 순서 도크 위젯을 별도로 사용하여 렌더링 순서를 제어하는 ​​경우 범례의 정렬 순서가 적용되지 않고 다음 정렬 작업으로 인해 원하지 않는 결과가 발생할 수 있습니다 (위에서 계속).

lo = mw.findChild(QListWidget, "theMapLayerOrder")
lo.sortItems(Qt.AscendingOrder)

이 코드에서 레이어 주문 목록이 QTreeWidget 이 아닌 QListWidget임을 알 수 있습니다. 이는 정렬시 그룹화를 고려하지 않음을 의미합니다. 모든 레이어는 마치 최상위 레벨 인 것처럼 단순 목록으로 표시됩니다. 따라서 QListWidget에 위의 정렬 코드를 적용하면 현재 그룹에 중첩 된 모든 레이어가 최상위 레이어 아래에서 정렬 될 수 있습니다.

1) 점이 맨 위에 오도록 선, 폴리곤 및 래스터가있는 지오메트리로 레이어를 정렬합니다.

3) 먼저 형상을 기준으로 정렬 한 다음 이름을 기준으로 정렬하십시오. 이것은 # 1과 # 2의 조합입니다. 포인트 레이어는 맨 위로 정렬되지만 (# 1과 동일) 포인트 레이어는 알파벳순으로 정렬됩니다 (포인트 a, 포인트 b, 포인트 c 등).

현재 Python을 사용하면 QgsLegend 조작을위한 기능이 제한됩니다. 거기입니다 QgsLegendInterface는 그러나 이것은에 존재하는 모든 케이크가없는 QgsLegend , QgsLegendLayer , 상속 QgsLegendItem , 또는 어떤 다른 클래스 QgsLegend과 관련된합니다.

깨끗한 프로젝트로 시작하고 그룹을 사용하지 않아도 현재는 다음과 같습니다 (초기 코드 블록에서 계속).

li = iface.legendInterface()
li.addGroup('A_Points')
li.addGroup('B_Lines')
li.addGroup('C_Polygons')
li.addGroup('D_Rasters')

for l in li.layers():
  if l.type() == QgsMapLayer.VectorLayer:
    if l.geometryType() == QGis.Point:
      li.moveLayer(l, 0)
    elif l.geometryType() == QGis.Line:
      li.moveLayer(l, 1)
    elif l.geometryType() == QGis.Polygon:
      li.moveLayer(l, 2)
  elif l.type() == QgsMapLayer.RasterLayer:
    li.moveLayer(l, 3)

lgd.sortItems(0, Qt.AscendingOrder)

( 다른 그룹이 존재하지 않는다고 가정합니다. ) 레이어가 추가 된 후 콘솔 (또는 ScriptRunner 스크립트 또는 플러그인 또는 마스터의 새 콘솔로로드 됨)에서 실행됩니다. 정렬 가능한 이름으로 그룹을 만들고 올바른 그룹에 레이어를 추가 한 다음 모든 것을 정렬합니다. 위와 같이 동일한 경고가 적용됩니다.

이미로드 된 레이어 및 그룹이있는 기존 프로젝트에 새 레이어를 추가 할 때보다 강력한 솔루션을 위해서는 올바른 그룹 인덱스를 추가로 확인해야합니다.


알파벳 순서로 표시 레이어의 변경은 단지 마스터 브랜치로 통합되었습니다 github.com/qgis/QGIS/pull/4965
MatzFan을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.