Exemplo n.º 1
0
class IDESCaliWebServices:
    def __init__(self, iFace):
        self.iFace = iFace
        self.plugin_dir = os.path.dirname(__file__)
        locale = QSettings().value('locale/userLocale')[0:2]
        locale_path = os.path.join(self.plugin_dir, 'i18n',
                                   'IDESCaliWebServices_{}.qm'.format(locale))

        if os.path.exists(locale_path):
            self.translator = QTranslator()
            self.translator.load(locale_path)
            QCoreApplication.installTranslator(self.translator)

        self.dlg = IDESCaliWebServicesDialog()
        self.dlginfo = InfoDialog()
        self.generatedService = None
        self.bar = QProgressBar()
        self.bar.setRange(0, 0)
        self.bar.setGeometry(950, 500, 200, 25)
        self.actions = []
        self.menu = self.tr(u'&Servicios WMS - Geoportal IDESC')
        self.first_start = None

    def tr(self, message):
        return QCoreApplication.translate('IDESCaliWebServices', message)

    def add_action(self,
                   icon_path,
                   text,
                   callback,
                   enabled_flag=True,
                   add_to_menu=True,
                   add_to_toolbar=True,
                   status_tip=None,
                   whats_this=None,
                   parent=None):

        icon = QIcon(icon_path)
        action = QAction(icon, text, parent)
        action.triggered.connect(callback)
        action.setEnabled(enabled_flag)

        if status_tip is not None:
            action.setStatusTip(status_tip)

        if whats_this is not None:
            action.setWhatsThis(whats_this)

        if add_to_toolbar:
            self.iFace.addToolBarIcon(action)

        if add_to_menu:
            self.iFace.addPluginToWebMenu(self.menu, action)

        self.actions.append(action)

        return action

    def initGui(self):
        self.add_all_action()
        self.dlg.table_widget.itemSelectionChanged.connect(self.updateDesc)
        self.dlg.help_button.clicked.connect(self.openDlgInfo)
        self.dlg.close_button.clicked.connect(self.closeDlg)
        self.dlg.search_box.textEdited.connect(self.search)
        self.dlg.add_button.released.connect(self.loadWebService)
        self.dlginfo.ok_dialog.released.connect(self.closeAbout)
        self.first_start = True

    def unload(self):
        """Removes the plugin menu item and icon from QGIS GUI."""
        for action in self.actions:
            self.iFace.removePluginWebMenu(
                self.tr(u'&Servicios WMS - Geoportal IDESC'), action)
            self.iFace.removeToolBarIcon(action)

    def run(self):
        if self.generatedService.web_map_service is not None:
            self.dlg.search_box.clear()
            self.fill_table(self.generatedService.web_map_service.contents)
            self.dlg.show()
            result = self.dlg.exec_()
            if result:
                pass

    def run_0(self):
        self.loadServiceList(Service.IDESCaliDataset.value)
        self.run()

    def add_all_action(self):
        icon_path = ':/plugins/idescali_ws/icon.png'

        self.add_action(icon_path,
                        text=self.tr(
                            service_text_map[Service.IDESCaliDataset.value]),
                        callback=self.run_0,
                        whats_this=str(Service.IDESCaliDataset.value),
                        parent=self.iFace.mainWindow())

    def loadServiceList(self, service_id: int):
        self.generatedService = WebMapServiceClass(service_id)
        url = self.generatedService.service_url
        self.bar.show()
        if self.generatedService.service_type == ServiceType.WebMapService.value:
            try:
                wms = WebMapService(url)
                self.generatedService.setWebMapService(wms)
            except Exception as e:
                QMessageBox.information(
                    None, "ERROR:",
                    'No se puede cargar este servicio en este momento.' +
                    str(e))
        elif self.generatedService.service_type == ServiceType.WebMapTileService.value:
            try:
                wmts = WebMapTileService(url)
                self.generatedService.setWebMapService(wmts)
            except Exception as e:
                QMessageBox.information(
                    None, "ERROR:",
                    'No se puede acceder a este servicio en este momento.' +
                    str(e))
        self.bar.close()

    def openDlgInfo(self):
        self.dlginfo.show()

    def closeDlg(self):
        self.generatedService = None
        self.dlg.search_box.clear()
        self.dlg.table_widget.setRowCount(0)
        self.dlg.table_widget.setColumnCount(0)
        self.dlg.layer_name_box.clear()
        self.dlg.close()
        if self.dlginfo:
            self.dlginfo.close()

    def closeAbout(self):
        if self.dlginfo:
            self.dlginfo.close()

    def fill_table(self, contentOrderedDict):
        self.dlg.table_widget.setRowCount(0)
        count = self.dlg.table_widget.rowCount()
        self.dlg.table_widget.setColumnCount(4)

        for content in contentOrderedDict:
            index = count
            name = contentOrderedDict[content].name
            title = contentOrderedDict[content].title
            abstract = contentOrderedDict[content].abstract
            self.dlg.table_widget.insertRow(index)
            self.dlg.table_widget.setItem(index, 1,
                                          QTableWidgetItem(str(name)))
            self.dlg.table_widget.setItem(index, 2,
                                          QTableWidgetItem(str(title)))
            self.dlg.table_widget.setItem(index, 3,
                                          QTableWidgetItem(str(abstract)))

        self.dlg.table_widget.setHorizontalHeaderLabels(
            ["ID", "Capa", "Nombre", "Resumen"])
        self.dlg.label_conteo.setText("Capas disponibles: " +
                                      str(len(contentOrderedDict)))
        self.setTableWidgetBehaviour()

    def setTableWidgetBehaviour(self):
        self.dlg.table_widget.setColumnWidth(0, 0)
        self.dlg.table_widget.setColumnWidth(1, 200)
        self.dlg.table_widget.setColumnWidth(2, 200)
        self.dlg.table_widget.setColumnWidth(3, 200)
        self.dlg.table_widget.horizontalHeader().setSectionResizeMode(
            QHeaderView.Fixed)
        self.dlg.table_widget.verticalHeader().setSectionResizeMode(
            QHeaderView.Fixed)

        self.dlg.table_widget.setSelectionBehavior(
            QAbstractItemView.SelectRows)
        self.dlg.table_widget.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.dlg.table_widget.setSelectionMode(
            QAbstractItemView.ExtendedSelection)

    def search(self):
        criteria = self.dlg.search_box.text()
        criteria = criteria.lower()
        wms_filtered_contents = OrderedDict()
        contents = self.generatedService.web_map_service.contents
        for content in contents:
            name = contents[content].name
            if criteria in name:
                wms_filtered_contents[content] = contents[content]
        self.fill_table(wms_filtered_contents)

    def getSelectedItemsFromTable(self):
        rowNames = []
        selected = self.dlg.table_widget.selectedItems()
        if len(selected) > 0:
            for i in range(0, len(selected), 4):
                row = self.dlg.table_widget.row(selected[i])
                name = self.dlg.table_widget.item(row, 1).text()
                rowNames.append(name)

        selectedServices = OrderedDict()
        contents = self.generatedService.web_map_service.contents
        for rowName in rowNames:
            for content in contents:
                name_itr = contents[content].name
                if name_itr == rowName:
                    selectedServices[content] = contents[content]

        return selectedServices

    def updateDesc(self):
        try:
            selectedServices = self.getSelectedItemsFromTable()
            self.dlg.layer_name_box.clear()
            names = ''
            for selectedService in selectedServices:
                name_itr = selectedServices[selectedService].name
                names += name_itr + ','
            names = names[:-1]
            self.dlg.layer_name_box.setText(names)
            self.dlg.layer_name_box.setReadOnly(True)
        except:
            QgsMessageLog.logMessage(
                "No selecciono ninguna capa WMS para cargar")

    def loadWebService(self):
        # get selected items and add to the map
        self.bar.show()
        EPSG_CODE_4326 = 'EPSG:4326'
        selectedServices = self.getSelectedItemsFromTable()
        web_map_service = self.generatedService.web_map_service
        for selectedService in selectedServices:
            if self.generatedService.service_url is not None:
                layer_name = selectedServices[selectedService].name
                url = 'contextualWMSLegend=0'
                if hasattr(web_map_service[layer_name], 'crsOptions'):
                    if len(web_map_service[layer_name].crsOptions) > 0:
                        if EPSG_CODE_4326 in web_map_service[
                                layer_name].crsOptions:
                            url += '&crs=' + EPSG_CODE_4326
                            if self.generatedService.service_type == ServiceType.WebMapTileService.value:
                                url += '&tileMatrixSet=' + EPSG_CODE_4326
                        else:
                            url += '&crs=' + web_map_service[
                                layer_name].crsOptions[0]
                            if self.generatedService.service_type == ServiceType.WebMapTileService.value:
                                url += '&tileMatrixSet=' + web_map_service[
                                    layer_name].crsOptions[0]
                else:
                    url += '&crs=' + EPSG_CODE_4326
                    if self.generatedService.service_type == ServiceType.WebMapTileService.value:
                        url += '&tileMatrixSet=' + EPSG_CODE_4326
                url += '&dpiMode=7&featureCount=10&format=image/png&styles' + \
                       '&layers=' + layer_name + \
                       '&url=' + str(self.generatedService.service_url)
                rlayer = QgsRasterLayer(
                    url, selectedServices[selectedService].title, 'wms')
                if not rlayer.isValid():
                    QMessageBox.information(
                        None, "ERROR:", 'Imposible cargar las capas ' +
                        selectedServices[selectedService].title +
                        ' en este momento.')
                else:
                    QgsProject.instance().addMapLayer(rlayer)
                    self.iFace.messageBar().pushMessage(
                        "Mensaje:",
                        "Fueron cargadas las capas WMS con exito",
                        level=Qgis.Success,
                        duration=3)
            else:
                QMessageBox.information(
                    None, "ERROR:",
                    'No selecciono ninguna capa WMS para cargar')
        self.bar.close()
Exemplo n.º 2
0
class BhuvanWebServices:

    def __init__(self, iFace):
        # Save reference to the QGIS interface
        self.iFace = iFace
        # initialize plugin directory
        self.plugin_dir = os.path.dirname(__file__)
        # initialize locale
        locale = QSettings().value('locale/userLocale')[0:2]
        locale_path = os.path.join(
            self.plugin_dir,
            'i18n',
            'BhuvanWebServices_{}.qm'.format(locale))

        if os.path.exists(locale_path):
            self.translator = QTranslator()
            self.translator.load(locale_path)
            QCoreApplication.installTranslator(self.translator)

        self.dlg = BhuvanWebServicesDialog()
        self.dlginfo = InfoDialog()
        self.generatedService = None
        self.bar = QProgressBar()
        self.bar.setRange(0, 0)
        self.bar.setGeometry(950, 500, 200, 25)

        # Declare instance attributes
        self.actions = []
        self.menu = self.tr(u'&Bhuvan Web Services')

        # Check if plugin was started the first time in current QGIS session
        # Must be set in initGui() to survive plugin reloads
        self.first_start = None

    # noinspection PyMethodMayBeStatic
    def tr(self, message):
        # noinspection PyTypeChecker,PyArgumentList,PyCallByClass
        return QCoreApplication.translate('BhuvanWebServices', message)

    def add_action(
            self,
            icon_path,
            text,
            callback,
            enabled_flag=True,
            add_to_menu=True,
            add_to_toolbar=True,
            status_tip=None,
            whats_this=None,
            parent=None):
        """Add a toolbar icon to the toolbar.

        :param icon_path: Path to the icon for this action. Can be a resource
            path (e.g. ':/plugins/foo/bar.png') or a normal file system path.
        :type icon_path: str

        :param text: Text that should be shown in menu items for this action.
        :type text: str

        :param callback: Function to be called when the action is triggered.
        :type callback: function

        :param enabled_flag: A flag indicating if the action should be enabled
            by default. Defaults to True.
        :type enabled_flag: bool

        :param add_to_menu: Flag indicating whether the action should also
            be added to the menu. Defaults to True.
        :type add_to_menu: bool

        :param add_to_toolbar: Flag indicating whether the action should also
            be added to the toolbar. Defaults to True.
        :type add_to_toolbar: bool

        :param status_tip: Optional text to show in a popup when mouse pointer
            hovers over the action.
        :type status_tip: str

        :param parent: Parent widget for the new action. Defaults None.
        :type parent: QWidget

        :param whats_this: Optional text to show in the status bar when the
            mouse pointer hovers over the action.

        :returns: The action that was created. Note that the action is also
            added to self.actions list.
        :rtype: QAction
        """

        icon = QIcon(icon_path)
        action = QAction(icon, text, parent)
        action.triggered.connect(callback)
        action.setEnabled(enabled_flag)

        if status_tip is not None:
            action.setStatusTip(status_tip)

        if whats_this is not None:
            action.setWhatsThis(whats_this)

        if add_to_toolbar:
            # Adds plugin icon to Plugins toolbar
            self.iFace.addToolBarIcon(action)

        if add_to_menu:
            self.iFace.addPluginToWebMenu(
                self.menu,
                action)

        self.actions.append(action)

        return action

    def initGui(self):
        """Create the menu entries and toolbar icons inside the QGIS GUI."""

        self.add_all_action()
        self.dlg.table_widget.itemSelectionChanged.connect(self.updateDesc)
        self.dlg.help_button.clicked.connect(self.openDlgInfo)
        self.dlg.close_button.clicked.connect(self.closeDlg)
        self.dlg.search_box.textEdited.connect(self.search)
        self.dlg.add_button.released.connect(self.loadWebService)

        # will be set False in run()
        self.first_start = True

    def unload(self):
        """Removes the plugin menu item and icon from QGIS GUI."""
        for action in self.actions:
            self.iFace.removePluginWebMenu(
                self.tr(u'&Bhuvan Web Services'),
                action)
            self.iFace.removeToolBarIcon(action)

    def run(self):
        if self.generatedService.web_map_service is not None:
            self.dlg.search_box.clear()
            self.fill_table(self.generatedService.web_map_service.contents)
            self.dlg.show()
            result = self.dlg.exec_()
            if result:
                pass

    def run_0(self):
        self.loadServiceList(Service.BhuvanPanchayat.value)
        self.run()

    def run_1(self):
        self.loadServiceList(Service.LULC205KDataset.value)
        self.run()

    def run_2(self):
        self.loadServiceList(Service.BhuvanV1WMS.value)
        self.run()

    def run_3(self):
        self.loadServiceList(Service.BhuvanV2WMS.value)
        self.run()

    def run_4(self):
        self.loadServiceList(Service.BhuvanV1WMTS.value)
        self.run()

    def run_5(self):
        self.loadServiceList(Service.BhuvanV2WMTS.value)
        self.run()

    def add_all_action(self):
        icon_path = ':/plugins/bhuvan_web_services/icon.png'

        self.add_action(icon_path,
                        text=self.tr(service_text_map[Service.BhuvanPanchayat.value]),
                        callback=self.run_0,
                        whats_this=str(Service.BhuvanPanchayat.value),
                        parent=self.iFace.mainWindow())

        self.add_action(icon_path,
                        text=self.tr(service_text_map[Service.LULC205KDataset.value]),
                        callback=self.run_1,
                        whats_this=str(Service.LULC205KDataset.value),
                        parent=self.iFace.mainWindow())

        self.add_action(icon_path,
                        text=self.tr(service_text_map[Service.BhuvanV1WMS.value]),
                        callback=self.run_2,
                        whats_this=str(Service.BhuvanV1WMS.value),
                        parent=self.iFace.mainWindow())

        self.add_action(icon_path,
                        text=self.tr(service_text_map[Service.BhuvanV2WMS.value]),
                        callback=self.run_3,
                        whats_this=str(Service.BhuvanV2WMS.value),
                        parent=self.iFace.mainWindow())

        self.add_action(icon_path,
                        text=self.tr(service_text_map[Service.BhuvanV1WMTS.value]),
                        callback=self.run_4,
                        whats_this=str(Service.BhuvanV1WMTS.value),
                        parent=self.iFace.mainWindow())

        self.add_action(icon_path,
                        text=self.tr(service_text_map[Service.BhuvanV2WMTS.value]),
                        callback=self.run_5,
                        whats_this=str(Service.BhuvanV2WMTS.value),
                        parent=self.iFace.mainWindow())


    def loadServiceList(self, service_id: int):
        self.iFace.messageBar().pushMessage('Info: ', 'Please wait loading layers ... ', level=Qgis.Info)
        self.bar.show()
        self.iFace.mainWindow().repaint()
        self.generatedService = WebMapServiceClass(service_id)
        url = self.generatedService.service_url
        if self.generatedService.service_type == ServiceType.WebMapService.value:
            try:
                wms = WebMapService(url)
                self.generatedService.setWebMapService(wms)
            except Exception as e:
                QMessageBox.information(None, "ERROR:", 'Unable to load this service now.' + str(e))
        elif self.generatedService.service_type == ServiceType.WebMapTileService.value:
            try:
                wmts = WebMapTileService(url)
                self.generatedService.setWebMapService(wmts)
            except Exception as e:
                QMessageBox.information(None, "ERROR:", 'Unable to load this service now.' + str(e))
        self.bar.close()

    def openDlgInfo(self):
        self.dlginfo.show()

    def closeDlg(self):
        self.generatedService = None
        self.dlg.search_box.clear()
        self.dlg.table_widget.setRowCount(0)
        self.dlg.table_widget.setColumnCount(0)
        self.dlg.layer_name_box.clear()
        self.dlg.close()
        if self.dlginfo:
            self.dlginfo.close()

    def fill_table(self, contentOrderedDict):
        self.dlg.table_widget.setRowCount(0)
        count = self.dlg.table_widget.rowCount()
        self.dlg.table_widget.setColumnCount(4)

        for content in contentOrderedDict:
            index = count
            # id_int = int(contentOrderedDict[content].index[2:])
            name = contentOrderedDict[content].name
            title = contentOrderedDict[content].title
            abstract = contentOrderedDict[content].abstract
            self.dlg.table_widget.insertRow(index)  # inserts a blank row
            # lets fill that row:
            # self.dlg.table_widget.setItem(index, 0, QTableWidgetItem(str(id_int)))  # fills in with the ID
            self.dlg.table_widget.setItem(index, 1, QTableWidgetItem(str(name)))  # fills in with the Name
            self.dlg.table_widget.setItem(index, 2, QTableWidgetItem(str(title)))  # fills in with the Title
            self.dlg.table_widget.setItem(index, 3, QTableWidgetItem(str(abstract)))  # fills in with Abstract

        self.dlg.table_widget.setHorizontalHeaderLabels(["ID", "Name", "Title", "Abstract"])
        self.setTableWidgetBehaviour()

    def setTableWidgetBehaviour(self):
        # set row and column sizes and lock them
        self.dlg.table_widget.setColumnWidth(0, 0)
        self.dlg.table_widget.setColumnWidth(1, 200)
        self.dlg.table_widget.setColumnWidth(2, 200)
        self.dlg.table_widget.setColumnWidth(3, 200)
        self.dlg.table_widget.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed)
        self.dlg.table_widget.verticalHeader().setSectionResizeMode(QHeaderView.Fixed)

        self.dlg.table_widget.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.dlg.table_widget.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.dlg.table_widget.setSelectionMode(QAbstractItemView.ExtendedSelection)

    def search(self):
        criteria = self.dlg.search_box.text()
        criteria = criteria.lower()
        wms_filtered_contents = OrderedDict()
        contents = self.generatedService.web_map_service.contents
        for content in contents:
            name = contents[content].name
            if criteria in name:
                wms_filtered_contents[content] = contents[content]
        self.fill_table(wms_filtered_contents)

    def getSelectedItemsFromTable(self):
        rowNames = []
        selected = self.dlg.table_widget.selectedItems()
        if len(selected) > 0:
            for i in range(0, len(selected), 4):
                row = self.dlg.table_widget.row(selected[i])
                name = self.dlg.table_widget.item(row, 1).text()
                rowNames.append(name)

        selectedServices = OrderedDict()
        contents = self.generatedService.web_map_service.contents
        for rowName in rowNames:
            for content in contents:
                name_itr = contents[content].name
                if name_itr == rowName:
                    selectedServices[content] = contents[content]

        return selectedServices

    def updateDesc(self):
        selectedServices = self.getSelectedItemsFromTable()
        self.dlg.layer_name_box.clear()
        names = ''
        for selectedService in selectedServices:
            name_itr = selectedServices[selectedService].name
            names += name_itr + ','
        names = names[:-1]
        self.dlg.layer_name_box.setText(names)
        self.dlg.layer_name_box.setReadOnly(True)

    def loadWebService(self):
        # get selected items and add to the map
        self.bar.show()
        EPSG_CODE_4326 = 'EPSG:4326'
        selectedServices = self.getSelectedItemsFromTable()
        web_map_service = self.generatedService.web_map_service
        for selectedService in selectedServices:
            if self.generatedService.service_url is not None:
                layer_name = selectedServices[selectedService].name
                url = 'contextualWMSLegend=0'
                if hasattr(web_map_service[layer_name], 'crsOptions'):
                    if len(web_map_service[layer_name].crsOptions) > 0:
                        if EPSG_CODE_4326 in web_map_service[layer_name].crsOptions:
                            url += '&crs=' + EPSG_CODE_4326
                            if self.generatedService.service_type == ServiceType.WebMapTileService.value:
                                    url += '&tileMatrixSet=' + EPSG_CODE_4326
                        else:
                            url += '&crs=' + web_map_service[layer_name].crsOptions[0]
                            if self.generatedService.service_type == ServiceType.WebMapTileService.value:
                                    url += '&tileMatrixSet=' + web_map_service[layer_name].crsOptions[0]
                else:
                    url += '&crs=' + EPSG_CODE_4326
                    if self.generatedService.service_type == ServiceType.WebMapTileService.value:
                        url += '&tileMatrixSet=' + EPSG_CODE_4326
                url += '&dpiMode=7&featureCount=10&format=image/png&styles' + \
                       '&layers=' + layer_name + \
                       '&url=' + str(self.generatedService.service_url)
                rlayer = QgsRasterLayer(url, selectedServices[selectedService].title, 'wms')
                if not rlayer.isValid():
                    QMessageBox.information(None, "ERROR:", 'Unable to load ' +
                                            selectedServices[selectedService].title +
                                            ' this layer now.')
                else:
                    QgsProject.instance().addMapLayer(rlayer)
            else:
                QMessageBox.information(None, "ERROR:", 'Service url is None')
        self.bar.close()