Пример #1
0
    def processAlgorithm(self, progress):
        layers = self.getParameterValue(self.INPUT_DATASOURCES)
        query = self.getParameterValue(self.INPUT_QUERY)
        uid_field = self.getParameterValue(self.INPUT_UID_FIELD)
        geometry_field = self.getParameterValue(self.INPUT_GEOMETRY_FIELD)
        geometry_type = self.getParameterValue(self.INPUT_GEOMETRY_TYPE)
        geometry_crs = self.getParameterValue(self.INPUT_GEOMETRY_CRS)

        df = QgsVirtualLayerDefinition()
        layerIdx = 1
        if layers:
            for layerSource in layers.split(';'):
                layer = dataobjects.getObjectFromUri(layerSource)
                if layer:
                    df.addSource('input{}'.format(layerIdx), layer.id())

        if query == '':
            raise GeoAlgorithmExecutionException(
                self.
                tr('Empty SQL. Please enter valid SQL expression and try again.'
                   ))
        else:
            df.setQuery(query)

        if uid_field:
            df.setUid(uid_field)

        if geometry_type == 1:  # no geometry
            df.setGeometryWkbType(QgsWKBTypes.NoGeometry)
        else:
            if geometry_field:
                df.setGeometryField(geometry_field)
            if geometry_type > 1:
                df.setGeometryWkbType(geometry_type - 1)
            if geometry_crs:
                crs = QgsCoordinateReferenceSystem(geometry_crs)
                if crs.isValid():
                    df.setGeometrySrid(crs.postgisSrid())

        vLayer = QgsVectorLayer(df.toString(), "temp_vlayer", "virtual")
        if not vLayer.isValid():
            raise GeoAlgorithmExecutionException(
                vLayer.dataProvider().error().message())

        writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter(
            vLayer.pendingFields().toList(),
            # Create a point layer (without any points) if 'no geometry' is chosen
            vLayer.wkbType() if geometry_type != 1 else 1,
            vLayer.crs())

        features = vector.features(vLayer)
        total = 100.0 / len(features) if len(features) > 0 else 1
        outFeat = QgsFeature()
        for current, inFeat in enumerate(features):
            outFeat.setAttributes(inFeat.attributes())
            if geometry_type != 1:
                outFeat.setGeometry(inFeat.geometry())
            writer.addFeature(outFeat)
            progress.setPercentage(int(current * total))
        del writer
Пример #2
0
    def processAlgorithm(self, feedback):
        layers = self.getParameterValue(self.INPUT_DATASOURCES)
        query = self.getParameterValue(self.INPUT_QUERY)
        uid_field = self.getParameterValue(self.INPUT_UID_FIELD)
        geometry_field = self.getParameterValue(self.INPUT_GEOMETRY_FIELD)
        geometry_type = self.getParameterValue(self.INPUT_GEOMETRY_TYPE)
        geometry_crs = self.getParameterValue(self.INPUT_GEOMETRY_CRS)

        df = QgsVirtualLayerDefinition()
        layerIdx = 1
        if layers:
            for layerSource in layers.split(';'):
                layer = dataobjects.getObjectFromUri(layerSource)
                if layer:
                    df.addSource('input{}'.format(layerIdx), layer.id())
                layerIdx += 1

        if query == '':
            raise GeoAlgorithmExecutionException(
                self.tr('Empty SQL. Please enter valid SQL expression and try again.'))
        else:
            df.setQuery(query)

        if uid_field:
            df.setUid(uid_field)

        if geometry_type == 1:  # no geometry
            df.setGeometryWkbType(QgsWkbTypes.NullGeometry)
        else:
            if geometry_field:
                df.setGeometryField(geometry_field)
            if geometry_type > 1:
                df.setGeometryWkbType(geometry_type - 1)
            if geometry_crs:
                crs = QgsCoordinateReferenceSystem(geometry_crs)
                if crs.isValid():
                    df.setGeometrySrid(crs.postgisSrid())

        vLayer = QgsVectorLayer(df.toString(), "temp_vlayer", "virtual")
        if not vLayer.isValid():
            raise GeoAlgorithmExecutionException(vLayer.dataProvider().error().message())

        writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter(
            vLayer.fields().toList(),
            # Create a point layer (without any points) if 'no geometry' is chosen
            vLayer.wkbType() if geometry_type != 1 else 1,
            vLayer.crs())

        features = vector.features(vLayer)
        total = 100.0 / len(features)
        outFeat = QgsFeature()
        for current, inFeat in enumerate(features):
            outFeat.setAttributes(inFeat.attributes())
            if geometry_type != 1:
                outFeat.setGeometry(inFeat.geometry())
            writer.addFeature(outFeat)
            feedback.setProgress(int(current * total))
        del writer
Пример #3
0
    def processAlgorithm(self, context, feedback):
        layers = self.getParameterValue(self.INPUT_DATASOURCES)
        query = self.getParameterValue(self.INPUT_QUERY)
        uid_field = self.getParameterValue(self.INPUT_UID_FIELD)
        geometry_field = self.getParameterValue(self.INPUT_GEOMETRY_FIELD)
        geometry_type = self.getParameterValue(self.INPUT_GEOMETRY_TYPE)
        geometry_crs = self.getParameterValue(self.INPUT_GEOMETRY_CRS)

        df = QgsVirtualLayerDefinition()
        layerIdx = 1
        if layers:
            for layerSource in layers.split(';'):
                layer = QgsProcessingUtils.mapLayerFromString(layerSource, context)
                if layer:
                    df.addSource('input{}'.format(layerIdx), layer.id())
                layerIdx += 1

        if query == '':
            raise GeoAlgorithmExecutionException(
                self.tr('Empty SQL. Please enter valid SQL expression and try again.'))
        else:
            df.setQuery(query)

        if uid_field:
            df.setUid(uid_field)

        if geometry_type == 1:  # no geometry
            df.setGeometryWkbType(QgsWkbTypes.NullGeometry)
        else:
            if geometry_field:
                df.setGeometryField(geometry_field)
            if geometry_type > 1:
                df.setGeometryWkbType(geometry_type - 1)
            if geometry_crs:
                crs = QgsCoordinateReferenceSystem(geometry_crs)
                if crs.isValid():
                    df.setGeometrySrid(crs.postgisSrid())

        vLayer = QgsVectorLayer(df.toString(), "temp_vlayer", "virtual")
        if not vLayer.isValid():
            raise GeoAlgorithmExecutionException(vLayer.dataProvider().error().message())

        writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter(vLayer.fields(),
                                                                           vLayer.wkbType() if geometry_type != 1 else 1,
                                                                           vLayer.crs(), context)

        features = QgsProcessingUtils.getFeatures(vLayer, context)
        total = 100.0 / QgsProcessingUtils.featureCount(vLayer, context)
        outFeat = QgsFeature()
        for current, inFeat in enumerate(features):
            outFeat.setAttributes(inFeat.attributes())
            if geometry_type != 1:
                outFeat.setGeometry(inFeat.geometry())
            writer.addFeature(outFeat)
            feedback.setProgress(int(current * total))
        del writer
Пример #4
0
    def find(self, to_find):
        if self.settings.value("qftsfilepath") == '':
            return
        if not self.isValid:
            self.message.emit("Cannot search in project. QuickFinder file is probably currently in use.",QgsMessageBar.WARNING)
            return
        # add star after each word except numbers
        to_find = to_find.split(' ')
        for i,word in enumerate(to_find):
            try:
                int(word)
            except ValueError:
                to_find[i] = '%%%s%%' % word
        to_find = ' '.join(to_find)
        # FTS request
        sql = "SELECT search_id,content,x,y,wkb_geom FROM quickfinder_data WHERE content LIKE ?"
        cur = self.conn.cursor()

        catLimit = self.settings.value("categoryLimit")
        totalLimit = self.settings.value("totalLimit")
        catFound = {}
        for row in cur.execute(sql, [to_find]):
            search_id, content, x, y, wkb_geom = row
            if search_id in catFound:
                if catFound[search_id] >= catLimit:
                    continue
                catFound[search_id] += 1
            else:
                catFound[search_id] = 1

            if search_id not in self._searches:
                continue

            gs = self._searches[search_id].geometryStorage
            geometry = QgsGeometry()
            if gs == 'wkb':
                geometry.fromWkb(binascii.a2b_hex(wkb_geom))
            else:
                # wkt or extent are stored as wkt
                geometry = geometry.fromWkt(wkb_geom)

            crs = QgsCoordinateReferenceSystem()
            crs.createFromString(self._searches[search_id].srid)
            self.result_found.emit(self,
                                  self._searches[search_id].searchName,
                                  content,
                                  geometry,
                                  crs.postgisSrid())

            if sum(catFound.values()) >= totalLimit:
                break
Пример #5
0
    def find(self, to_find):
        if self.settings.value("qftsfilepath") == '':
            return
        if not self.isValid:
            self.message.emit("Cannot search in project. QuickFinder file is probably currently in use.",QgsMessageBar.WARNING)
            return
        # add star after each word except numbers
        to_find = to_find.split(' ')
        for i,word in enumerate(to_find):
            try:
                int(word)
            except ValueError:
                to_find[i] = '%s*' % word
        to_find = ' '.join(to_find)
        # FTS request
        sql = "SELECT search_id,content,x,y,wkb_geom FROM quickfinder_data WHERE content MATCH ?"
        cur = self.conn.cursor()

        catLimit = self.settings.value("categoryLimit")
        totalLimit = self.settings.value("totalLimit")
        catFound = {}
        for row in cur.execute(sql, [to_find]):
            search_id, content, x, y, wkb_geom = row
            if catFound.has_key(search_id):
                if catFound[search_id] >= catLimit:
                    continue
                catFound[search_id] += 1
            else:
                catFound[search_id] = 1

            if not self._searches.has_key(search_id):
                continue

            gs = self._searches[search_id].geometryStorage
            geometry = QgsGeometry()
            if gs == 'wkb':
                geometry.fromWkb(binascii.a2b_hex(wkb_geom))
            else:
                # wkt or extent are stored as wkt
                geometry = geometry.fromWkt(wkb_geom)

            crs = QgsCoordinateReferenceSystem()
            crs.createFromString(self._searches[search_id].srid)
            self.result_found.emit(self,
                                  self._searches[search_id].searchName,
                                  content,
                                  geometry,
                                  crs.postgisSrid())

            if sum(catFound.values()) >= totalLimit:
                break
Пример #6
0
    def record_clicked(self):
        """record clicked signal"""

        # disable only service buttons
        self.reset_buttons(True, False, False)

        self.rubber_band.reset()

        if not self.treeRecords.selectedItems():
            return

        item = self.treeRecords.currentItem()
        if not item:
            return

        identifier = get_item_data(item, 'identifier')
        try:
            record = next(item for item in self.catalog.records()
                          if item['identifier'] == identifier)
        except KeyError:
            QMessageBox.warning(self,
                                self.tr('Record parsing error'),
                                'Unable to locate record identifier')
            return

        # if the record has a bbox, show a footprint on the map
        if record['bbox'] is not None:
            bx = record['bbox']
            rt = QgsRectangle(float(bx['minx']), float(bx['miny']),
                              float(bx['maxx']), float(bx['maxy']))
            geom = QgsGeometry.fromRect(rt)

            if geom is not None:
                src = QgsCoordinateReferenceSystem("EPSG:4326")
                dst = self.map.mapSettings().destinationCrs()
                if src.postgisSrid() != dst.postgisSrid():
                    ctr = QgsCoordinateTransform(
                        src, dst, QgsProject.instance())
                    try:
                        geom.transform(ctr)
                    except Exception as err:
                        QMessageBox.warning(
                            self,
                            self.tr('Coordinate Transformation Error'),
                            str(err))
                self.rubber_band.setToGeometry(geom, None)

        # figure out if the data is interactive and can be operated on
        self.find_services(record, item)
Пример #7
0
    def record_clicked(self):
        """record clicked signal"""

        # disable only service buttons
        self.reset_buttons(True, False, False)

        if not self.treeRecords.selectedItems():
            return

        item = self.treeRecords.currentItem()
        if not item:
            return

        identifier = get_item_data(item, 'identifier')
        try:
            record = self.catalog.records[identifier]
        except KeyError as err:
            QMessageBox.warning(self,
                                self.tr('Record parsing error'),
                                'Unable to locate record identifier')
            return

        # if the record has a bbox, show a footprint on the map
        if record.bbox is not None:
            points = bbox_to_polygon(record.bbox)
            if points is not None:
                src = QgsCoordinateReferenceSystem(4326)
                dst = self.map.mapSettings().destinationCrs()
                geom = QgsGeometry.fromPolygon(points)
                if src.postgisSrid() != dst.postgisSrid():
                    ctr = QgsCoordinateTransform(src, dst)
                    try:
                        geom.transform(ctr)
                    except Exception as err:
                        QMessageBox.warning(
                            self,
                            self.tr('Coordinate Transformation Error'),
                            unicode(err))
                self.rubber_band.setToGeometry(geom, None)

        # figure out if the data is interactive and can be operated on
        self.find_services(record, item)
Пример #8
0
    def find(self, toFind):
        if self.settings.value("qftsfilepath") == "":
            return
        if not self.isValid:
            self.message.emit(
                "Cannot search in project. QuickFinder file is probably currently in use.", QgsMessageBar.WARNING
            )
            return
        # add star after each word except numbers
        toFind = toFind.split(" ")
        for i, word in enumerate(toFind):
            try:
                int(word)
            except ValueError:
                toFind[i] = "%s*" % word
        toFind = " ".join(toFind)
        # FTS request
        sql = "SELECT search_id,content,x,y,wkb_geom FROM quickfinder_data WHERE content MATCH ?"
        cur = self.conn.cursor()
        cur.execute(sql, [toFind])
        catLimit = self.settings.value("categoryLimit")
        totalLimit = self.settings.value("totalLimit")
        nFound = 0
        catFound = {}
        while True:
            s = cur.fetchone()
            if s is None:
                return
            search_id, content, x, y, wkb_geom = s
            if catFound.has_key(search_id):
                if catFound[search_id] >= catLimit:
                    continue
                catFound[search_id] += 1
            else:
                catFound[search_id] = 1

            if not self._searches.has_key(search_id):
                continue

            geometry = QgsGeometry()
            geometry.fromWkb(binascii.a2b_hex(wkb_geom))

            crs = QgsCoordinateReferenceSystem()
            crs.createFromString(self._searches[search_id].srid)
            self.resultFound.emit(self, self._searches[search_id].searchName, content, geometry, crs.postgisSrid())

            nFound += 1
            if nFound >= totalLimit:
                break
Пример #9
0
class TECView:
    """QGIS Plugin Implementation."""
    def __init__(self, iface):
        """Constructor.

        :param iface: An interface instance that will be passed to this class
            which provides the hook by which you can manipulate the QGIS
            application at run time.
        :type iface: QgsInterface
        """
        # 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',
                                   'TECView_{}.qm'.format(locale))

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

            if qVersion() > '4.3.3':
                QCoreApplication.installTranslator(self.translator)

        # Declare instance attributes
        self.actions = []
        self.menu = self.tr(u'&SRH2D_TECViewer')
        # TODO: We are going to let the user set this up in a future iteration
        self.toolbar = self.iface.addToolBar(u'TECView')
        self.toolbar.setObjectName(u'TECView')
        self.all_Attrs = list()
        self.dlg = TECViewDialog()

        self.dlg.fileListWidget.clear()
        self.dlg.attributeList.clear()
        self.dlg.progressBar.setVisible(False)

        # - Button Connections  - #
        self.dlg.selectProjFolder.clicked.connect(self.selectProjFolder)
        self.dlg.geoRefBtn.clicked.connect(self.selectCrs)
        self.dlg.addFileBtn.clicked.connect(self.selectTECFile)
        self.dlg.deleteFileBtn.clicked.connect(self.removeTECfile)
        self.dlg.fileListWidget.itemSelectionChanged.connect(self.showAttr)
        self.dlg.cancelLoadBtn.clicked.connect(lambda: self.dlg.done(0))
        self.dlg.attributeList.clicked.connect(self.selectToShow)
        self.dlg.loadTECBtn.clicked.connect(self.loadTECfiles)
        self.dlg.callSettingsBtn.clicked.connect(self.runSettings)
        self.dlg.fileListWidget.customContextMenuRequested.connect(
            self.subMenuOnFileList)
        self.animation = makeAnimation(self.iface)

        self.profiler = profilePlot(self.iface)
        self.contourPlot = contourPlot(self.iface)
        self.makeKml = kmlExport(self.iface)
        self.vecPlot = vecPlot(self.iface)
        self.settings = QSettings('ManySplendid', 'SRH2D_TEC_Viewer')
        try:
            self.systemCRS = self.settings.value('crs')
        except (AttributeError):
            self.settings.setValue('crs', 3826)
            crsType = QgsCoordinateReferenceSystem.InternalCrsId
            self.systemCRS = QgsCoordinateReferenceSystem(3826, crsType)

    # noinspection PyMethodMayBeStatic
    def tr(self, message):
        """Get the translation for a string using Qt translation API.

        We implement this ourselves since we do not inherit QObject.

        :param message: String for translation.
        :type message: str, QString

        :returns: Translated version of message.
        :rtype: QString
        """
        # noinspection PyTypeChecker,PyArgumentList,PyCallByClass
        return QCoreApplication.translate('TECView', 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
        """

        # Create the dialog (after translation) and keep reference
        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.toolbar.addAction(action)

        if add_to_menu:
            self.iface.addPluginToMenu(self.menu, action)

        self.actions.append(action)

        return action

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

        readerIcon = os.path.join(self.plugin_dir, 'icon.png')
        self.add_action(
            readerIcon,
            text=self.tr(
                u'SRH2D Post-Processing TEC File Viewer and analyser.'),
            callback=self.run,
            parent=self.iface.mainWindow())

        profileIcon = os.path.join(self.plugin_dir, '0cs_extract-01.png')
        self.add_action(profileIcon,
                        text=self.tr(u'Profile Viewer'),
                        callback=self.profiler.run,
                        parent=self.iface.mainWindow())

        contourIcon = os.path.join(self.plugin_dir, '0contour-01.png')
        self.add_action(contourIcon,
                        text=self.tr(u'Plot Contour'),
                        callback=self.contourPlot.run,
                        parent=self.iface.mainWindow())

        toKmlIcon = os.path.join(self.plugin_dir, '0KML_contour-01.png')
        self.add_action(toKmlIcon,
                        text=self.tr(u'Export to .kml'),
                        callback=self.makeKml.run,
                        parent=self.iface.mainWindow())

        flowDirIcon = os.path.join(self.plugin_dir, '0flow_field-01.png')
        self.add_action(flowDirIcon,
                        text=self.tr(u'Flow Direction'),
                        callback=self.vecPlot.run,
                        parent=self.iface.mainWindow())

        animationIcon = os.path.join(self.plugin_dir, '0animate-01.png')
        self.add_action(animationIcon,
                        text=self.tr(u'Make Aniamtion'),
                        callback=self.animation.run,
                        parent=self.iface.mainWindow())

    def unload(self):
        """Removes the plugin menu item and icon from QGIS GUI."""
        for action in self.actions:
            self.iface.removePluginMenu(self.tr(u'&SRH2D_TECViewer'), action)
            self.iface.removeToolBarIcon(action)
        # remove the toolbar
        del self.toolbar

    def run(self):
        """Run method that performs all the real work"""
        # show the dialog
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result == 1:
            self.settings.setValue('projFolder',
                                   toUnicode(self.dlg.projFolderEdit.text()))
            profileDiag = profilePlot(self.iface,
                                      toUnicode(
                                          self.dlg.projFolderEdit.text()),
                                      TEC_Box=self.TEC_Container)
            profileDiag.run()

    def selectProjFolder(self):
        try:
            presetFolder = self.dlg.projFolderEdit.text()
        except (KeyError):
            presetFolder = ''
        caption = 'Please choose a project folder'
        folderName = QFileDialog.getExistingDirectory(self.dlg, caption,
                                                      presetFolder)
        self.dlg.projFolderEdit.setText(toUnicode(folderName))

    def selectCrs(self):
        crsDiag = QgsGenericProjectionSelector()
        crsDiag.exec_()
        crsId = crsDiag.selectedCrsId()
        if crsId:
            crsType = QgsCoordinateReferenceSystem.InternalCrsId
            self.systemCRS = QgsCoordinateReferenceSystem(crsId, crsType)
            self.settings.setValue('crs', self.systemCRS.postgisSrid())

    def selectTECFile(self):
        Caption = 'Please select a _TEC_.dat file or multiple files'
        projFolder = toUnicode(self.dlg.projFolderEdit.text())
        filePathes = QFileDialog.getOpenFileNames(
            self.dlg, Caption, os.path.join(projFolder, 'sim'), "*.dat")
        for path in filePathes:
            path = toUnicode(path)
            fileWidget = TECfile(self.dlg.fileListWidget, 0, toUnicode(path),
                                 self.iface)
            self.dlg.fileListWidget.addItem(fileWidget)

    def removeTECfile(self):
        selectedTEC = self.dlg.fileListWidget.currentItem()
        c_row = self.dlg.fileListWidget.row(selectedTEC)
        self.dlg.fileListWidget.takeItem(c_row)

    def showAttr(self):
        self.dlg.attributeList.clear()
        current = self.dlg.fileListWidget.currentItem()
        attributes = current.attributes
        for attr in attributes:
            item = QListWidgetItem(attr[0], self.dlg.attributeList)
            item.setFlags(item.flags() & ~Qt.ItemIsSelectable)
            if attr[1] == 0:
                item.setCheckState(Qt.Unchecked)
            else:
                item.setCheckState(Qt.Checked)
            self.dlg.attributeList.addItem(item)

    def changeAttrToOutput(self, TECitem, attr):
        idx = [r for r, j in zip(count(), TECitem.attributes) if attr in j][0]
        TECitem.attributes[idx][1] = 1

    def changeAttrToCancel(self, TECitem, attr):
        idx = [r for r, j in zip(count(), TECitem.attributes) if attr in j][0]
        TECitem.attributes[idx][1] = 0

    def selectToShow(self):
        attrList = self.dlg.attributeList
        for i in range(0, attrList.count()):
            attrItem = attrList.item(i)
            attrName = attrItem.text()
            if attrItem.checkState() == Qt.Checked:
                if self.dlg.chageAllBtn.isChecked():
                    for t in range(0, self.dlg.fileListWidget.count()):
                        TECitem = self.dlg.fileListWidget.item(t)
                        self.changeAttrToOutput(TECitem, attrName)
                else:
                    TECitem = self.dlg.fileListWidget.currentItem()
                    self.changeAttrToOutput(TECitem, attrName)
            else:
                if self.dlg.chageAllBtn.isChecked():
                    for t in range(0, self.dlg.fileListWidget.count()):
                        TECitem = self.dlg.fileListWidget.item(t)
                        self.changeAttrToCancel(TECitem, attrName)
                else:
                    TECitem = self.dlg.fileListWidget.currentItem()
                    self.changeAttrToCancel(TECitem, attrName)

    def loadTECfiles(self):
        projFolder = toUnicode(self.dlg.projFolderEdit.text())
        outFolder = os.path.join(projFolder, u'TECView')
        self.TEC_Container = list()
        if not os.path.isdir(outFolder):
            os.system('mkdir ' + outFolder.encode('big5'))
        self.attrs()
        for i in range(0, self.dlg.fileListWidget.count()):
            TECitem = self.dlg.fileListWidget.item(i)
            TECitem.outDir = outFolder
            TECitem.iface = self.iface
            TECitem.export()
            item = TEClayerBox(TECitem, self.all_Attrs)
            self.TEC_Container.append(item)

        self.dlg.done(1)

    def attrs(self):
        Attrs = list()
        if self.all_Attrs:
            for item in self.all_Attrs:
                if type(item) == str:
                    Attrs.append(item)
                else:
                    Attrs.append(item[0])
        else:
            self.all_Attrs = list()

        for t in range(0, self.dlg.fileListWidget.count()):
            TECitem = self.dlg.fileListWidget.item(t)
            for z in range(0, len(TECitem.attributes)):
                if TECitem.attributes[z][0] not in Attrs:
                    Attrs.append(TECitem.attributes[z][0])
                    self.all_Attrs.append(TECitem.attributes[z][0])

    def runSettings(self):
        self.attrs()
        diag = TecSettings(self.iface, self.all_Attrs)
        self.all_Attrs = diag.run()

    def subMenuOnFileList(self, pos):
        cursorPos = self.dlg.fileListWidget.mapToGlobal(pos)
        subMenu = QMenu()
        subMenu.addAction('Export', self.exportTEC)

        subMenu.exec_(cursorPos)

    def exportTEC(self):
        item = self.dlg.fileListWidget.currentItem()
        folder = os.path.dirname(item.filePath)
        tecName = item.fileName
        self.iface.messageBar().pushMessage('Export ' + tecName + ' to ' +
                                            folder)

        allItem = self.dlg.fileListWidget.selectedItems()
Пример #10
0
    def to_representation(self, instance):
        ret = super(GroupSerializer, self).to_representation(instance)

        # add header_logo
        # before check macrogroups and groups number also if is equal to 1 use it

        try:
            macrogroup = instance.macrogroups.get(use_logo_client=True)
            ret['header_logo_img'] = macrogroup.logo_img.name
        except:
            ret['header_logo_img'] = instance.header_logo_img.name

        try:
            macrogroup = instance.macrogroups.get(use_title_client=True)
            ret['name'] = macrogroup.title
        except:
            # change groupData name with title for i18n app
            ret['name'] = instance.title

        # add crs:
        crs = QgsCoordinateReferenceSystem(f'EPSG:{self.instance.srid.srid}')

        # Patch for Proj4 > 4.9.3 version
        if self.instance.srid.srid == 3003:
            proj4 = settings.PROJ4_EPSG_3003
        else:
            proj4 = crs.toProj4()

        ret['crs'] = {
            'epsg': crs.postgisSrid(),
            'proj4': proj4,
            'geographic': crs.isGeographic(),
            'axisinverted': crs.hasAxisInverted()
        }

        # map controls
        ret['mapcontrols'] = [
            mapcontrol.name for mapcontrol in instance.mapcontrols.all()
        ]

        # add projects to group
        ret['projects'] = []
        self.projects = {}

        anonymous_user = get_user_model().get_anonymous()

        for g3wProjectApp in settings.G3WADMIN_PROJECT_APPS:
            Project = apps.get_app_config(g3wProjectApp).get_model('project')
            projects = get_objects_for_user(self.request.user, '{}.view_project'.format(g3wProjectApp), Project) \
                .filter(group=instance)
            projects_anonymous = get_objects_for_user(
                anonymous_user, '{}.view_project'.format(g3wProjectApp),
                Project).filter(group=instance)
            projects = list(set(projects) | set(projects_anonymous))

            for project in projects:
                self.projects[g3wProjectApp + '-' + str(project.id)] = project

                if project.pk == int(
                        self.projectId) and g3wProjectApp == self.projectType:
                    self.project = project

                # project thumbnail
                project_thumb = project.thumbnail.name if bool(project.thumbnail.name) \
                    else '{}client/images/FakeProjectThumb.png'.format(settings.STATIC_URL)

                # Get project url
                if project.url_alias:
                    url = reverse('group-project-map-alias',
                                  args=[project.url_alias])[1:]
                else:
                    url = reverse(
                        'group-project-map',
                        args=[project.group.slug, g3wProjectApp,
                              project.pk])[1:]

                ret['projects'].append({
                    'id':
                    project.id,
                    'title':
                    project.title,
                    'description':
                    project.description,
                    'thumbnail':
                    project_thumb,
                    'type':
                    g3wProjectApp,
                    'gid':
                    "{}:{}".format(g3wProjectApp, project.id),
                    'modified':
                    project.modified.timestamp() if hasattr(
                        project, 'modified') else 0,
                    'url':
                    url
                })

        # baselayers
        ret['baselayers'] = []
        baselayers = instance.baselayers.all().order_by('order')
        for baselayer in baselayers:
            ret['baselayers'].append(BaseLayerSerializer(baselayer).data)

        # add vendorkeys if it is set into settings
        if settings.VENDOR_KEYS:
            ret['vendorkeys'] = settings.VENDOR_KEYS

        # add initproject and overviewproject
        ret['initproject'] = "{}:{}".format(self.projectType, self.projectId)

        # add overviewproject is present
        overviewproject = instance.project_panoramic.all()
        if overviewproject:
            overviewproject = overviewproject[0]
            ret['overviewproject'] = {
                'id':
                int(overviewproject.project_id),
                'type':
                overviewproject.project_type,
                'gid':
                "{}:{}".format(overviewproject.project_type,
                               overviewproject.project_id)
            }
        else:
            ret['overviewproject'] = None

        ret['plugins'] = {}

        # Plugins/Module data
        # Data from plugins can be instance of dict or list
        # - dict results are used only for update 'plugins' API return data
        # - list results are more verbose and action on 'plugins' API section is declared, ie:
        # {
        #     'mode': 'delete',
        #     'data': [<list_plugins_section_to_remove>]
        #  },
        # {
        #     'mode': 'update',
        #     'data': {
        #         '<lugins_name>: {
        #             ...
        #         }
        #     }
        # }

        plugins = initconfig_plugin_start.send(sender=self,
                                               project=self.projectId,
                                               projectType=self.projectType)
        for data_plugin in plugins:
            if data_plugin[1] and isinstance(data_plugin[1], dict):
                ret['plugins'] = copy(ret['plugins'])
                ret['plugins'].update(data_plugin[1])
            elif data_plugin[1] and isinstance(data_plugin[1], list):
                for dp in data_plugin[1]:
                    if dp['mode'] == 'delete':
                        ret['plugins'] = copy(ret['plugins'])
                        for k in dp['data']:
                            try:
                                ret['plugins'].pop(k)
                            except:
                                pass
                    elif dp['mode'] == 'update':
                        ret['plugins'] = copy(ret['plugins'])
                        ret['plugins'].update(dp['data'])

        # powerd_by
        ret['powered_by'] = settings.G3WSUITE_POWERD_BY

        # header customs links
        header_custom_links = getattr(settings,
                                      'G3W_CLIENT_HEADER_CUSTOM_LINKS', None)
        ret['header_custom_links'] = []
        if header_custom_links:

            # check for possible callback
            for head_link in header_custom_links:
                if callable(head_link):
                    ret['header_custom_links'].append(head_link(self.request))
                else:
                    ret['header_custom_links'].append(head_link)

        # custom layout
        ret['layout'] = {}

        # add legend settings if set to layout
        layout_legend = getattr(settings, 'G3W_CLIENT_LEGEND', None)
        if layout_legend:
            ret['layout']['legend'] = layout_legend

        # Check if G3W_CLIENT_LEGEND['layertitle'] set it tu false
        if self.project.legend_position == 'toc':
            if layout_legend:
                ret['layout']['legend']['layertitle'] = False
            else:
                ret['layout']['legend'] = {'layertitle': False}

        # add legend settings if set to layout
        layout_right_panel = getattr(settings, 'G3W_CLIENT_RIGHT_PANEL', None)
        if layout_right_panel:
            ret['layout']['rightpanel'] = layout_right_panel

        return ret
Пример #11
0
    def to_representation(self, instance):
        ret = super(LayerSerializer, self).to_representation(instance)

        qgs_maplayer = self.qgs_project.mapLayers()[instance.qgs_layer_id]

        group = instance.project.group

        # add attributes/fields
        ret['fields'] = self.get_attributes(instance)

        # add infoformat and infourl
        ret['infoformat'] = ''
        ret['infourl'] = ''

        lidname = instance.qgs_layer_id if instance.project.wms_use_layer_ids else instance.name

        # add bbox
        if instance.geometrytype != QGIS_LAYER_TYPE_NO_GEOM:
            if instance.extent:
                ret['bbox'] = instance.extent_rect
            else:
                # get from QgsMapLayer instance
                extent = qgs_maplayer.extent()
                ret['bbox'] = {}
                ret['bbox']['minx'] = extent.xMinimum()
                ret['bbox']['miny'] = extent.yMinimum()
                ret['bbox']['maxx'] = extent.xMaximum()
                ret['bbox']['maxy'] = extent.yMaximum()

        # add capabilities
        ret['capabilities'] = get_capabilities4layer(qgs_maplayer)

        # add styles
        # FIXME: restore in the future for styles map management
        #ret['styles'] = self.qgis_projectsettings_wms.layers[lidname]['styles']

        ret['source'] = {'type': instance.layer_type}

        # add options for wms layer
        if instance.layer_type in [
                Layer.TYPES.wms, Layer.TYPES.arcgismapserver
        ]:

            if instance.layer_type == Layer.TYPES.wms:
                datasourceWMS = QueryDict(instance.datasource)
            else:
                datasourceWMS = datasourcearcgis2dict(instance.datasource)

            if ('username' not in ret['source'] or 'password' not in ret['source']) and 'type=xyz' \
                    not in instance.datasource:

                # rebuild the dict for paramenters repeat n times i.e. 'layers' and 'styles'
                if isinstance(datasourceWMS, QueryDict):
                    for p in datasourceWMS.lists():
                        if p[0] in ('layers', 'styles'):
                            ret['source'].update({p[0]: ','.join(p[1])})
                        else:
                            ret['source'].update({p[0]: datasourceWMS[p[0]]})
                else:
                    ret['source'].update(datasourceWMS)

            ret['source']['external'] = instance.external

        # replace crs property if is not none with dict structure

        if ret['crs']:
            crs = QgsCoordinateReferenceSystem(f'EPSG:{ret["crs"]}')
            ret['crs'] = {
                'epsg': crs.postgisSrid(),
                'proj4': crs.toProj4(),
                'geographic': crs.isGeographic(),
                'axisinverted': crs.hasAxisInverted()
            }

        # add metadata
        ret['metadata'] = self.get_metadata(instance, qgs_maplayer)

        # eval editor_form_structure
        if ret['editor_form_structure']:
            ret['editor_form_structure'] = eval(instance.editor_form_structure)

        # add ows
        ret['ows'] = self.get_ows(instance)

        return ret
Пример #12
0
    def convert_sde_sdc_workspace(
            name,  # pylint: disable=too-many-branches,too-many-statements
            workspace_name: WorkspaceName,
            base: str,
            crs: QgsCoordinateReferenceSystem,
            subset: str,
            context: Context,
            is_sdc: bool) -> DataSourceProperties:
        """
        Convert SdeWorkspaceFactory/SdcWorkspaceFactory
        """
        file_name = ConversionUtils.get_absolute_path(workspace_name.name,
                                                      base)
        uri = None
        wkb_type = None

        connection = None
        if not is_sdc:
            sde_path = Path(file_name)

            if workspace_name.connection_properties:
                connection = ConnectionConverter.convert_connection(
                    workspace_name.connection_properties, context)
            elif sde_path.exists() and not sde_path.is_dir():
                connection = ConnectionConverter.convert_sde_connection(
                    sde_path, context)

        if connection is not None:
            sde_uri, provider = connection
            # what happens if there's more than one . ???
            if provider == 'oracle':
                parts = DatasetNameConverter.split_to_tokens(name.name)
                if len(parts) == 2:
                    sde_uri.setSchema(parts[0])
                    sde_uri.setTable(
                        DatasetNameConverter.convert_sde_table_name(
                            parts[1], context))
                    if not isinstance(name, TableName):
                        sde_uri.setSrid(str(crs.postgisSrid()))
                        wkb_type = DatasetNameConverter.GEOMETRY_TYPE_TO_WKB_TYPE[
                            name.shape_type]
                        sde_uri.setWkbType(wkb_type)
                        sde_uri.setGeometryColumn(name.shape_field_name)
                    else:
                        sde_uri.setWkbType(QgsWkbTypes.NoGeometry)

                    sde_uri.setSql(subset)
                    sde_uri.setKeyColumn(context.sde_primary_key)

                    uri = sde_uri.uri()
                    file_name = None
                else:
                    context.unsupported_object_callback(
                        f'Could not convert Oracle table name {name.name}. Please email this file to [email protected] so that we can add support in a future SLYR release.',
                        level=Context.CRITICAL)
            elif provider == 'mssql':

                parts = DatasetNameConverter.split_to_tokens(name.name)
                if len(parts) == 3:
                    sde_uri.setSchema(parts[1])
                    sde_uri.setTable(
                        DatasetNameConverter.convert_sde_table_name(
                            parts[2], context))

                    if not isinstance(name, TableName):
                        sde_uri.setSrid(str(crs.postgisSrid()))
                        wkb_type = DatasetNameConverter.GEOMETRY_TYPE_TO_WKB_TYPE[
                            name.shape_type]
                        sde_uri.setWkbType(wkb_type)
                        sde_uri.setGeometryColumn(name.shape_field_name)
                    else:
                        sde_uri.setWkbType(QgsWkbTypes.NoGeometry)

                    sde_uri.setSql(subset)
                    sde_uri.setKeyColumn(context.sde_primary_key)

                    uri = sde_uri.uri()
                    file_name = None
                else:
                    context.unsupported_object_callback(
                        f'Could not convert SQL Server table name {name.name}. Please email this file to [email protected] so that we can add support in a future SLYR release.',
                        level=Context.CRITICAL)
            elif provider == 'postgres':
                parts = DatasetNameConverter.split_to_tokens(name.name)
                if len(parts) == 3:
                    sde_uri.setSchema(parts[1])
                    sde_uri.setTable(
                        DatasetNameConverter.convert_sde_table_name(
                            parts[2], context))

                    if not isinstance(name, TableName):
                        sde_uri.setSrid(str(crs.postgisSrid()))
                        wkb_type = DatasetNameConverter.GEOMETRY_TYPE_TO_WKB_TYPE[
                            name.shape_type]
                        sde_uri.setWkbType(wkb_type)
                        sde_uri.setGeometryColumn(name.shape_field_name)
                    else:
                        sde_uri.setWkbType(QgsWkbTypes.NoGeometry)

                    sde_uri.setSql(subset)
                    sde_uri.setKeyColumn(context.sde_primary_key)

                    uri = sde_uri.uri()
                    file_name = None
                else:
                    context.unsupported_object_callback(
                        f'Could not convert PostgreSQL table name {name.name}. Please email this file to [email protected] so that we can add support in a future SLYR release.',
                        level=Context.CRITICAL)
        else:
            provider = 'ogr'
            if name.__class__.__name__ in ('DBTableName', 'TableName'):
                wkb_type = QgsWkbTypes.NoGeometry
            else:
                wkb_type = DatasetNameConverter.geometry_type_to_wkb(
                    name.shape_type)
            if not is_sdc:
                uri = '{}|layername={}'.format(file_name, name.name)
            else:
                file_name = ConversionUtils.get_absolute_path(
                    name.name, file_name)
                uri = file_name

        return DataSourceProperties(uri=uri,
                                    wkb_type=wkb_type,
                                    provider=provider,
                                    file_name=file_name)
Пример #13
0
    def to_representation(self, instance):
        ret = super(LayerSerializer, self).to_representation(instance)

        qgs_maplayer = self.qgs_project.mapLayers()[instance.qgs_layer_id]

        # add attributes/fields
        ret['fields'] = self.get_attributes(instance)

        # add infoformat and infourl
        ret['infoformat'] = ''
        ret['infourl'] = ''

        #lidname = instance.qgs_layer_id if instance.project.wms_use_layer_ids else instance.name

        # add bbox
        if instance.geometrytype != QGIS_LAYER_TYPE_NO_GEOM:
            if instance.extent:
                ret['bbox'] = instance.extent_rect
            else:
                # get from QgsMapLayer instance
                extent = qgs_maplayer.extent()
                ret['bbox'] = {}
                ret['bbox']['minx'] = extent.xMinimum()
                ret['bbox']['miny'] = extent.yMinimum()
                ret['bbox']['maxx'] = extent.xMaximum()
                ret['bbox']['maxy'] = extent.yMaximum()

        # add capabilities
        ret['capabilities'] = get_capabilities4layer(qgs_maplayer)

        # add styles
        # FIXME: restore in the future for styles map management
        #ret['styles'] = self.qgis_projectsettings_wms.layers[lidname]['styles']

        ret['source'] = {'type': instance.layer_type}

        # add options for wms layer
        if instance.layer_type in [
                Layer.TYPES.wms, Layer.TYPES.arcgismapserver
        ]:

            if instance.layer_type == Layer.TYPES.wms:
                datasource_wms = QueryDict(instance.datasource)
            else:
                datasource_wms = datasourcearcgis2dict(instance.datasource)

            if ('username' not in ret['source'] or 'password' not in ret['source']) and 'type=xyz' \
                    not in instance.datasource:

                # rebuild the dict for paramenters repeat n times i.e. 'layers' and 'styles'
                if isinstance(datasource_wms, QueryDict):
                    for p in datasource_wms.lists():
                        if p[0] in ('layers', 'styles'):
                            ret['source'].update({p[0]: ','.join(p[1])})
                        else:
                            ret['source'].update({p[0]: datasource_wms[p[0]]})
                else:
                    ret['source'].update(datasource_wms)

            ret['source']['external'] = instance.external
            if instance.external and instance.layer_type == Layer.TYPES.wms:
                try:
                    wms = WebMapService(ret['source']['url'], version='1.3.0')
                    format_options = wms.getOperationByName(
                        'GetFeatureInfo').formatOptions
                    if format_options:

                        # Filter format by supported by G3W-CLIENT
                        formats = list(
                            set(format_options).intersection(
                                set(settings.EXTERNAL_WMS_INFOFORMATS_SUPPORTED
                                    )))
                        if formats:
                            ret['infoformat'] = formats[0]
                            ret['infoformats'] = formats
                except Exception as e:
                    logger.debug(
                        f'WMS layer GetFeatureInfo formats available: {e}')

        # replace crs property if is not none with dict structure

        if ret['crs']:
            crs = QgsCoordinateReferenceSystem(f'EPSG:{ret["crs"]}')

            # Patch for Proj4 > 4.9.3 version
            if ret["crs"] == 3003:
                proj4 = "+proj=tmerc +lat_0=0 +lon_0=9 +k=0.9996 +x_0=1500000 +y_0=0 +ellps=intl " \
                        "+towgs84=-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68 +units=m +no_defs"
            else:
                proj4 = crs.toProj4()

            ret['crs'] = {
                'epsg': crs.postgisSrid(),
                'proj4': proj4,
                'geographic': crs.isGeographic(),
                'axisinverted': crs.hasAxisInverted()
            }

        # add metadata
        ret['metadata'] = self.get_metadata(instance, qgs_maplayer)

        # eval editor_form_structure
        if ret['editor_form_structure']:
            ret['editor_form_structure'] = eval(instance.editor_form_structure)

        # add ows
        ret['ows'] = self.get_ows(instance)

        # For temporal properties
        if instance.temporal_properties:
            ret['qtimeseries'] = json.loads(instance.temporal_properties)

            if ret['qtimeseries'] and ret['qtimeseries'][
                    'mode'] == 'FeatureDateTimeInstantFromField':

                # Add start_date end end_date:
                findex = qgs_maplayer.dataProvider().fieldNameIndex(
                    ret['qtimeseries']['field'])

                ret['qtimeseries']['start_date'] = qgs_maplayer.minimumValue(
                    findex)
                ret['qtimeseries']['end_date'] = qgs_maplayer.maximumValue(
                    findex)
                if isinstance(ret['qtimeseries']['start_date'],
                              QDate) or isinstance(
                                  ret['qtimeseries']['start_date'], QDateTime):
                    if not hasattr(QDate, 'isoformat'):
                        QDate.isoformat = lambda d: d.toString(Qt.ISODate)
                    if not hasattr(QDateTime, 'isoformat'):
                        QDateTime.isoformat = lambda d: d.toString(
                            Qt.ISODateWithMs)
                    ret['qtimeseries']['start_date'] = ret['qtimeseries'][
                        'start_date'].isoformat()
                    ret['qtimeseries']['end_date'] = ret['qtimeseries'][
                        'end_date'].isoformat()

        return ret
    def run(self):
        # show the dialog
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result == 1:
            # get target directory
            dirName = self.dlg.ui.dirEdit.text()
            # Export path field empty? Raise warning and break with return.
            if dirName == "":
                QtWidgets.QMessageBox.critical(self.dlg, "BulkVectorExport", \
                    "Please input directory name")
                return
            # Check for valid directory path.
            if dirName[len(dirName) - 1] != "/":
                dirName = dirName + "/"
            if not QtCore.QFileInfo(dirName).isDir():
                QtWidgets.QMessageBox.critical(self.dlg, "BulkVectorExport", \
                    "No such directory : " + dirName)
                return
            ogr_driver_name = "GeoJSON"
            ogr_driver_name_raster = "GTiff"
            print("Driver name: " + ogr_driver_name)
            layers = qgis.utils.iface.mapCanvas().layers()
            project = QgsProject.instance()
            mapInfo = {
                "name": os.path.basename(project.fileName()),
                "layers": [],
                "bounds": []
            }
            tempPath = tempfile.mkdtemp('bulkexport') + os.sep
            fileNames = []
            for layer in reversed(layers):
                layerType = layer.type()
                if layerType == QgsMapLayer.RasterLayer:
                    renderer = layer.renderer()
                    hasIcon = False
                    print('Writing: ' + str(layer.name()))
                    layer_filename_r = tempPath + str(uuid.uuid4()) + '.tif'
                    print('Filename: ' + layer_filename_r)
                    provider = layer.dataProvider()
                    src_crs = layer.crs()
                    dst_crs = QgsCoordinateReferenceSystem("EPSG:4326")
                    source_path = " -of GTiff " + provider.dataSourceUri()
                    cmd = "gdalwarp -overwrite -r bilinear -s_srs EPSG:" + \
                                            str(src_crs.postgisSrid()) + \
                                            " -t_srs EPSG:" + \
                                            str(dst_crs.postgisSrid()) + \
                                            " " + \
                                            source_path + \
                                            " " + \
                                            layer_filename_r
                    result4 = os.system(cmd)
                    print("geotiff export Status: " + str(result4))
                    if result4 != 0:
                        QtWidgets.QMessageBox.warning(self.dlg, "BulkVectorExport",\
                            "Failed to export: " + layer.name() + \
                            "Status: " + str(result4))
                    result5 = False
                    mapInfo['layers'].append({
                        "title":
                        str(layer.name()),
                        "geotiff":
                        os.path.basename(layer_filename_r)  # + '.tif'
                    })
                    fileNames.append(layer_filename_r)
                elif layerType == QgsMapLayer.VectorLayer:
                    renderer = layer.renderer()
                    hasIcon = False
                    if isinstance(renderer, QgsSingleSymbolRenderer):
                        copySymbols(renderer.symbol(), tempPath, fileNames)
                        hasIcon = True
                    print('Writing:' + str(layer.name()))
                    layer_filename = tempPath + str(uuid.uuid4())
                    print('Filename: ' + layer_filename)
                    crs = QgsCoordinateReferenceSystem("EPSG:4326")
                    result2 = qgis.core.QgsVectorFileWriter.writeAsVectorFormat(
                        layer, layer_filename, "utf-8", crs, ogr_driver_name)
                    print("Status: " + str(result2))
                    if result2[0] != 0:
                        QtWidgets.QMessageBox.warning(self.dlg, "BulkVectorExport",\
                            "Failed to export: " + layer.name() + \
                            "Status: " + str(result2))
                    sld_filename = os.path.join(
                        tempPath,
                        os.path.basename(layer_filename) + '.sld')
                    print('Filename: ' + sld_filename)
                    result3 = False
                    layer.saveSldStyle(sld_filename)
                    mapInfo['layers'].append({
                        "title":
                        str(layer.name()),
                        "geojson":
                        os.path.basename(layer_filename) + '.geojson',
                        "sld":
                        os.path.basename(sld_filename),
                        ## opacity value has to be rounded, otherwise python 3.6 writes 0.99 instead of 1.0
                        "opacity":
                        round(1 - (layer.opacity() / 100.0), 1),
                        "hasIcon":
                        hasIcon
                    })
                    fileNames.append(layer_filename + '.geojson')
                    fileNames.append(sld_filename)
                    print(fileNames)

            ## initial bounding box is visible extent
            canvas = self.iface.mapCanvas()
            canvasExtent = canvas.extent()
            crsDest = QgsCoordinateReferenceSystem("EPSG:4326")
            try:
                crsSrc = canvas.mapSettings().destinationCrs()
            except:
                crsSrc = canvas.mapRenderer().destinationCrs()
            xform = QgsCoordinateTransform(crsSrc, crsDest,
                                           QgsProject.instance())
            canvasExtentTransformed = xform.transform(canvasExtent)

            initialBounds = [
                canvasExtentTransformed.xMinimum(),
                canvasExtentTransformed.yMinimum(),
                canvasExtentTransformed.xMaximum(),
                canvasExtentTransformed.yMaximum()
            ]

            mapInfo['bounds'] = bounds(layers)
            mapInfo['maxZoom'] = 11
            mapInfo['minZoom'] = 6
            mapInfo['description'] = ""
            mapInfo['attribution'] = ""
            mapInfo['popupTemplate'] = ""
            mapInfo['initialBounds'] = initialBounds
            mapInfo['limitedInitialBounds'] = False
            mapInfo['popupLayerIndex'] = -1
            mapInfo['hasLayerControl'] = True
            mapInfo['hasZoomControl'] = True
            mapInfo['hasLayerLegend'] = True
            mapInfo['basemap'] = 'bmapgrau'
            map_filename = tempPath + 'metadata.json'
            with open(map_filename, 'w') as outfile:
                json.dump(mapInfo, outfile)

            fileNames.append(map_filename)

            ## if .svg file present, add to packlist
            for svgfile in os.listdir(tempPath):
                if svgfile.endswith(".svg"):
                    fileNames.append(tempPath + svgfile)

            ## zip all
            zf = zipfile.ZipFile(
                dirName + os.sep + os.path.basename(str(project.fileName())) +
                '.globus.zip', "w")

            for fileName in fileNames:
                zf.write(os.path.join(fileName),
                         arcname=os.path.split(fileName)[1])
                os.remove(fileName)

            shutil.rmtree(tempPath, ignore_errors=True, onerror=None)
            zf.close()
Пример #15
0
    def to_representation(self, instance):
        ret = super(GroupSerializer, self).to_representation(instance)

        # add header_logo
        # before check macrogroups and groups number also if is equal to 1 use it

        try:
            macrogroup = instance.macrogroups.get(use_logo_client=True)
            ret['header_logo_img'] = macrogroup.logo_img.name
        except:
            ret['header_logo_img'] = instance.header_logo_img.name

        try:
            macrogroup = instance.macrogroups.get(use_title_client=True)
            ret['name'] = macrogroup.title
        except:
            # change groupData name with title for i18n app
            ret['name'] = instance.title

        # add crs:
        crs = QgsCoordinateReferenceSystem(f'EPSG:{self.instance.srid.srid}')

        ret['crs'] = {
            'epsg': crs.postgisSrid(),
            'proj4': crs.toProj4(),
            'geographic': crs.isGeographic(),
            'axisinverted': crs.hasAxisInverted()
        }

        # map controls
        ret['mapcontrols'] = [
            mapcontrol.name for mapcontrol in instance.mapcontrols.all()
        ]

        # add projects to group
        ret['projects'] = []
        self.projects = {}

        anonymous_user = get_user_model().get_anonymous()

        for g3wProjectApp in settings.G3WADMIN_PROJECT_APPS:
            Project = apps.get_app_config(g3wProjectApp).get_model('project')
            projects = get_objects_for_user(self.request.user, '{}.view_project'.format(g3wProjectApp), Project) \
                .filter(group=instance)
            projects_anonymous = get_objects_for_user(
                anonymous_user, '{}.view_project'.format(g3wProjectApp),
                Project).filter(group=instance)
            projects = list(set(projects) | set(projects_anonymous))
            print(projects)
            for project in projects:
                self.projects[g3wProjectApp + '-' + str(project.id)] = project

                if project.pk == int(
                        self.projectId) and g3wProjectApp == self.projectType:
                    self.project = project

                # project thumbnail
                project_thumb = project.thumbnail.name if bool(project.thumbnail.name) \
                    else '{}client/images/FakeProjectThumb.png'.format(settings.STATIC_URL)
                ret['projects'].append({
                    'id':
                    project.id,
                    'title':
                    project.title,
                    'description':
                    project.description,
                    'thumbnail':
                    project_thumb,
                    'type':
                    g3wProjectApp,
                    'gid':
                    "{}:{}".format(g3wProjectApp, project.id),
                    'modified':
                    project.modified.timestamp() if hasattr(
                        project, 'modified') else 0
                })

        # baselayers
        ret['baselayers'] = []
        baselayers = instance.baselayers.all().order_by('order')
        for baselayer in baselayers:
            ret['baselayers'].append(BaseLayerSerializer(baselayer).data)

        # add vendorkeys if it is set into settings
        if settings.VENDOR_KEYS:
            ret['vendorkeys'] = settings.VENDOR_KEYS

        # add initproject and overviewproject
        ret['initproject'] = "{}:{}".format(self.projectType, self.projectId)

        # add overviewproject is present
        overviewproject = instance.project_panoramic.all()
        if overviewproject:
            overviewproject = overviewproject[0]
            ret['overviewproject'] = {
                'id':
                int(overviewproject.project_id),
                'type':
                overviewproject.project_type,
                'gid':
                "{}:{}".format(overviewproject.project_type,
                               overviewproject.project_id)
            }
        else:
            ret['overviewproject'] = None

        ret['plugins'] = {}

        # plugins/module data
        dataPlugins = initconfig_plugin_start.send(
            sender=self, project=self.projectId, projectType=self.projectType)
        for dataPlugin in dataPlugins:
            if dataPlugin[1]:
                ret['plugins'] = copy(ret['plugins'])
                ret['plugins'].update(dataPlugin[1])

        # powerd_by
        ret['powered_by'] = settings.G3WSUITE_POWERD_BY

        # header customs links
        header_custom_links = getattr(settings,
                                      'G3W_CLIENT_HEADER_CUSTOM_LINKS', None)
        ret['header_custom_links'] = []
        if header_custom_links:

            # check for possible callback
            for head_link in header_custom_links:
                if callable(head_link):
                    ret['header_custom_links'].append(head_link(self.request))
                else:
                    ret['header_custom_links'].append(head_link)

        # custom layout
        ret['layout'] = {}

        # add legend settings if set to layout
        layout_legend = getattr(settings, 'G3W_CLIENT_LEGEND', None)
        if layout_legend:
            ret['layout']['legend'] = layout_legend

        # Check if G3W_CLIENT_LEGEND['layertitle'] set it tu false
        if self.project.legend_position == 'toc':
            if layout_legend:
                ret['layout']['legend']['layertitle'] = False
            else:
                ret['layout']['legend'] = {'layertitle': False}

        # add legend settings if set to layout
        layout_right_panel = getattr(settings, 'G3W_CLIENT_RIGHT_PANEL', None)
        if layout_right_panel:
            ret['layout']['rightpanel'] = layout_right_panel

        return ret
Пример #16
0
    def post(self, request, **kwargs):

        # Check for content type accept only 'application/json'

        if request.content_type != 'application/json':
            return APIException(
                "Interface OWS accept only 'application/json request'")

        post_data = json.loads(request.body)

        # Required
        url = post_data.get('url')
        if not url:
            raise APIException("'url' parameter must be provided.")

        service = post_data.get('service')
        if not service:
            raise APIException("'service' parameter must be provided.")
        service = service.lower()

        if service not in self._service_available.keys():
            raise APIException(f"Service '{service}' is not available.")

        # Not required:
        version = post_data.get('version', '1.3.0')

        ows = self._service_available[service](url, version=version)

        # Identification
        # -----------------------------------
        self.results.results.update({
            'title': ows.identification.title,
            'abstract': ows.identification.abstract
        })

        # Map formats
        # -----------------------------------
        self.results.results.update(
            {'map_formats': ows.getOperationByName('GetMap').formatOptions})

        # Info formats
        # -----------------------------------
        self.results.results.update({
            'info_formats':
            ows.getOperationByName('GetFeatureInfo').formatOptions
        })

        # Layers
        # -----------------------------------
        available_layers = list(ows.contents)

        # add styles for every layer
        layers = []
        for al in available_layers:

            # Build crs
            crss = []
            for srid in ows[al].crsOptions:
                crs = QgsCoordinateReferenceSystem(srid)

                if crs.postgisSrid() == 3003:
                    proj4 = settings.PROJ4_EPSG_3003
                else:
                    proj4 = crs.toProj4()

                crss.append({
                    'epsg': crs.postgisSrid(),
                    'proj4': proj4,
                    'geographic': crs.isGeographic(),
                    'axisinverted': crs.hasAxisInverted()
                })

            layers.append({
                'name':
                al,
                'title':
                ows[al].title,
                'abstract':
                ows[al].abstract,
                'crss':
                crss,
                'styles':
                ows[al].styles,
                'parent':
                ows[al].parent.id if ows[al].parent else None
            })

        self.results.results.update({'layers': layers})

        return Response(self.results.results)