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 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)
示例#5
0
    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)
示例#6
0
    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])
示例#7
0
    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)
示例#8
0
    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(),
            ])
示例#9
0
    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()
            ])
示例#10
0
 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)
     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)
示例#12
0
    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)
示例#13
0
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)
示例#14
0
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())