def __init__(self): super(Window, self).__init__() self.setupUi(self) self.layers = [] # ---------初始化图层和画布---------- self.vl = QVBoxLayout(self.dockWidgetContents) self.layer_tree_view = QgsLayerTreeView(self) self.vl.addWidget(self.layer_tree_view) self.hl = QHBoxLayout(self.frame) self.mapCanvas = QgsMapCanvas(self.frame) self.hl.addWidget(self.mapCanvas) # ---------初始化图层和画布---------- self.action_open.triggered.connect(self.action_open_triggered) # 建立桥梁 self.model = QgsLayerTreeModel(QgsProject.instance().layerTreeRoot(), self) self.model.setFlag(QgsLayerTreeModel.AllowNodeRename) self.model.setFlag(QgsLayerTreeModel.AllowNodeReorder) self.model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility) self.model.setFlag(QgsLayerTreeModel.ShowLegendAsTree) self.model.setAutoCollapseLegendNodes(10) self.layer_tree_view.setModel(self.model) self.layer_tree_bridge = QgsLayerTreeMapCanvasBridge( QgsProject.instance().layerTreeRoot(), self.mapCanvas) # 设置识别工具 self.identifyTool = QgsMapToolIdentifyFeature(self.mapCanvas) # 发送识别的要素 self.identifyTool.featureIdentified.connect(self.print_features) self.mapCanvas.setMapTool(self.identifyTool)
class Window(QMainWindow, Ui_MainWindow): def __init__(self): super(Window, self).__init__() self.setupUi(self) self.layers = [] # ---------初始化图层和画布---------- self.vl = QVBoxLayout(self.dockWidgetContents) self.layer_tree_view = QgsLayerTreeView(self) self.vl.addWidget(self.layer_tree_view) self.hl = QHBoxLayout(self.frame) self.mapCanvas = QgsMapCanvas(self.frame) self.hl.addWidget(self.mapCanvas) # ---------初始化图层和画布---------- self.action_open.triggered.connect(self.action_open_triggered) # 建立桥梁 self.model = QgsLayerTreeModel(QgsProject.instance().layerTreeRoot(), self) self.model.setFlag(QgsLayerTreeModel.AllowNodeRename) self.model.setFlag(QgsLayerTreeModel.AllowNodeReorder) self.model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility) self.model.setFlag(QgsLayerTreeModel.ShowLegendAsTree) self.model.setAutoCollapseLegendNodes(10) self.layer_tree_view.setModel(self.model) self.layer_tree_bridge = QgsLayerTreeMapCanvasBridge(QgsProject.instance().layerTreeRoot(), self.mapCanvas) # 设置识别工具 self.identifyTool = QgsMapToolIdentifyFeature(self.mapCanvas) # 发送识别的要素 self.identifyTool.featureIdentified.connect(self.print_features) self.mapCanvas.setMapTool(self.identifyTool) def action_open_triggered(self): data_file, ext = QFileDialog.getOpenFileName(self, '打开', '', '所有文件(*)') if data_file: if data_file.endswith('.shp'): basename = os.path.splitext(os.path.basename(data_file))[0] layer = QgsVectorLayer(data_file, basename, "ogr") QgsProject.instance().addMapLayer(layer) self.layers.append(layer) self.mapCanvas.setExtent(layer.extent()) self.mapCanvas.setLayers(self.layers) self.mapCanvas.refresh() self.layer_tree_view.setCurrentLayer(layer) # 设置需要识别的图层 self.identifyTool.setLayer(layer) elif data_file.endswith('.qgz') or data_file.endswith('.qgs'): QgsProject.instance().read(data_file) else: print('error') def print_features(self, feature): print(feature.attributes()) print(feature.fields()) print(feature.geometry())
class LayerSelectDialog(QDialog): def __init__(self, parent): QDialog.__init__(self, parent) self.mapSettings = None self.canvasReady = False # whether map settings have been applied to map canvas # Set up the user interface from Designer. self.ui = ui = Ui_LayerSelectDialog() ui.setupUi(self) ui.tabWidget.setTabEnabled(1, False) ui.tabWidget.currentChanged.connect(self.tabPageChanged) def initTree(self, ids=None): ids = ids or [] self.root = QgsProject.instance().layerTreeRoot().clone() for layer in self.root.findLayers(): layer.setVisible(Qt.Checked if layer.layerId() in ids else Qt.Unchecked) self.model = QgsLayerTreeModel(self.root) self.model.setFlags(QgsLayerTreeModel.AllowNodeChangeVisibility) self.ui.treeView.setModel(self.model) def setMapSettings(self, mapSettings): self.mapSettings = mapSettings self.canvasReady = False self.ui.tabWidget.setTabEnabled(1, bool(mapSettings)) def visibleLayers(self): layers = [] for layer in self.root.findLayers(): if layer.isVisible(): layers.append(layer.layer()) return layers def tabPageChanged(self, index): if index == 1: self.updatePreview() def updatePreview(self): if self.mapSettings is None: return if not self.canvasReady: c = self.ui.canvas s = self.mapSettings c.setCanvasColor(s.backgroundColor()) c.setCrsTransformEnabled(s.hasCrsTransformEnabled()) c.setDestinationCrs(s.destinationCrs()) if QGis.QGIS_VERSION_INT >= 20700: c.setRotation(s.rotation()) c.setExtent(s.extent()) self.canvasReady = True self.ui.canvas.setLayerSet( [QgsMapCanvasLayer(layer) for layer in self.visibleLayers()])
class LayerSelectDialog(QDialog): def __init__(self, parent): QDialog.__init__(self, parent) self.mapSettings = None self.canvasReady = False # whether map settings have been applied to map canvas # Set up the user interface from Designer. self.ui = ui = Ui_LayerSelectDialog() ui.setupUi(self) ui.tabWidget.setTabEnabled(1, False) ui.tabWidget.currentChanged.connect(self.tabPageChanged) def initTree(self, ids=None): ids = ids or [] self.root = QgsProject.instance().layerTreeRoot().clone() for layer in self.root.findLayers(): layer.setVisible(Qt.Checked if layer.layerId() in ids else Qt.Unchecked) self.model = QgsLayerTreeModel(self.root) self.model.setFlags(QgsLayerTreeModel.AllowNodeChangeVisibility) self.ui.treeView.setModel(self.model) def setMapSettings(self, mapSettings): self.mapSettings = mapSettings self.canvasReady = False self.ui.tabWidget.setTabEnabled(1, bool(mapSettings)) def visibleLayers(self): layers = [] for layer in self.root.findLayers(): if layer.isVisible(): layers.append(layer.layer()) return layers def tabPageChanged(self, index): if index == 1: self.updatePreview() def updatePreview(self): if self.mapSettings is None: return if not self.canvasReady: c = self.ui.canvas s = self.mapSettings c.setCanvasColor(s.backgroundColor()) c.setCrsTransformEnabled(s.hasCrsTransformEnabled()) c.setDestinationCrs(s.destinationCrs()) if QGis.QGIS_VERSION_INT >= 20700: c.setRotation(s.rotation()) c.setExtent(s.extent()) self.canvasReady = True self.ui.canvas.setLayerSet([QgsMapCanvasLayer(layer) for layer in self.visibleLayers()])
def initTree(self, ids=None): ids = ids or [] self.root = QgsProject.instance().layerTreeRoot().clone() for layer in self.root.findLayers(): layer.setVisible(Qt.Checked if layer.layerId() in ids else Qt.Unchecked) self.model = QgsLayerTreeModel(self.root) self.model.setFlags(QgsLayerTreeModel.AllowNodeChangeVisibility) self.ui.treeView.setModel(self.model)
def initTree(self, visibleLayerIds=None): ids = visibleLayerIds or [] self.root = QgsProject.instance().layerTreeRoot().clone() for layer in self.root.findLayers(): layer.setItemVisibilityChecked(layer.layerId() in ids) self.model = QgsLayerTreeModel(self.root) self.model.setFlags(QgsLayerTreeModel.AllowNodeChangeVisibility) self.ui.treeView.setModel(self.model)
def __init__(self, parent=None): super(LayerTreeProxyModel, self).__init__(parent) root = QgsProject.instance().layerTreeRoot() self.layer_tree_model = QgsLayerTreeModel(root) self.setSourceModel(self.layer_tree_model) self.layers_state = dict() self.packable = find_packable_layers() for tree_layer in root.findLayers(): if tree_layer.layer() is None: # it is an invalid layer but let's keep it - it might be a valid layer elsewhere lid = tree_layer.layerId() check_col = self.KEEP_COL else: lid = tree_layer.layer().id() check_col = self.PACK_COL if (lid in self.packable and tree_layer.layer().isValid()) else self.KEEP_COL self.layers_state[lid] = check_col
def setRoot(self, root): model = QgsLayerTreeModel(root, self) model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility) model.setFlag(QgsLayerTreeModel.ShowLegendAsTree) font = QFont() font.setPointSize(20) model.setLayerTreeNodeFont(QgsLayerTreeNode.NodeLayer, font) model.setLayerTreeNodeFont(QgsLayerTreeNode.NodeGroup, font) self.layerTree.setModel(model)
def __init__(self, methodName): """Run once on class initialization.""" unittest.TestCase.__init__(self, methodName) # setup a dummy project self.project = QgsProject() self.layer = QgsVectorLayer("Point?field=fldtxt:string", "layer1", "memory") self.layer2 = QgsVectorLayer("Point?field=fldtxt:string", "layer2", "memory") self.layer3 = QgsVectorLayer("Point?field=fldtxt:string", "layer3", "memory") self.layer4 = QgsVectorLayer("Point?field=fldtxt:string", "layer4", "memory") self.layer5 = QgsVectorLayer("Point?field=fldtxt:string", "layer5", "memory") self.project.addMapLayers([self.layer, self.layer2, self.layer3]) self.model = QgsLayerTreeModel(self.project.layerTreeRoot())
def setRoot(self, root): model = QgsLayerTreeModel(root, self) model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility) model.setFlag(QgsLayerTreeModel.ShowLegendAsTree) font = QFont() font.setPointSize(20) model.setLayerTreeNodeFont(QgsLayerTreeNode.NodeLayer, font) model.setLayerTreeNodeFont(QgsLayerTreeNode.NodeGroup, font) self.layerTree.setModel(model) for layer_node in model.rootGroup().findLayers(): layer = layer_node.layer() if layer.type() == QgsMapLayer.VectorLayer: if layer.geometryType() == QgsWkbTypes.NullGeometry: parent = layer_node.parent() parent.removeLayer(layer)
def __init__(self, parent, db_connection="", audit_table="", table_map={}, replay_function=None): """Constructor. @param parent parent widget """ super(ConfigDialog, self).__init__(parent) self.setupUi(self) self.reloadBtn.setIcon( QIcon( os.path.join(os.path.dirname(__file__), 'icons', 'repeat.svg'))) self._table_map = table_map self.tree_group = QgsProject.instance().layerTreeRoot().clone() self.tree_model = QgsLayerTreeModel(self.tree_group) self.treeView.setModel(self.tree_model) self.treeView.currentLayerChanged.connect(self.onLayerChanged) # Create database connection wrapper. # Disabled transaction group. self.connection_wrapper = ConnectionWrapper() self.connection_wrapper.disableTransactionGroup(True) self.reloadBtn.clicked.connect(self.onDatabaseChanged) self.dbConnectionBtn.clicked.connect(self.onBrowseConnection) self.tableCombo.currentIndexChanged.connect(self.onTableEdit) if db_connection: self.dbConnectionText.setText(db_connection) self.reloadBtn.click() if audit_table: self.auditTableCombo.setCurrentIndex( self.auditTableCombo.findText(audit_table)) if replay_function: self.replayFunctionCombo.setCurrentIndex( self.replayFunctionCombo.findText(replay_function)) self.replayFunctionChk.setChecked(True) self.tables = None
def __init__(self, methodName): """Run once on class initialization.""" unittest.TestCase.__init__(self, methodName) # setup a dummy project self.project = QgsProject() self.layer = QgsVectorLayer("Point?field=fldtxt:string", "layer1", "memory") self.layer2 = QgsVectorLayer("Point?field=fldtxt:string", "layer2", "memory") self.layer3 = QgsVectorLayer("Point?field=fldtxt:string", "layer3", "memory") self.layer4 = QgsVectorLayer("Point?field=fldtxt:string", "layer4", "memory") self.layer5 = QgsVectorLayer("Point?field=fldtxt:string", "layer5", "memory") self.project.addMapLayers([self.layer, self.layer2, self.layer3]) self.model = QgsLayerTreeModel(self.project.layerTreeRoot()) if USE_MODEL_TESTER: self.tester = QAbstractItemModelTester(self.model) self.groupname = "group" self.subgroupname = "sub-group"
class TestQgsLayerTreeView(unittest.TestCase): def __init__(self, methodName): """Run once on class initialization.""" unittest.TestCase.__init__(self, methodName) # setup a dummy project self.project = QgsProject() self.layer = QgsVectorLayer("Point?field=fldtxt:string", "layer1", "memory") self.layer2 = QgsVectorLayer("Point?field=fldtxt:string", "layer2", "memory") self.layer3 = QgsVectorLayer("Point?field=fldtxt:string", "layer3", "memory") self.layer4 = QgsVectorLayer("Point?field=fldtxt:string", "layer4", "memory") self.layer5 = QgsVectorLayer("Point?field=fldtxt:string", "layer5", "memory") self.project.addMapLayers([self.layer, self.layer2, self.layer3]) self.model = QgsLayerTreeModel(self.project.layerTreeRoot()) def nodeOrder(self, group): nodeorder = [] layerTree = QgsLayerTree() for node in group: if QgsLayerTree.isGroup(node): groupname = node.name() nodeorder.append(groupname) for child in self.nodeOrder(node.children()): nodeorder.append(groupname + '-' + child) elif QgsLayerTree.isLayer(node): nodeorder.append(node.layer().name()) return nodeorder def testSetModel(self): view = QgsLayerTreeView() # should not work string_list_model = QStringListModel() view.setModel(string_list_model) self.assertFalse(view.model()) # should work view.setModel(self.model) self.assertEqual(view.model(), self.model) def testSetCurrentLayer(self): view = QgsLayerTreeView() view.setModel(self.model) current_layer_changed_spy = QSignalSpy(view.currentLayerChanged) self.assertFalse(view.currentLayer()) view.setCurrentLayer(self.layer3) self.assertEqual(view.currentLayer(), self.layer3) self.assertEqual(len(current_layer_changed_spy), 1) view.setCurrentLayer(self.layer) self.assertEqual(view.currentLayer(), self.layer) self.assertEqual(len(current_layer_changed_spy), 2) view.setCurrentLayer(None) self.assertFalse(view.currentLayer()) self.assertEqual(len(current_layer_changed_spy), 3) def testDefaultActions(self): view = QgsLayerTreeView() view.setModel(self.model) actions = QgsLayerTreeViewDefaultActions(view) # show in overview action view.setCurrentLayer(self.layer) self.assertEqual(view.currentNode().customProperty('overview', 0), False) show_in_overview = actions.actionShowInOverview() show_in_overview.trigger() self.assertEqual(view.currentNode().customProperty('overview', 0), True) show_in_overview.trigger() self.assertEqual(view.currentNode().customProperty('overview', 0), False) def testMoveOutOfGroupActionLayer(self): """Test move out of group action on layer""" view = QgsLayerTreeView() group = self.project.layerTreeRoot().addGroup("embeddedgroup") group.addLayer(self.layer4) group.addLayer(self.layer5) groupname = group.name() view.setModel(self.model) actions = QgsLayerTreeViewDefaultActions(view) self.assertEqual(self.nodeOrder(self.project.layerTreeRoot().children()), [ self.layer.name(), self.layer2.name(), self.layer3.name(), groupname, groupname + '-' + self.layer4.name(), groupname + '-' + self.layer5.name(), ]) view.setCurrentLayer(self.layer5) moveOutOfGroup = actions.actionMoveOutOfGroup() moveOutOfGroup.trigger() self.assertEqual(self.nodeOrder(self.project.layerTreeRoot().children()), [ self.layer.name(), self.layer2.name(), self.layer3.name(), self.layer5.name(), groupname, groupname + '-' + self.layer4.name(), ]) def testMoveToTopActionLayer(self): """Test move to top action on layer""" view = QgsLayerTreeView() view.setModel(self.model) actions = QgsLayerTreeViewDefaultActions(view) self.assertEqual(self.project.layerTreeRoot().layerOrder(), [self.layer, self.layer2, self.layer3]) view.setCurrentLayer(self.layer3) movetotop = actions.actionMoveToTop() movetotop.trigger() self.assertEqual(self.project.layerTreeRoot().layerOrder(), [self.layer3, self.layer, self.layer2]) def testMoveToTopActionGroup(self): """Test move to top action on group""" view = QgsLayerTreeView() group = self.project.layerTreeRoot().addGroup("embeddedgroup") group.addLayer(self.layer4) group.addLayer(self.layer5) groupname = group.name() view.setModel(self.model) actions = QgsLayerTreeViewDefaultActions(view) self.assertEqual(self.nodeOrder(self.project.layerTreeRoot().children()), [ self.layer.name(), self.layer2.name(), self.layer3.name(), groupname, groupname + '-' + self.layer4.name(), groupname + '-' + self.layer5.name(), ]) nodeLayerIndex = self.model.node2index(group) view.setCurrentIndex(nodeLayerIndex) movetotop = actions.actionMoveToTop() movetotop.trigger() self.assertEqual(self.nodeOrder(self.project.layerTreeRoot().children()), [ groupname, groupname + '-' + self.layer4.name(), groupname + '-' + self.layer5.name(), self.layer.name(), self.layer2.name(), self.layer3.name(), ]) def testMoveToTopActionEmbeddedGroup(self): """Test move to top action on embeddedgroup layer""" view = QgsLayerTreeView() group = self.project.layerTreeRoot().addGroup("embeddedgroup") group.addLayer(self.layer4) group.addLayer(self.layer5) groupname = group.name() view.setModel(self.model) actions = QgsLayerTreeViewDefaultActions(view) self.assertEqual(self.nodeOrder(self.project.layerTreeRoot().children()), [ self.layer.name(), self.layer2.name(), self.layer3.name(), groupname, groupname + '-' + self.layer4.name(), groupname + '-' + self.layer5.name(), ]) view.setCurrentLayer(self.layer5) movetotop = actions.actionMoveToTop() movetotop.trigger() self.assertEqual(self.nodeOrder(self.project.layerTreeRoot().children()), [ self.layer.name(), self.layer2.name(), self.layer3.name(), groupname, groupname + '-' + self.layer5.name(), groupname + '-' + self.layer4.name(), ])
# coding: utf-8 from qgis.core import QgsProject, QgsLayerTreeModel from qgis.gui import QgsLayerTreeView root = QgsProject.instance().layerTreeRoot() model = QgsLayerTreeModel(root) view = QgsLayerTreeView() view.setModel(model) view.show()
def setModel(): self.model = QgsLayerTreeModel(ltg) self.model.setFlag(QgsLayerTreeModel.AllowNodeReorder) self.model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility, True) self.tview.setModel(self.model)
class AuxiliaryLegend(QDockWidget): currentLayerChanged = pyqtSignal("QgsMapLayer") currentLayerQgis = pyqtSignal("QgsMapLayer") syncGroupLayer = pyqtSignal() addSelectedLayersQgis = pyqtSignal() removeLayer = pyqtSignal("QgsMapLayer") needSelectLayer = pyqtSignal() closed = pyqtSignal() def __init__(self, parent, numWin): def setTreeView(): def setModel(): self.model = QgsLayerTreeModel(ltg) self.model.setFlag(QgsLayerTreeModel.AllowNodeReorder) self.model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility, True) self.tview.setModel(self.model) self.tview = QgsLayerTreeView(self) self.tview.setSelectionMode(QAbstractItemView.ExtendedSelection) setModel() self.tview.currentLayerChanged.connect( self.currentLayerChanged.emit) def setupUi(): self.setAllowedAreas(Qt.LeftDockWidgetArea) winLegend.setWindowFlags(Qt.Widget) toolBar.setFloatable(False) toolBar.setMovable(False) winLegend.addToolBar(toolBar) self.setWidget(winLegend) def addActions(): actn = QAction(winLegend) actn.setIcon(qgis.utils.iface.actionShowSelectedLayers().icon()) actn.setIconText('Show selected layers') actn.setObjectName('showLayer') actn.triggered.connect(self.onAction) toolBar.addAction(actn) actn = QAction(winLegend) actn.setIcon(qgis.utils.iface.actionHideSelectedLayers().icon()) actn.setIconText('Hide selected layers') actn.setObjectName('hideLayer') actn.triggered.connect(self.onAction) toolBar.addAction(actn) actn = QAction(winLegend) actn.setIcon(qgis.utils.iface.actionRemoveLayer().icon()) actn.setIconText('Remove selected layers') actn.setObjectName('removeLayer') actn.triggered.connect(self.onAction) toolBar.addAction(actn) toolBar.addSeparator() actn = QAction(winLegend) actn.setIcon(qgis.utils.iface.actionDuplicateLayer().icon()) actn.setIconText('Add selected layers from main map') actn.setObjectName('addLayer') actn.triggered.connect(self.onAction) toolBar.addAction(actn) actn = QAction(winLegend) actn.setIcon( QIcon( os.path.join(os.path.dirname(__file__), 'mActionCurrentLayer.png'))) actn.setIconText('Current layer for main map') actn.setObjectName('currentLayer') actn.triggered.connect(self.onAction) toolBar.addAction(actn) actn = QAction(winLegend) actn.setIcon( QIcon( os.path.join(os.path.dirname(__file__), 'mActionAddGroup.png'))) actn.setObjectName('syncGroup') actn.triggered.connect(self.onAction) toolBar.addAction(actn) super(AuxiliaryLegend, self).__init__("#%d - Layers" % numWin, parent) ltg = parent.ltg self.tview = self.model = self.bridge = None self.textSync = "Sync with group(main map) for new layers" self.actSync = None setTreeView() winLegend = QMainWindow(self) toolBar = QToolBar(winLegend) setupUi() addActions() self.addNameSyncGroup("None") winLegend.setCentralWidget(self.tview) def addNameSyncGroup(self, name): act = self.findChild(QAction, 'syncGroup') text = "%s -> %s" % (self.textSync, name) act.setIconText(text) def setBridge(self, canvas): ltg = self.model.rootGroup() self.bridge = QgsLayerTreeMapCanvasBridge( ltg, canvas) # Need wait populate ltg def clearBridge(self): if not self.bridge is None: self.bridge.clear() def closeEvent(self, event): event.accept() self.closed.emit() @pyqtSlot() def onAction(self): nameSender = self.sender().objectName() if nameSender in ('showLayer', 'hideLayer', 'removeLayer'): nodes = self.tview.selectedLayerNodes() if len(nodes) == 0: self.needSelectLayer.emit() return if nameSender in ('showLayer', 'hideLayer'): checked = Qt.Checked if nameSender == 'showLayer' else Qt.Unchecked map(lambda item: item.setVisible(checked), nodes) else: ltg = self.model.rootGroup() for node in nodes: self.removeLayer.emit(node.layer()) ltg.removeChildNode(node) # addLayer, currentLayer else: if nameSender == 'addLayer': self.addSelectedLayersQgis.emit() elif nameSender == 'currentLayer': self.currentLayerQgis.emit(self.tview.currentLayer()) else: self.syncGroupLayer.emit()
class see_map(QDialog): #app2 = QgsApplication([], True) #app2.initQgis() def __init__(self, file_name): super().__init__() # Creación del Lienzo / Canvas self.canvas = QgsMapCanvas(self) self.setWindowTitle("Map of Track / Mapa del Recorrido") self.canvas.setCanvasColor(Qt.white) self.initGui() if not file_name == None: vlayer = QgsVectorLayer(file_name, "Track Converted", "ogr") #vlayer.updateExtents() self.project.instance().addMapLayer(vlayer) vlayer.renderer().symbol().setWidth(2) vlayer.renderer().symbol().setColor(QColor.fromRgb(250, 0, 0)) self.view.refreshLayerSymbology(vlayer.id()) uri = 'crs=EPSG:4326&dpiMode=7&format=image/jpeg&layers=IGNBaseTodo&styles=default&tileMatrixSet=EPSG:4326&url=http://www.ign.es/wmts/ign-base' map_spain = QgsRasterLayer(uri, "Spain", "wms") self.root.insertLayer(1, map_spain) self.project.instance().addMapLayer(map_spain) if not map_spain.isValid(): print("Track failed to load! /n" + file_name) else: print("Track Load Correct! " + file_name) else: uri = 'crs=EPSG:4326&dpiMode=7&format=image/jpeg&layers=IGNBaseTodo&styles=default&tileMatrixSet=EPSG:4326&url=http://www.ign.es/wmts/ign-base' map_spain = QgsRasterLayer(uri, "Spain", "wms") self.project.instance().addMapLayer(map_spain) if not map_spain.isValid(): print("Track failed to load! /n" + file_name) else: print("Track Load Correct! " + file_name) def zoomIn(self): self.canvas.setMapTool(self.toolZoomIn) def zoomOut(self): self.canvas.setMapTool(self.toolZoomOut) def pan(self): self.canvas.setMapTool(self.toolPan) def file(self): filename, _ = QFileDialog.getOpenFileName(self, 'Selecciona Fichero GPX', 'c:/', 'QGis (*.qgz)') if filename: self.project.read(filename) def initGui(self): icon = QIcon() icon.addPixmap( QPixmap( "C:/Roberto/Visual_Studio_Code/GisBike/programa/IMG/Qgis.png"), QIcon.Normal, QIcon.Off) self.setWindowIcon(icon) self.setWindowModality(Qt.WindowModal) self.setWindowFlags(Qt.Window | Qt.WindowSystemMenuHint | Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint) self.resize(1200, 600) self.verticalLayout_2 = QVBoxLayout(self) self.splitter = QSplitter(self) self.splitter.setOrientation(Qt.Horizontal) self.actionZoomIn = QPushButton("Zoom in", self.splitter) self.actionZoomOut = QPushButton("Zoom out", self.splitter) self.actionPan = QPushButton("Pan", self.splitter) self.actionFile = QPushButton("File", self.splitter) self.project = QgsProject.instance() self.project.read('C:/Users/Fcc/Desktop/QGis/pruebas2.qgz') self.root = QgsProject.instance().layerTreeRoot() self.bridge = QgsLayerTreeMapCanvasBridge(self.root, self.canvas) self.bridge.setCanvasLayers() self.bridge.setAutoSetupOnFirstLayer(True) #https://gis.stackexchange.com/questions/141516/adding-legend-to-canvas-in-standalone-pyqgis-application self.model = QgsLayerTreeModel(self.root) self.model.setFlag(QgsLayerTreeModel.AllowNodeReorder) self.model.setFlag(QgsLayerTreeModel.AllowNodeRename) self.model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility) self.model.setFlag(QgsLayerTreeModel.ShowLegend) self.view = QgsLayerTreeView(self.splitter) self.view.setModel(self.model) self.view.setFixedWidth(150) #self.view.resize(150,600) self.widget = QWidget(self.splitter) self.verticalLayout = QVBoxLayout(self.widget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout = QHBoxLayout() self.horizontalLayout.addWidget(self.actionZoomIn) self.horizontalLayout.addWidget(self.actionZoomOut) self.horizontalLayout.addWidget(self.actionPan) self.horizontalLayout.addWidget(self.actionFile) self.verticalLayout.addLayout(self.horizontalLayout) self.verticalLayout.addWidget(self.canvas) self.verticalLayout_2.addWidget(self.splitter) self.actionZoomIn.clicked.connect(self.zoomIn) self.actionZoomOut.clicked.connect(self.zoomOut) self.actionPan.clicked.connect(self.pan) self.actionFile.clicked.connect(self.file) # create the map tools self.toolPan = QgsMapToolPan(self.canvas) self.toolZoomIn = QgsMapToolZoom(self.canvas, False) # false = in self.toolZoomOut = QgsMapToolZoom(self.canvas, True) # true = out
class AuxiliaryLegend( QDockWidget ): currentLayerChanged = pyqtSignal( "QgsMapLayer" ) currentLayerQgis = pyqtSignal( "QgsMapLayer" ) syncGroupLayer = pyqtSignal() addSelectedLayersQgis = pyqtSignal() removeLayer = pyqtSignal( "QgsMapLayer" ) needSelectLayer = pyqtSignal() closed = pyqtSignal() def __init__( self, parent, numWin ): def setTreeView(): def setModel(): self.model = QgsLayerTreeModel( ltg ) self.model.setFlag( QgsLayerTreeModel.AllowNodeReorder ) self.model.setFlag( QgsLayerTreeModel.AllowNodeChangeVisibility, True ) self.tview.setModel( self.model ) self.tview = QgsLayerTreeView( self ) self.tview.setSelectionMode( QAbstractItemView.ExtendedSelection ) setModel() self.tview.currentLayerChanged.connect( self.currentLayerChanged.emit ) def setupUi(): self.setAllowedAreas( Qt.LeftDockWidgetArea ) winLegend.setWindowFlags( Qt.Widget ) toolBar.setFloatable( False ) toolBar.setMovable( False ) winLegend.addToolBar( toolBar ) self.setWidget( winLegend ) def addActions(): actn = QAction( winLegend ) actn.setIcon( qgis.utils.iface.actionShowSelectedLayers().icon() ) actn.setIconText( 'Show selected layers') actn.setObjectName( 'showLayer') actn.triggered.connect( self.onAction ) toolBar.addAction( actn ) actn = QAction( winLegend ) actn.setIcon( qgis.utils.iface.actionHideSelectedLayers().icon() ) actn.setIconText( 'Hide selected layers') actn.setObjectName( 'hideLayer') actn.triggered.connect( self.onAction ) toolBar.addAction( actn ) actn = QAction( winLegend ) actn.setIcon( qgis.utils.iface.actionRemoveLayer().icon() ) actn.setIconText( 'Remove selected layers') actn.setObjectName( 'removeLayer') actn.triggered.connect( self.onAction ) toolBar.addAction( actn ) toolBar.addSeparator() actn = QAction( winLegend ) actn.setIcon( qgis.utils.iface.actionDuplicateLayer().icon() ) actn.setIconText( 'Add selected layers from main map') actn.setObjectName( 'addLayer') actn.triggered.connect( self.onAction ) toolBar.addAction( actn ) actn = QAction( winLegend ) actn.setIcon( QIcon( os.path.join( os.path.dirname(__file__), 'mActionCurrentLayer.png' ) ) ) actn.setIconText( 'Current layer for main map') actn.setObjectName( 'currentLayer') actn.triggered.connect( self.onAction ) toolBar.addAction( actn ) actn = QAction( winLegend ) actn.setIcon( QIcon( os.path.join( os.path.dirname(__file__), 'mActionAddGroup.png' ) ) ) actn.setObjectName( 'syncGroup' ) actn.triggered.connect( self.onAction ) toolBar.addAction( actn ) super( AuxiliaryLegend, self ).__init__( "#%d - Layers" % numWin, parent ) ltg = parent.ltg self.tview = self.model = self.bridge = None self.textSync = "Sync with group(main map) for new layers" self.actSync = None setTreeView() winLegend = QMainWindow( self ) toolBar = QToolBar( winLegend ) setupUi() addActions() self.addNameSyncGroup( "None" ) winLegend.setCentralWidget( self.tview ) def addNameSyncGroup(self, name): act = self.findChild( QAction, 'syncGroup' ) text = "%s -> %s" % ( self.textSync, name ) act.setIconText( text ) def setBridge(self, canvas): ltg = self.model.rootGroup() self.bridge = QgsLayerTreeMapCanvasBridge( ltg, canvas ) # Need wait populate ltg def clearBridge(self): if not self.bridge is None: self.bridge.clear() def closeEvent(self, event): event.accept() self.closed.emit() @pyqtSlot() def onAction(self): nameSender = self.sender().objectName() if nameSender in ( 'showLayer', 'hideLayer', 'removeLayer'): nodes = self.tview.selectedLayerNodes() if len( nodes ) == 0: self.needSelectLayer.emit() return if nameSender in ( 'showLayer', 'hideLayer'): checked = Qt.Checked if nameSender == 'showLayer' else Qt.Unchecked map( lambda item: item.setVisible( checked ), nodes ) else: ltg = self.model.rootGroup() for node in nodes: self.removeLayer.emit( node.layer() ) ltg.removeChildNode( node ) # addLayer, currentLayer else: if nameSender == 'addLayer': self.addSelectedLayersQgis.emit() elif nameSender == 'currentLayer': self.currentLayerQgis.emit( self.tview.currentLayer() ) else: self.syncGroupLayer.emit()
def initGui(self): icon = QIcon() icon.addPixmap( QPixmap( "C:/Roberto/Visual_Studio_Code/GisBike/programa/IMG/Qgis.png"), QIcon.Normal, QIcon.Off) self.setWindowIcon(icon) self.setWindowModality(Qt.WindowModal) self.setWindowFlags(Qt.Window | Qt.WindowSystemMenuHint | Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint) self.resize(1200, 600) self.verticalLayout_2 = QVBoxLayout(self) self.splitter = QSplitter(self) self.splitter.setOrientation(Qt.Horizontal) self.actionZoomIn = QPushButton("Zoom in", self.splitter) self.actionZoomOut = QPushButton("Zoom out", self.splitter) self.actionPan = QPushButton("Pan", self.splitter) self.actionFile = QPushButton("File", self.splitter) self.project = QgsProject.instance() self.project.read('C:/Users/Fcc/Desktop/QGis/pruebas2.qgz') self.root = QgsProject.instance().layerTreeRoot() self.bridge = QgsLayerTreeMapCanvasBridge(self.root, self.canvas) self.bridge.setCanvasLayers() self.bridge.setAutoSetupOnFirstLayer(True) #https://gis.stackexchange.com/questions/141516/adding-legend-to-canvas-in-standalone-pyqgis-application self.model = QgsLayerTreeModel(self.root) self.model.setFlag(QgsLayerTreeModel.AllowNodeReorder) self.model.setFlag(QgsLayerTreeModel.AllowNodeRename) self.model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility) self.model.setFlag(QgsLayerTreeModel.ShowLegend) self.view = QgsLayerTreeView(self.splitter) self.view.setModel(self.model) self.view.setFixedWidth(150) #self.view.resize(150,600) self.widget = QWidget(self.splitter) self.verticalLayout = QVBoxLayout(self.widget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout = QHBoxLayout() self.horizontalLayout.addWidget(self.actionZoomIn) self.horizontalLayout.addWidget(self.actionZoomOut) self.horizontalLayout.addWidget(self.actionPan) self.horizontalLayout.addWidget(self.actionFile) self.verticalLayout.addLayout(self.horizontalLayout) self.verticalLayout.addWidget(self.canvas) self.verticalLayout_2.addWidget(self.splitter) self.actionZoomIn.clicked.connect(self.zoomIn) self.actionZoomOut.clicked.connect(self.zoomOut) self.actionPan.clicked.connect(self.pan) self.actionFile.clicked.connect(self.file) # create the map tools self.toolPan = QgsMapToolPan(self.canvas) self.toolZoomIn = QgsMapToolZoom(self.canvas, False) # false = in self.toolZoomOut = QgsMapToolZoom(self.canvas, True) # true = out
class LayerTreeProxyModel(QSortFilterProxyModel): """Proxy model class for layers tree model to enable user choices of packaging.""" LAYER_COL = 0 PACK_COL = 1 KEEP_COL = 2 IGNORE_COL = 3 def __init__(self, parent=None): super(LayerTreeProxyModel, self).__init__(parent) root = QgsProject.instance().layerTreeRoot() self.layer_tree_model = QgsLayerTreeModel(root) self.setSourceModel(self.layer_tree_model) self.layers_state = dict() self.packable = find_packable_layers() for tree_layer in root.findLayers(): if tree_layer.layer() is None: # it is an invalid layer but let's keep it - it might be a valid layer elsewhere lid = tree_layer.layerId() check_col = self.KEEP_COL else: lid = tree_layer.layer().id() check_col = self.PACK_COL if (lid in self.packable and tree_layer.layer().isValid()) else self.KEEP_COL self.layers_state[lid] = check_col def columnCount(self, parent): return 4 def headerData(self, section, orientation, role): if orientation == Qt.Horizontal: if role == Qt.DisplayRole: if section == self.LAYER_COL: return "Layer" elif section == self.PACK_COL: return "Package" elif section == self.KEEP_COL: return "Keep as is" elif section == self.IGNORE_COL: return "Ignore" return self.sourceModel().headerData(section, orientation, role) def index(self, row, column, parent): new_idx = QSortFilterProxyModel.index(self, row, self.LAYER_COL, parent) if column == self.LAYER_COL: return new_idx idx = self.createIndex(row, column, new_idx.internalId()) return idx def toggle_item(self, idx): is_checked = self.data(idx, Qt.CheckStateRole) == Qt.Checked self.setData(idx, Qt.Unchecked if is_checked else Qt.Checked, Qt.CheckStateRole) def map_layer(self, idx): if idx.column() == self.LAYER_COL: node = self.layer_tree_model.index2node(self.mapToSource(idx)) else: node = self.layer_tree_model.index2node( self.mapToSource(self.index(idx.row(), self.LAYER_COL, idx.parent()))) if not node or not QgsProject.instance().layerTreeRoot().isLayer(node): return None return node.layer() def parent(self, child): return QSortFilterProxyModel.parent(self, self.createIndex(child.row(), self.LAYER_COL, child.internalId())) def sibling(self, row, column, idx): parent = idx.parent() return self.index(row, column, parent) def data(self, idx, role): if idx.column() == self.LAYER_COL: return self.layer_tree_model.data(self.mapToSource(idx), role) layer = self.map_layer(idx) if not layer: return QVariant() if role == Qt.CheckStateRole or role == Qt.UserRole: state = self.layers_state[layer.id()] if idx.column() == state: return Qt.Checked else: return Qt.Unchecked return QVariant() def setData(self, index, value, role): if role == Qt.CheckStateRole: layer = self.map_layer(index) if not layer: return False if self.PACK_COL <= index.column() <= self.IGNORE_COL: packable = layer.id() in self.packable if index.column() == self.PACK_COL: checked_col = index.column() if packable else self.KEEP_COL else: checked_col = index.column() self.layers_state[layer.id()] = checked_col idx1 = self.index(index.row(), self.PACK_COL, index.parent()) idx2 = self.index(index.row(), self.IGNORE_COL, index.parent()) self.dataChanged.emit(idx1, idx2) return True return False def filterAcceptsRow(self, source_row, source_parent): node = self.layer_tree_model.index2node(self.layer_tree_model.index(source_row, self.LAYER_COL, source_parent)) return bool(self.node_shown(node)) def node_shown(self, node): if not node: return False if node.nodeType() == QgsLayerTreeNode.NodeGroup: if not node.children(): return False for child in node.children(): if self.node_shown(child): return True else: return False else: layer = node.layer() if not layer: return False return True def flags(self, idx): if idx.column() == self.LAYER_COL: return Qt.ItemIsEnabled layer = self.map_layer(idx) if not layer: return Qt.NoItemFlags else: enabled_flags = Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsUserCheckable if idx.column() == self.LAYER_COL: return Qt.ItemIsEnabled elif idx.column() == self.PACK_COL: return enabled_flags if layer.id() in self.packable else Qt.ItemFlags() elif idx.column() in (self.KEEP_COL, self.IGNORE_COL): return enabled_flags return Qt.ItemFlags()
def __init__(self): super(MainWindow, self).__init__() self.setupUi(self) self.first_flag = True self.setWindowTitle('PyQGIS') # 调整窗口大小 self.resize(800, 600) # 初始化图层树 vl = QVBoxLayout(self.dockWidgetContents) self.layerTreeView = QgsLayerTreeView(self) vl.addWidget(self.layerTreeView) # 初始化地图画布 self.mapCanvas = QgsMapCanvas(self) hl = QHBoxLayout(self.frame) hl.setContentsMargins(0, 0, 0, 0) hl.addWidget(self.mapCanvas) # 建立桥梁 self.model = QgsLayerTreeModel(PROJECT.layerTreeRoot(), self) self.model.setFlag(QgsLayerTreeModel.AllowNodeRename) self.model.setFlag(QgsLayerTreeModel.AllowNodeReorder) self.model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility) self.model.setFlag(QgsLayerTreeModel.ShowLegendAsTree) self.model.setAutoCollapseLegendNodes(10) self.layerTreeView.setModel(self.model) self.layerTreeBridge = QgsLayerTreeMapCanvasBridge( PROJECT.layerTreeRoot(), self.mapCanvas, self) # 显示经纬度 self.mapCanvas.xyCoordinates.connect(self.showLngLat) # 打开工程 self.actionOpen.triggered.connect(self.actionOpenTriggered) # 退出程序 self.actionQuit.triggered.connect(self.close) # 地图工具 # TODO:放大、缩小没有图标 self.actionPanTriggered() self.actionPan.triggered.connect(self.actionPanTriggered) self.actionZoomin.triggered.connect(self.actionZoomInTriggered) self.actionZoomout.triggered.connect(self.actionZoomOutTriggered) self.actionIdentity.triggered.connect(self.actionIdentifyTriggered) # 图层 self.actionShapefile.triggered.connect(self.actionShapefileTriggered) self.actionCsv.triggered.connect(self.actionCsvTriggered) self.actionPostGIS.triggered.connect(self.actionPostGISTriggered) self.actionWFS.triggered.connect(self.actionWFSTriggered) self.actionGeotiff.triggered.connect(self.actionGeotiffTriggered) self.actionXYZ.triggered.connect(self.actionXYZTriggered) # 绘图工具 self.actionPoint.triggered.connect(self.actionPointTriggered) self.actionLine.triggered.connect(self.actionLineTriggered) self.actionRectangle.triggered.connect(self.actionRectangleTriggered) self.actionPolygon.triggered.connect(self.actionPolygonTriggered) # 关于Qt self.actionAboutQt.triggered.connect( lambda: QMessageBox.aboutQt(self, '关于Qt')) self.actionAbout.triggered.connect( lambda: QMessageBox.about(self, '关于', 'PyQGIS二次开发')) # self.actionPan.triggered.connect(self.actionPanTriggered) # self.actionIdentify.triggered.connect(self.actionIdentifyTriggered) # 图层右键菜单 self.customMenuProvider = CustomMenuProvider(self.layerTreeView, self.mapCanvas) self.layerTreeView.setMenuProvider(self.customMenuProvider)
class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super(MainWindow, self).__init__() self.setupUi(self) self.first_flag = True self.setWindowTitle('PyQGIS') # 调整窗口大小 self.resize(800, 600) # 初始化图层树 vl = QVBoxLayout(self.dockWidgetContents) self.layerTreeView = QgsLayerTreeView(self) vl.addWidget(self.layerTreeView) # 初始化地图画布 self.mapCanvas = QgsMapCanvas(self) hl = QHBoxLayout(self.frame) hl.setContentsMargins(0, 0, 0, 0) hl.addWidget(self.mapCanvas) # 建立桥梁 self.model = QgsLayerTreeModel(PROJECT.layerTreeRoot(), self) self.model.setFlag(QgsLayerTreeModel.AllowNodeRename) self.model.setFlag(QgsLayerTreeModel.AllowNodeReorder) self.model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility) self.model.setFlag(QgsLayerTreeModel.ShowLegendAsTree) self.model.setAutoCollapseLegendNodes(10) self.layerTreeView.setModel(self.model) self.layerTreeBridge = QgsLayerTreeMapCanvasBridge( PROJECT.layerTreeRoot(), self.mapCanvas, self) # 显示经纬度 self.mapCanvas.xyCoordinates.connect(self.showLngLat) # 打开工程 self.actionOpen.triggered.connect(self.actionOpenTriggered) # 退出程序 self.actionQuit.triggered.connect(self.close) # 地图工具 # TODO:放大、缩小没有图标 self.actionPanTriggered() self.actionPan.triggered.connect(self.actionPanTriggered) self.actionZoomin.triggered.connect(self.actionZoomInTriggered) self.actionZoomout.triggered.connect(self.actionZoomOutTriggered) self.actionIdentity.triggered.connect(self.actionIdentifyTriggered) # 图层 self.actionShapefile.triggered.connect(self.actionShapefileTriggered) self.actionCsv.triggered.connect(self.actionCsvTriggered) self.actionPostGIS.triggered.connect(self.actionPostGISTriggered) self.actionWFS.triggered.connect(self.actionWFSTriggered) self.actionGeotiff.triggered.connect(self.actionGeotiffTriggered) self.actionXYZ.triggered.connect(self.actionXYZTriggered) # 绘图工具 self.actionPoint.triggered.connect(self.actionPointTriggered) self.actionLine.triggered.connect(self.actionLineTriggered) self.actionRectangle.triggered.connect(self.actionRectangleTriggered) self.actionPolygon.triggered.connect(self.actionPolygonTriggered) # 关于Qt self.actionAboutQt.triggered.connect( lambda: QMessageBox.aboutQt(self, '关于Qt')) self.actionAbout.triggered.connect( lambda: QMessageBox.about(self, '关于', 'PyQGIS二次开发')) # self.actionPan.triggered.connect(self.actionPanTriggered) # self.actionIdentify.triggered.connect(self.actionIdentifyTriggered) # 图层右键菜单 self.customMenuProvider = CustomMenuProvider(self.layerTreeView, self.mapCanvas) self.layerTreeView.setMenuProvider(self.customMenuProvider) # self.layerTreeRegistryBridge = QgsLayerTreeRegistryBridge(PROJECT.layerTreeRoot(), PROJECT, self) def actionOpenTriggered(self): """打开工程""" data_file, ext = QFileDialog.getOpenFileName(self, '打开', '', '工程文件(*.qgs , *.qgz)') if data_file: PROJECT.read(data_file) def actionPanTriggered(self): self.mapTool = QgsMapToolPan(self.mapCanvas) self.mapCanvas.setMapTool(self.mapTool) def actionZoomInTriggered(self): self.mapTool = QgsMapToolZoom(self.mapCanvas, False) self.mapCanvas.setMapTool(self.mapTool) def actionZoomOutTriggered(self): self.mapTool = QgsMapToolZoom(self.mapCanvas, True) self.mapCanvas.setMapTool(self.mapTool) def actionIdentifyTriggered(self): # 设置识别工具 self.identifyTool = QgsMapToolIdentifyFeature(self.mapCanvas) self.identifyTool.featureIdentified.connect(self.showFeatures) self.mapCanvas.setMapTool(self.identifyTool) # 设置需要识别的图层 layers = self.mapCanvas.layers() if layers: # 识别画布中第一个图层 self.identifyTool.setLayer(layers[0]) def showFeatures(self, feature): print(type(feature)) QMessageBox.information(self, '信息', ''.join(feature.attributes())) def actionAddGroupTriggered(self): PROJECT.layerTreeRoot().addGroup('group1') def actionShapefileTriggered(self): """打开shp""" data_file, ext = QFileDialog.getOpenFileName(self, '打开', '', '*.shp') if data_file: layer = QgsVectorLayer( data_file, os.path.splitext(os.path.basename(data_file))[0], "ogr") self.addLayer(layer) def actionCsvTriggered(self): """加载csv数据""" data_file, ext = QFileDialog.getOpenFileName(self, '打开', '', '*.csv') if data_file: # 去掉盘符,否则图层无效 data_file = os.path.splitdrive(data_file)[1] uri = f"file://{data_file}?delimiter=,&xField=x&yField=y" print(uri) layer = QgsVectorLayer(uri, "point", "delimitedtext") self.addLayer(layer) def actionPostGISTriggered(self): """加载postgis图层""" dialog = PostGISDialog(self) if dialog.exec_(): uri = QgsDataSourceUri() uri.setConnection(dialog.lineEditHost.text(), dialog.lineEditPort.text(), dialog.lineEditDatabase.text(), dialog.lineEditUsername.text(), dialog.lineEditPassword.text()) # lineEditGeometryColumn:根据实际情况,可能为:wkb_geometry、geometry、the_geom... uri.setDataSource("public", dialog.lineEditLayer.text(), dialog.lineEditGeometryColumn.text()) layer = QgsVectorLayer(uri.uri(False), dialog.lineEditLayer.text(), "postgres") self.addLayer(layer) def actionWFSTriggered(self): """加载天地图WFS图层""" uri = 'http://gisserver.tianditu.gov.cn/TDTService/wfs?' \ 'srsname=EPSG:4326&typename=TDTService:RESA&version=auto&request=GetFeature&service=WFS' layer = QgsVectorLayer(uri, "RESA", "WFS") self.addLayer(layer) def actionGeotiffTriggered(self): """加载geotiff""" data_file, ext = QFileDialog.getOpenFileName(self, '打开', '', '*.tif') if data_file: layer = QgsRasterLayer(data_file, os.path.basename(data_file)) self.addLayer(layer) def actionXYZTriggered(self): uri = 'type=xyz&' \ 'url=https://www.google.cn/maps/vt?lyrs=s@804%26gl=cn%26x={x}%26y={y}%26z={z}&' \ 'zmax=19&' \ 'zmin=0&' \ 'crs=EPSG3857' layer = QgsRasterLayer(uri, 'google', 'wms') self.addLayer(layer) def addLayer(self, layer): if layer.isValid(): if self.first_flag: self.mapCanvas.setDestinationCrs(layer.crs()) self.mapCanvas.setExtent(layer.extent()) self.first_flag = False PROJECT.addMapLayer(layer) layers = [layer ] + [PROJECT.mapLayer(i) for i in PROJECT.mapLayers()] self.mapCanvas.setLayers(layers) self.mapCanvas.refresh() else: print('图层无效.') def actionPointTriggered(self): self.pointTool = PointMapTool(self.mapCanvas) self.mapCanvas.setMapTool(self.pointTool) def actionLineTriggered(self): self.lineTool = LineMapTool(self.mapCanvas) self.mapCanvas.setMapTool(self.lineTool) def actionRectangleTriggered(self): self.rectangleTool = RectangleMapTool(self.mapCanvas) self.mapCanvas.setMapTool(self.rectangleTool) def actionPolygonTriggered(self): self.polygonTool = PolygonMapTool(self.mapCanvas) self.mapCanvas.setMapTool(self.polygonTool) def showLngLat(self, point): x = point.x() y = point.y() self.statusbar.showMessage(f'经度:{x}, 纬度:{y}')
def init_layerTree(self): self.layer_tree_view = QgsLayerTreeView(self) layout = QVBoxLayout(self.layerTreeWidget) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.layer_tree_view) model = QgsLayerTreeModel(QgsProject.instance().layerTreeRoot(), self) model.setFlag(QgsLayerTreeModel.AllowNodeRename) model.setFlag(QgsLayerTreeModel.AllowNodeReorder) model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility) model.setFlag(QgsLayerTreeModel.ShowLegendAsTree) model.setAutoCollapseLegendNodes(10) self.layer_tree_view.setModel(model) provider = MenuProvider(self.layer_tree_view, self.mapCanvas, self.project.instance()) self.layer_tree_view.setMenuProvider(provider) # 注意self.layer_tree_bridge必须有 self.layer_tree_bridge = QgsLayerTreeMapCanvasBridge( self.project.instance().layerTreeRoot(), self.mapCanvas)
class TestQgsLayerTreeView(unittest.TestCase): def __init__(self, methodName): """Run once on class initialization.""" unittest.TestCase.__init__(self, methodName) # setup a dummy project self.project = QgsProject() self.layer = QgsVectorLayer("Point?field=fldtxt:string", "layer1", "memory") self.layer2 = QgsVectorLayer("Point?field=fldtxt:string", "layer2", "memory") self.layer3 = QgsVectorLayer("Point?field=fldtxt:string", "layer3", "memory") self.layer4 = QgsVectorLayer("Point?field=fldtxt:string", "layer4", "memory") self.layer5 = QgsVectorLayer("Point?field=fldtxt:string", "layer5", "memory") self.project.addMapLayers([self.layer, self.layer2, self.layer3]) self.model = QgsLayerTreeModel(self.project.layerTreeRoot()) def nodeOrder(self, group): nodeorder = [] layerTree = QgsLayerTree() for node in group: if QgsLayerTree.isGroup(node): groupname = node.name() nodeorder.append(groupname) for child in self.nodeOrder(node.children()): nodeorder.append(groupname + '-' + child) elif QgsLayerTree.isLayer(node): nodeorder.append(node.layer().name()) return nodeorder def testSetModel(self): view = QgsLayerTreeView() # should not work string_list_model = QStringListModel() view.setModel(string_list_model) self.assertFalse(view.model()) # should work view.setModel(self.model) self.assertEqual(view.model(), self.model) def testSetCurrentLayer(self): view = QgsLayerTreeView() view.setModel(self.model) current_layer_changed_spy = QSignalSpy(view.currentLayerChanged) self.assertFalse(view.currentLayer()) view.setCurrentLayer(self.layer3) self.assertEqual(view.currentLayer(), self.layer3) self.assertEqual(len(current_layer_changed_spy), 1) view.setCurrentLayer(self.layer) self.assertEqual(view.currentLayer(), self.layer) self.assertEqual(len(current_layer_changed_spy), 2) view.setCurrentLayer(None) self.assertFalse(view.currentLayer()) self.assertEqual(len(current_layer_changed_spy), 3) def testDefaultActions(self): view = QgsLayerTreeView() view.setModel(self.model) actions = QgsLayerTreeViewDefaultActions(view) # show in overview action view.setCurrentLayer(self.layer) self.assertEqual(view.currentNode().customProperty('overview', 0), False) show_in_overview = actions.actionShowInOverview() show_in_overview.trigger() self.assertEqual(view.currentNode().customProperty('overview', 0), True) show_in_overview.trigger() self.assertEqual(view.currentNode().customProperty('overview', 0), False) def testMoveOutOfGroupActionLayer(self): """Test move out of group action on layer""" view = QgsLayerTreeView() group = self.project.layerTreeRoot().addGroup("embeddedgroup") group.addLayer(self.layer4) group.addLayer(self.layer5) groupname = group.name() view.setModel(self.model) actions = QgsLayerTreeViewDefaultActions(view) self.assertEqual( self.nodeOrder(self.project.layerTreeRoot().children()), [ self.layer.name(), self.layer2.name(), self.layer3.name(), groupname, groupname + '-' + self.layer4.name(), groupname + '-' + self.layer5.name(), ]) view.setCurrentLayer(self.layer5) moveOutOfGroup = actions.actionMoveOutOfGroup() moveOutOfGroup.trigger() self.assertEqual( self.nodeOrder(self.project.layerTreeRoot().children()), [ self.layer.name(), self.layer2.name(), self.layer3.name(), self.layer5.name(), groupname, groupname + '-' + self.layer4.name(), ]) def testMoveToTopActionLayer(self): """Test move to top action on layer""" view = QgsLayerTreeView() view.setModel(self.model) actions = QgsLayerTreeViewDefaultActions(view) self.assertEqual(self.project.layerTreeRoot().layerOrder(), [self.layer, self.layer2, self.layer3]) view.setCurrentLayer(self.layer3) movetotop = actions.actionMoveToTop() movetotop.trigger() self.assertEqual(self.project.layerTreeRoot().layerOrder(), [self.layer3, self.layer, self.layer2]) def testMoveToTopActionGroup(self): """Test move to top action on group""" view = QgsLayerTreeView() group = self.project.layerTreeRoot().addGroup("embeddedgroup") group.addLayer(self.layer4) group.addLayer(self.layer5) groupname = group.name() view.setModel(self.model) actions = QgsLayerTreeViewDefaultActions(view) self.assertEqual( self.nodeOrder(self.project.layerTreeRoot().children()), [ self.layer.name(), self.layer2.name(), self.layer3.name(), groupname, groupname + '-' + self.layer4.name(), groupname + '-' + self.layer5.name(), ]) nodeLayerIndex = self.model.node2index(group) view.setCurrentIndex(nodeLayerIndex) movetotop = actions.actionMoveToTop() movetotop.trigger() self.assertEqual( self.nodeOrder(self.project.layerTreeRoot().children()), [ groupname, groupname + '-' + self.layer4.name(), groupname + '-' + self.layer5.name(), self.layer.name(), self.layer2.name(), self.layer3.name(), ]) def testMoveToTopActionEmbeddedGroup(self): """Test move to top action on embeddedgroup layer""" view = QgsLayerTreeView() group = self.project.layerTreeRoot().addGroup("embeddedgroup") group.addLayer(self.layer4) group.addLayer(self.layer5) groupname = group.name() view.setModel(self.model) actions = QgsLayerTreeViewDefaultActions(view) self.assertEqual( self.nodeOrder(self.project.layerTreeRoot().children()), [ self.layer.name(), self.layer2.name(), self.layer3.name(), groupname, groupname + '-' + self.layer4.name(), groupname + '-' + self.layer5.name(), ]) view.setCurrentLayer(self.layer5) movetotop = actions.actionMoveToTop() movetotop.trigger() self.assertEqual( self.nodeOrder(self.project.layerTreeRoot().children()), [ self.layer.name(), self.layer2.name(), self.layer3.name(), groupname, groupname + '-' + self.layer5.name(), groupname + '-' + self.layer4.name(), ])
def with_legend_btn_run(self): project = QgsProject.instance() self.checked_layers = [] root = project.layerTreeRoot() for child in root.children(): if child.isVisible() and isinstance(child, QgsLayerTreeLayer): self.checked_layers.append(child.name()) if child.isVisible() and isinstance(child, QgsLayerTreeGroup): self.get_group_layers(child) layersToAdd = [ layer for layer in project.mapLayers().values() if layer.name() in sorted(self.checked_layers, reverse=False) ] layers_names_length = [ len(layer.name()) for layer in project.mapLayers().values() if layer.name() in sorted(self.checked_layers, reverse=False) ] maxlen = max(layers_names_length) root = QgsLayerTree() for layer in layersToAdd: root.addLayer(layer) model = QgsLayerTreeModel(root) lenlen = model.rowCount() view = QgsLayerTreeView() view.setModel(model) view.setFixedHeight(lenlen * 20) view.setFixedWidth(maxlen * 10) legendIm = QImage(QWidget.grab(view)) legendpath = self.plugin_dir + "\\legend.png" legendIm.save(legendpath) legendIm = Image.open(legendpath) #legendIm = legendIm.imageData() legendWidth, legendHeight = legendIm.size main_image = QImage(QWidget.grab(self.iface.mapCanvas())) mainpath = self.plugin_dir + "\\main.png" main_image.save(mainpath) main_image = Image.open(mainpath).convert("RGBA") width, height = main_image.size d = ImageDraw.Draw(main_image) font = ImageFont.truetype("arial.ttf", 16) d.text(((width / 2.5) + len(project.title()), 10), project.title(), fill='black', font=font) if abs(height - width) < 150: sq_fit_size = legendWidth height = legendHeight else: sq_fit_size = width if width > sq_fit_size and height > sq_fit_size: if width > height: height = int((sq_fit_size / width) * height) width = sq_fit_size else: width = int((sq_fit_size / height) * width) height = sq_fit_size main_image = main_image.resize((width, height)) main_image.paste(legendIm, (max(width - legendWidth, 0), height - legendHeight)) finalpath = self.plugin_dir + "\\main.png" main_image.save(finalpath) QApplication.clipboard().setImage(QImage(finalpath)) self.iface.messageBar().pushMessage( 'QCopycanvas', 'Copied map canvas to clipboard with legend', level=Qgis.Success, duration=2)
def renderer(self): if 'QGIS_AUTH_DB_DIR_PATH' not in os.environ: os.environ['QGIS_AUTH_DB_DIR_PATH'] = '/tmp' qgis = None while True: options, result = self.queue.get() # Don't start QGIS until first request if qgis is None: qgis = QgsApplication([], False) qgis.setPrefixPath(self.settings.get('path'), True) qgis.setDefaultSvgPaths(qgis.svgPaths() + self.settings.get('svgpaths')) qgis.setMaxThreads(1) qgis.initQgis() try: if isinstance(options, LegendOptions): style, = options layer = self._qgs_memory_layer(style) layer.setName(style.parent.display_name) QgsMapLayerRegistry.instance().addMapLayer(layer) root = QgsLayerTreeGroup() root.addLayer(layer) # 'Cannot create a QPixmap when no GUI is being used' # warning occurs here model = QgsLayerTreeModel(root) settings = QgsLegendSettings() settings.setTitle('') settings.setBoxSpace(1) settings.setSymbolSize(QSizeF(5, 3)) settings.setDpi(96) renderer = QgsLegendRenderer(model, settings) # Dots per mm dpmm = settings.dpi() / 25.4 min_size = renderer.minimumSize() size = QSize(dpmm * min_size.width(), dpmm * min_size.height()) img = QImage(size, QImage.Format_ARGB32) img.fill(QColor(0, 0, 0, 0)) painter = QPainter() painter.begin(img) painter.scale(dpmm, dpmm) renderer.drawLegend(painter) painter.end() QgsMapLayerRegistry.instance().removeAllMapLayers() ba = QByteArray() bf = QBuffer(ba) bf.open(QIODevice.WriteOnly) img.save(bf, 'PNG') bf.close() buf = StringIO() buf.write(bf.data()) buf.seek(0) result.put(buf) else: path = features = None if isinstance(options, VectorRenderOptions): style, features, render_size, \ extended, target_box = options layer = self._qgs_memory_layer(style, features=features) elif isinstance(options, RasterRenderOptions): style, path, render_size, \ extended, target_box = options layer = QgsRasterLayer(path) layer.loadNamedStyle( self.env.file_storage.filename(style.qml_fileobj)) settings = QgsMapSettings() settings.setLayers([layer.id()]) settings.setFlag(QgsMapSettings.DrawLabeling) settings.setFlag(QgsMapSettings.Antialiasing) settings.setCrsTransformEnabled(True) settings.setDestinationCrs(layer.crs()) settings.setMapUnits(layer.crs().mapUnits()) settings.setOutputSize(QSize(*render_size)) settings.setExtent(QgsRectangle(*extended)) settings.setOutputImageFormat(QImage.Format_ARGB32) bgcolor = QColor.fromRgba(qRgba(255, 255, 255, 0)) settings.setBackgroundColor(bgcolor) settings.setOutputDpi(96) QgsMapLayerRegistry.instance().addMapLayer(layer) settings.setLayers([layer.id()]) # Create QImage by hand to be able to use # QgsMapRendererCustomPainterJob. Others will not # allow to workaround a bug with overlay rendering. img = QImage(settings.outputSize(), QImage.Format_ARGB32) # These cludges are needed for rendering # on transparent background, otherwise it's a mess. img.fill(QColor.fromRgba(qRgba(255, 255, 255, 255))) img.fill(QColor.fromRgba(qRgba(255, 255, 255, 0))) # DPI should be equal to settings, otherwise an error. # In QImage the resolution is set in dots per meter # for each axis. dpm = settings.outputDpi() / 25.4 * 1000 img.setDotsPerMeterX(dpm) img.setDotsPerMeterY(dpm) painter = QPainter(img) job = QgsMapRendererCustomPainterJob(settings, painter) job.renderSynchronously() painter.end() QgsMapLayerRegistry.instance().removeAllMapLayers() img = self._qimage_to_pil(img) # Clip needed part result.put(img.crop(target_box)) # Cleanup if path is not None: gdal.Unlink(path) except Exception as exc: self.logger.error(exc.message) result.put(exc) qgis.exitQgis()
def setModel(): self.model = QgsLayerTreeModel( ltg ) self.model.setFlag( QgsLayerTreeModel.AllowNodeReorder ) self.model.setFlag( QgsLayerTreeModel.AllowNodeChangeVisibility, True ) self.tview.setModel( self.model )