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 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 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 testMoveToBottomActionLayer(self): """Test move to bottom action on layer""" view = QgsLayerTreeView() view.setModel(self.model) if USE_MODEL_TESTER: proxy_tester = QAbstractItemModelTester(view.model()) actions = QgsLayerTreeViewDefaultActions(view) self.assertEqual(self.project.layerTreeRoot().layerOrder(), [self.layer, self.layer2, self.layer3]) view.setCurrentLayer(self.layer) movetobottom = actions.actionMoveToBottom() movetobottom.trigger() self.assertEqual(self.project.layerTreeRoot().layerOrder(), [self.layer2, self.layer3, self.layer])
def testDefaultActions(self): view = QgsLayerTreeView() view.setModel(self.model) if USE_MODEL_TESTER: proxy_tester = QAbstractItemModelTester(view.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 testMoveToBottomActionLayerAndGroup(self): """Test move to top action for a group and it's layer simultaneously""" view = QgsLayerTreeView() group = self.project.layerTreeRoot().insertGroup(0, "embeddedgroup") group.addLayer(self.layer4) group.addLayer(self.layer5) groupname = group.name() view.setModel(self.model) if USE_MODEL_TESTER: proxy_tester = QAbstractItemModelTester(view.model()) actions = QgsLayerTreeViewDefaultActions(view) 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(), ]) selectionMode = view.selectionMode() view.setSelectionMode(QgsLayerTreeView.MultiSelection) nodeLayerIndex = view.node2index(group) view.setCurrentIndex(nodeLayerIndex) view.setCurrentLayer(self.layer4) view.setSelectionMode(selectionMode) movetobottom = actions.actionMoveToBottom() movetobottom.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 testAddGroupActionLayers(self): """Test add group action on several layers""" view = QgsLayerTreeView() group = self.project.layerTreeRoot().insertGroup(0, "embeddedgroup") group.addLayer(self.layer4) group.addLayer(self.layer5) groupname = group.name() view.setModel(self.model) if USE_MODEL_TESTER: proxy_tester = QAbstractItemModelTester(view.model()) actions = QgsLayerTreeViewDefaultActions(view) 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(), ]) selectionMode = view.selectionMode() view.setSelectionMode(QgsLayerTreeView.MultiSelection) view.setCurrentLayer(self.layer) view.setCurrentLayer(self.layer2) view.setSelectionMode(selectionMode) addgroup = actions.actionAddGroup() addgroup.trigger() self.assertEqual( self.nodeOrder(self.project.layerTreeRoot().children()), [ groupname, groupname + '-' + self.layer4.name(), groupname + '-' + self.layer5.name(), self.groupname + '1', self.groupname + '1' + '-' + self.layer.name(), self.groupname + '1' + '-' + self.layer2.name(), self.layer3.name() ])
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 testSetCurrentLayer(self): view = QgsLayerTreeView() view.setModel(self.model) if USE_MODEL_TESTER: proxy_tester = QAbstractItemModelTester(view.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)
class MapExplorer(QMainWindow, Ui_MainWindow): def __init__(self): super(MapExplorer, self).__init__() self.project = QgsProject() self.band_synthesis_window = Band_Synthesis_Component() self.kmeans_window = KMeans_Component() self.meanshift_window = MeanShift_Component() self.dbscan_window = DBScan_Component() self.setupUi(self) self.init_mapcanvas() self.slot_connect() self.init_layerTree() self.style_stand() 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) def slot_connect(self): self.actionopen_file.triggered.connect(self.action_open_triggered) self.actionzoom_in.triggered.connect(self.action_zoomin_triggered) self.actionzoom_out.triggered.connect(self.action_zoomout_triggered) self.actionpan.triggered.connect(self.action_pan_triggered) self.actionfull_extent.triggered.connect( self.action_fullextent_triggered) self.action_select.triggered.connect(self.action_select_triggered) self.actionsave.triggered.connect(self.action_save_triggered) self.mapdecoration.triggered.connect(self.mapDecoration_show) self.actionAqua.triggered.connect(self.style_Aqua) self.actionstand.triggered.connect(self.style_stand) self.actionConsoleStule.triggered.connect(self.style_ConsoleStyle) self.actionElegantDark.triggered.connect(self.style_ElegantDark) self.actionManjaroMix.triggered.connect(self.style_ManjaroMix) self.actionMaterialDark.triggered.connect(self.style_MaterialDark) self.actionUbuntu.triggered.connect(self.style_Ubuntu) self.action_KMeans.triggered.connect(self.action_KMeans_triggered) self.action_DBScan.triggered.connect(self.action_DBScan_triggered) self.action_MeanShift.triggered.connect( self.action_Meanshift_triggered) self.action_band_synthesis.triggered.connect( self.action_band_synthesis_triggered) self.kmeans_window.add_layer_signal.connect( self.action_add_kmeans_result) self.dbscan_window.add_layer_signal.connect( self.action_add_dbscan_result) self.meanshift_window.add_layer_signal.connect( self.action_add_meanshift_result) self.band_synthesis_window.add_layer_signal.connect( self.action_add_band_synthesis_result) def init_mapcanvas(self): # 实例化地图画布 self.mapCanvas = QgsMapCanvas() self.mapCanvas.xyCoordinates.connect(self.show_lonlat) self.mapCanvas.setCanvasColor(QColor(60, 63, 65, 100)) # self.mapCanvas.show() layout = QVBoxLayout(self.mapWidget) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.mapCanvas) def loadMap(self, fullpath, classArray=None): print(fullpath[-3:-1] + fullpath[-1]) imgClass = fullpath[-3:-1] + fullpath[-1] basename = os.path.splitext(os.path.basename(fullpath))[0] if imgClass == 'shp': self.layer = QgsVectorLayer(fullpath, basename, "ogr") else: self.layer = QgsRasterLayer(fullpath, basename) # 添加图例 if classArray: self.node = QgsLayerTreeLayer(self.layer) # self.classArray = [{'name':'class1','color':QColor(0,0,0)},{'name':'class1','color':QColor(0,255,0)}] self.legend = CustomViewerLegend(classArray) self.legend.createLayerTreeModelLegendNodes(self.node) self.layer.setLegend(self.legend) # 注册图层 self.project.instance().addMapLayer(self.layer) self.mapCanvas.setLayers([self.layer]) # 设置图层范围 self.mapCanvas.setExtent(self.layer.extent()) self.mapCanvas.refresh() self.layer_tree_view.setCurrentLayer(self.layer) def action_open_triggered(self): fullpath, format = QFileDialog.getOpenFileName( self, '打开数据', '', '*.shp;;*.jpg;;*.png;;*.tif') if os.path.exists(fullpath): self.loadMap(fullpath) def action_save_triggered(self): fullpath, format = QFileDialog.getSaveFileName(self, '保存数据', '', '*.tif') if os.path.exists(fullpath): self.mapCanvas.saveAsImage(fullpath) def action_zoomin_triggered(self): self.maptool = QgsMapToolZoom(self.mapCanvas, False) self.mapCanvas.setMapTool(self.maptool) def action_zoomout_triggered(self): self.maptool = QgsMapToolZoom(self.mapCanvas, True) self.mapCanvas.setMapTool(self.maptool) def action_pan_triggered(self): self.maptool = QgsMapToolPan(self.mapCanvas) self.mapCanvas.setMapTool(self.maptool) def action_fullextent_triggered(self): self.mapCanvas.setExtent(self.layer.extent()) self.mapCanvas.refresh() def action_select_triggered(self): self.maptool = PolygonMapTool(self) self.mapCanvas.setMapTool(self.maptool, True) self.mapCanvas.refresh() def mapDecoration_show(self): self.mapdecoration_dia = layerOut(QgsProject.instance(), self.qssStyleDia) self.mapdecoration_dia.show() # 显示鼠标点的经纬度信息 def show_lonlat(self, point): x = point.x() y = point.y() self.statusbar.showMessage(f'经度:{x},纬度:{y}') def style_stand(self): styleFile = './QSS-master/style.qss' self.qssStyle = CommonHelper.readQSS(styleFile) self.qssStyleDia = CommonHelper.readQSS('./QSS-master/ElegantDark.qss') QMainWindow.setStyleSheet(self, self.qssStyle) def style_Aqua(self): styleFile = './QSS-master/Aqua.qss' self.qssStyle = CommonHelper.readQSS(styleFile) self.qssStyleDia = CommonHelper.readQSS(styleFile) QMainWindow.setStyleSheet(self, self.qssStyle) def style_ConsoleStyle(self): styleFile = './QSS-master/ConsoleStyle.qss' self.qssStyle = CommonHelper.readQSS(styleFile) self.qssStyleDia = CommonHelper.readQSS(styleFile) QMainWindow.setStyleSheet(self, self.qssStyle) def style_ElegantDark(self): styleFile = './QSS-master/ElegantDark.qss' self.qssStyle = CommonHelper.readQSS(styleFile) self.qssStyleDia = CommonHelper.readQSS(styleFile) QMainWindow.setStyleSheet(self, self.qssStyle) def style_ManjaroMix(self): styleFile = './QSS-master/ManjaroMix.qss' self.qssStyle = CommonHelper.readQSS(styleFile) self.qssStyleDia = CommonHelper.readQSS(styleFile) QMainWindow.setStyleSheet(self, self.qssStyle) def style_MaterialDark(self): styleFile = './QSS-master/MaterialDark.qss' self.qssStyle = CommonHelper.readQSS(styleFile) self.qssStyleDia = CommonHelper.readQSS(styleFile) QMainWindow.setStyleSheet(self, self.qssStyle) def style_Ubuntu(self): styleFile = './QSS-master/Ubuntu.qss' self.qssStyle = CommonHelper.readQSS(styleFile) self.qssStyleDia = CommonHelper.readQSS(styleFile) QMainWindow.setStyleSheet(self, self.qssStyle) def action_band_synthesis_triggered(self): self.band_synthesis_window.show() def action_KMeans_triggered(self): self.kmeans_window.show() def action_DBScan_triggered(self): self.dbscan_window.show() def action_Meanshift_triggered(self): self.meanshift_window.show() def action_add_kmeans_result(self, kmeans_img_path, layer_legends): self.loadMap(kmeans_img_path, layer_legends) def action_add_dbscan_result(self, dbscan_img_path, layer_legends): self.loadMap(dbscan_img_path, layer_legends) def action_add_meanshift_result(self, meanshift_img_path, layer_legends): self.loadMap(meanshift_img_path, layer_legends) def action_add_band_synthesis_result(self, multiband_img_path): self.loadMap(multiband_img_path)
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())