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 스크립트 또는 플러그인 또는 마스터의 새 콘솔로로드 됨)에서 실행됩니다. 정렬 가능한 이름으로 그룹을 만들고 올바른 그룹에 레이어를 추가 한 다음 모든 것을 정렬합니다. 위와 같이 동일한 경고가 적용됩니다.
이미로드 된 레이어 및 그룹이있는 기존 프로젝트에 새 레이어를 추가 할 때보다 강력한 솔루션을 위해서는 올바른 그룹 인덱스를 추가로 확인해야합니다.