示例#1
0
 def on_applyPushButton_clicked(self):
     try:
         QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
         dbName = self.dbComboBox.currentText()
         styleName = self.styleComboBox.currentText()
         lyrList = self.getLayers(dbName)
         abstractDb = self.getAbstractDb(dbName)
         dbVersion = abstractDb.getDatabaseVersion()
         stylesDict = abstractDb.getStyleDict(dbVersion)
         selectedStyle = stylesDict[styleName]
         localProgress = ProgressWidget(
             1,
             len(lyrList) - 1,
             self.tr('Loading style {0}').format(styleName),
             parent=self.iface.mapCanvas())
         for lyr in lyrList:
             try:
                 uri = QgsDataSourceURI(lyr.dataProvider().dataSourceUri())
                 fullPath = self.getStyle(abstractDb, selectedStyle,
                                          lyr.name())
                 if fullPath:
                     lyr.applyNamedStyle(fullPath)
             except:
                 pass
             localProgress.step()
         self.iface.mapCanvas().refreshAllLayers()
         QApplication.restoreOverrideCursor()
     except Exception as e:
         QgsMessageLog.logMessage(
             self.tr('Error setting style ') + styleName + ': ' +
             ':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
         QApplication.restoreOverrideCursor()
示例#2
0
 def on_applyPushButton_clicked(self):
     try:
         QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
         dbName = self.dbComboBox.currentText()
         styleName = self.styleComboBox.currentText()
         lyrList = self.getLayers(dbName)
         abstractDb = self.getAbstractDb(dbName)
         dbVersion = abstractDb.getDatabaseVersion()
         stylesDict = abstractDb.getStyleDict(dbVersion)
         selectedStyle = stylesDict[styleName]
         localProgress = ProgressWidget(1, len(lyrList) - 1, self.tr('Loading style {0}').format(styleName), parent=self.iface.mapCanvas())
         for lyr in lyrList:
             try:
                 uri = QgsDataSourceURI(lyr.dataProvider().dataSourceUri())
                 fullPath = self.getStyle(abstractDb, selectedStyle, lyr.name())
                 if fullPath:
                     lyr.applyNamedStyle(fullPath)
             except:
                 pass
             localProgress.step()
         self.iface.mapCanvas().refreshAllLayers()
         QApplication.restoreOverrideCursor()
     except Exception as e:
         QgsMessageLog.logMessage(self.tr('Error setting style ') + styleName + ': ' +':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
         QApplication.restoreOverrideCursor()
    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(
            self.tr('Starting ') + self.getName() + self.tr(' Process.'),
            "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        try:
            self.startTimeCount()
            self.setStatus(self.tr('Running'), 3)  #now I'm running!
            classesWithElem = self.parameters['Classes']
            if len(classesWithElem) == 0:
                self.setStatus(
                    self.tr('No classes selected!. Nothing to be done.'),
                    1)  #Finished
                return 1
            for key in classesWithElem:
                self.startTimeCount()
                # preparation
                classAndGeom = self.classesWithElemDict[key]
                localProgress = ProgressWidget(
                    0,
                    1,
                    self.tr('Preparing execution for ') +
                    classAndGeom['tableName'],
                    parent=self.iface.mapCanvas())
                localProgress.step()
                processTableName, lyr, keyColumn = self.prepareExecution(
                    classAndGeom)
                localProgress.step()

                # running the process
                localProgress = ProgressWidget(0,
                                               1,
                                               self.tr('Running process on ') +
                                               classAndGeom['tableName'],
                                               parent=self.iface.mapCanvas())
                localProgress.step()
                self.abstractDb.removeEmptyGeometries(processTableName,
                                                      classAndGeom['geom'])
                localProgress.step()

                # finalization
                self.postProcessSteps(processTableName, lyr)
                #removes null geometries
                for feat in lyr.getFeatures():
                    if not feat.geometry():
                        lyr.deleteFeature(feat.id())
                localProgress.step()
                self.logLayerTime(classAndGeom['tableSchema'] + '.' +
                                  classAndGeom['tableName'])
            msg = self.tr('Process executed successfully!')
            self.setStatus(msg, 1)  #Finished
            return 1
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                     QgsMessageLog.CRITICAL)
            self.finishedWithError()
            return 0
    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        self.startTimeCount()
        try:
            self.setStatus(self.tr('Running'), 3) #now I'm running!
            refKey = self.parameters['Reference and Layers'][0]
            classesWithElemKeys = self.parameters['Reference and Layers'][1]
            if len(classesWithElemKeys) == 0:
                self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished
                return 1

            if not refKey:
                self.setStatus(self.tr('One reference must be selected! Stopping.'), 1) #Finished
                return 1

            # preparing reference layer
            refcl = self.classesWithElemDict[refKey]
            reflyr = self.loadLayerBeforeValidationProcess(refcl)
            snapper = DsgGeometrySnapper(reflyr)
            snapper.featureSnapped.connect(self.updateProgress)
            tol = self.parameters['Snap']
            msg = ''
            for key in classesWithElemKeys:
                # preparation
                clDict = self.classesWithElemDict[key]
                localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + clDict['tableName'], parent=self.iface.mapCanvas())
                localProgress.step()
                lyr = self.loadLayerBeforeValidationProcess(clDict)
                localProgress.step()

                # snapping lyr to reference
                if self.parameters['Only Selected']:
                    featureList = lyr.selectedFeatures()
                else:
                    featureList = lyr.getFeatures()
                features = [feature for feature in featureList]
                self.localProgress = ProgressWidget(1, len(features) - 1, self.tr('Processing features on ') + clDict['tableName'], parent=self.iface.mapCanvas())

                snappedFeatures = snapper.snapFeatures(features, tol)
                self.updateOriginalLayerV2(lyr, None, featureList=snappedFeatures)
                self.logLayerTime(clDict['lyrName'])

                localMsg = self.tr('All features from ') +clDict['lyrName']+ self.tr(' snapped to reference ') +refcl['tableName']+ self.tr(' succesfully.\n')
                QgsMessageLog.logMessage(localMsg, "DSG Tools Plugin", QgsMessageLog.CRITICAL)
                msg += localMsg
            self.setStatus(msg, 1) #Finished
            return 1
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
            self.finishedWithError()
            return 0
 def buildInitialAndEndPointDict(self, lyr, tableSchema, tableName):
     """
     Calculates initial point and end point from each line from lyr.
     """
     if isinstance(lyr, list):
         featureList = lyr
         size = len(featureList)
     else:
         if self.parameters['Only Selected']:
             featureList = lyr.selectedFeatures()
             size = len(featureList)
         else:
             featureList = lyr.getFeatures()
             size = len(lyr.allFeatureIds())
     localProgress = ProgressWidget(
         1,
         size,
         self.tr('Building search structure for {0}.{1}').format(
             tableSchema, tableName),
         parent=self.iface.mapCanvas())
     # start and end points dict
     endVerticesDict = {}
     # iterating over features to store start and end points
     for feat in featureList:
         geom = feat.geometry()
         if geom.isMultipart():
             multiLine = geom.asMultiPolyline()
             for j in xrange(len(multiLine)):
                 line = multiLine[j]
                 startPoint = line[0]
                 endPoint = line[len(line) - 1]
                 # storing start point in the dict
                 if startPoint not in endVerticesDict.keys():
                     endVerticesDict[startPoint] = []
                 endVerticesDict[startPoint].append(feat.id())
                 # storing end point in the dict
                 if endPoint not in endVerticesDict.keys():
                     endVerticesDict[endPoint] = []
                 endVerticesDict[endPoint].append(feat.id())
         else:
             line = geom.asPolyline()
             startPoint = line[0]
             endPoint = line[len(line) - 1]
             # storing start point in the dict
             if startPoint not in endVerticesDict.keys():
                 endVerticesDict[startPoint] = []
             endVerticesDict[startPoint].append(feat.id())
             # storing end point in the dict
             if endPoint not in endVerticesDict.keys():
                 endVerticesDict[endPoint] = []
             endVerticesDict[endPoint].append(feat.id())
         localProgress.step()
     return endVerticesDict
    def on_buttonBox_accepted(self):
        """
        Loads the selected classes/categories
        """
        #1- filter classes if categories is checked and build list.
        selectedKeys = self.layersCustomSelector.getSelectedNodes()
        if len(selectedKeys) == 0:
            QMessageBox.information(self, self.tr('Error!'), self.tr('Select at least one layer to be loaded!'))
            return

        #2- get parameters
        withElements = self.checkBoxOnlyWithElements.isChecked()
        selectedStyle = None
        if self.customServerConnectionWidget.edgvType == 'Non_EDGV':
            isEdgv = False
        else:
            isEdgv = True
        if self.styleComboBox.currentIndex() != 0:
            selectedStyle = self.customServerConnectionWidget.stylesDict[self.styleComboBox.currentText()]
        uniqueLoad = self.uniqueLoadCheckBox.isChecked()
        onlyParents = self.onlyParentsCheckBox.isChecked()
        #3- Build factory dict
        factoryDict = dict()
        dbList = self.customServerConnectionWidget.selectedDbsDict.keys()
        for dbName in dbList:
            factoryDict[dbName] = self.layerFactory.makeLoader(self.iface, self.customServerConnectionWidget.selectedDbsDict[dbName])
        #4- load for each db
        exceptionDict = dict()
        progress = ProgressWidget(1, len(dbList), self.tr('Loading layers from selected databases... '), parent=self)
        for dbName in factoryDict.keys():
            QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
            try:
                selectedClasses = []
                for i in selectedKeys:
                    if i in self.lyrDict.keys():
                        if dbName in self.lyrDict[i].keys():
                            selectedClasses.append(self.lyrDict[i][dbName])
                factoryDict[dbName].load(selectedClasses, uniqueLoad=uniqueLoad, onlyWithElements=withElements, stylePath=selectedStyle, useInheritance=onlyParents, isEdgv=isEdgv, parent=self)
                progress.step()
            except Exception as e:
                exceptionDict[dbName] = ':'.join(e.args)
                QApplication.restoreOverrideCursor()
                progress.step()
            QApplication.restoreOverrideCursor()
            if factoryDict[dbName].errorLog != '':
                if dbName in exceptionDict.keys():
                    exceptionDict[dbName] += '\n'+factoryDict[dbName].errorLog
                else:
                    exceptionDict[dbName] = factoryDict[dbName].errorLog
        QApplication.restoreOverrideCursor()
        self.logInternalError(exceptionDict)
        self.close()
    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        try:
            self.setStatus(self.tr('Running'), 3) #now I'm running!
            refWithElem = self.parameters['Reference and Layers'][0]
            classesWithElem = self.parameters['Reference and Layers'][1]
            if len(classesWithElem) == 0:
                self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished
                QgsMessageLog.logMessage(self.tr('No classes selected! Nothing to be done.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
                return 1

            if not refWithElem:
                self.setStatus(self.tr('One reference must be selected! Stopping.'), 1) #Finished
                QgsMessageLog.logMessage(self.tr('One reference must be selected! Stopping.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
                return 1

            # preparing reference layer
            refcl, refGeometryColumn = refWithElem.split(':')
            reflyr = self.loadLayerBeforeValidationProcess(refcl)
            snapper = DsgGeometrySnapper(reflyr)
            snapper.featureSnapped.connect(self.updateProgress)

            tol = self.parameters['Snap']
            msg = ''
            for classAndGeom in classesWithElem:
                # preparation
                cl, geometryColumn = classAndGeom.split(':')
                localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + cl, parent=self.iface.mapCanvas())
                localProgress.step()
                lyr = self.loadLayerBeforeValidationProcess(cl)
                localProgress.step()

                # snapping lyr to reference
                features = [feature for feature in lyr.getFeatures()]
                self.localProgress = ProgressWidget(1, len(features) - 1, self.tr('Processing features on ') + cl, parent=self.iface.mapCanvas())

                snappedFeatures = snapper.snapFeatures(features, tol)
                self.updateOriginalLayer(lyr, None, featureList=snappedFeatures)

                localMsg = self.tr('All features from ') +cl+ self.tr(' snapped to reference ') +refcl+ self.tr(' succesfully.\n')
                QgsMessageLog.logMessage(localMsg, "DSG Tools Plugin", QgsMessageLog.CRITICAL)
                msg += localMsg
            self.setStatus(msg, 1) #Finished
            QgsMessageLog.logMessage(msg, "DSG Tools Plugin", QgsMessageLog.CRITICAL)
            return 1
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
            self.finishedWithError()
            return 0
示例#8
0
 def execute(self):
     """
     Reimplementation of the execute method from the parent class
     """
     QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
     try:
         self.setStatus(self.tr('Running'), 3) #now I'm running!
         self.abstractDb.deleteProcessFlags(self.getName()) #erase previous flags
         classesWithElem = self.parameters['Classes']
         if len(classesWithElem) == 0:
             self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished
             QgsMessageLog.logMessage(self.tr('No classes selected! Nothing to be done.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
             return 1
         classesWithGeom = []
         dupGeomRecordList = []
         for key in classesWithElem:
             # preparation
             classAndGeom = self.classesWithElemDict[key]
             localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + classAndGeom['tableName'], parent=self.iface.mapCanvas())
             localProgress.step()
             processTableName, lyr, keyColumn = self.prepareExecution(classAndGeom, selectedFeatures = self.parameters['Only Selected'])
             localProgress.step()
             # running the process
             localProgress = ProgressWidget(0, 1, self.tr('Running process for ') + classAndGeom['tableName'], parent=self.iface.mapCanvas())
             localProgress.step()
             duplicated = self.abstractDb.getDuplicatedGeomRecords(processTableName, classAndGeom['geom'], keyColumn)
             localProgress.step()
             self.abstractDb.dropTempTable(processTableName)
             # storing flags
             if len(duplicated) > 0:
                 if classAndGeom['tableSchema'] not in ('validation'):
                     for result in duplicated:
                         id, geom = result
                         dupGeomRecordList.append((classAndGeom['tableSchema']+'.'+classAndGeom['tableName'], id, self.tr('Duplicated Geometry'), geom, classAndGeom['geom']))
         # storing flags
         if len(dupGeomRecordList) > 0:
             numberOfDupGeom = self.addFlag(dupGeomRecordList)
             msg =  str(numberOfDupGeom) + self.tr(' features are duplicated. Check flags.')
             self.setStatus(msg, 4) #Finished with flags
             QgsMessageLog.logMessage(msg, "DSG Tools Plugin", QgsMessageLog.CRITICAL)
         else:
             msg = self.tr('There are no duplicated geometries.')
             self.setStatus(msg, 1) #Finished
             QgsMessageLog.logMessage(msg, "DSG Tools Plugin", QgsMessageLog.CRITICAL)
         return 1
     except Exception as e:
         QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
         self.finishedWithError()
         localProgress.step()
         # dropping temp table
         return 0
示例#9
0
    def browseServer(self, dbList, host, port, user, password):
        """
        Browses server for EDGV databases
        dbList: databases list
        host: server host ip address
        port: server port
        user: user name
        password: password
        """
        canLoad = True
        if self.superNeeded:
            canLoad = False
            try:
                if self.serverWidget.abstractDb.checkSuperUser():
                    canLoad = True
                else:
                    QMessageBox.warning(
                        self, self.tr('Info!'),
                        self.
                        tr('Connection refused. Connect with a super user to inspect server.'
                           ))
                    return []
            except Exception as e:
                QMessageBox.critical(self, self.tr('Critical!'),
                                     ':'.join(e.args))
        if canLoad:
            progress = ProgressWidget(
                1,
                len(dbList),
                self.tr('Loading databases from server... '),
                parent=self)
            progress.initBar()
            gen = self.factory.createSqlGenerator(False)
            edvgDbList = []
            for database in dbList:
                db = self.getPostGISDatabaseWithParams(database, host, port,
                                                       user, password)
                if not db.open():
                    qgis.utils.iface.messageBar().pushMessage(
                        'DB :' + database + '| msg: ' +
                        db.lastError().databaseText(),
                        level=QgsMessageBar.CRITICAL)

                query = QSqlQuery(db)
                if query.exec_(gen.getEDGVVersion()):
                    while query.next():
                        version = query.value(0)
                        if version:
                            edvgDbList.append((database, version))
                progress.step()
            return edvgDbList
示例#10
0
    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(
            self.tr('Starting ') + self.getName() + self.tr(' Process.'),
            "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        self.startTimeCount()
        try:
            self.setStatus(self.tr('Running'), 3)  #now I'm running!

            # getting parameters after the execution of our pre process
            self.flagsDict = self.abstractDb.getFlagsDictByProcess(
                'IdentifySmallAreasProcess')

            flagsClasses = self.flagsDict.keys()
            if len(flagsClasses) == 0:
                self.setStatus(self.tr('There are no small areas.'),
                               1)  #Finished
                return 1
            numberOfProblems = 0
            for cl in flagsClasses:
                # preparation
                localProgress = ProgressWidget(
                    0,
                    1,
                    self.tr('Preparing execution for ') + cl,
                    parent=self.iface.mapCanvas())
                localProgress.step()
                lyr = self.loadLayerBeforeValidationProcess(cl)
                localProgress.step()

                #running the process on cl
                localProgress = ProgressWidget(0,
                                               1,
                                               self.tr('Running process on ') +
                                               cl,
                                               parent=self.iface.mapCanvas())
                localProgress.step()
                problems = len(self.flagsDict[cl])
                smallIds = [int(flag['id']) for flag in self.flagsDict[cl]]
                lyr.startEditing()
                lyr.deleteFeatures(smallIds)
                localProgress.step()
                numberOfProblems += problems

                QgsMessageLog.logMessage(
                    str(problems) + self.tr(' features from ') + cl +
                    self.tr(' were removed.'), "DSG Tools Plugin",
                    QgsMessageLog.CRITICAL)
                self.logLayerTime(cl)
            self.setStatus(
                str(numberOfProblems) + self.tr(' features were removed.'),
                1)  #Finished with flags
            return 1
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                     QgsMessageLog.CRITICAL)
            self.finishedWithError()
            return 0
    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(
            self.tr('Starting ') + self.getName() + self.tr('Process.\n'),
            "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        try:
            self.setStatus(self.tr('Running'), 3)  #now I'm running!

            # getting parameters after the execution of our pre process
            self.flagsDict = self.abstractDb.getFlagsDictByProcess(
                'IdentifyInvalidGeometriesProcess')

            classesWithFlags = self.flagsDict.keys()
            if len(classesWithFlags) == 0:
                self.setStatus(self.tr('There are no invalid geometries.'),
                               1)  #Finished
                QgsMessageLog.logMessage(
                    self.tr('There are no invalid geometries.'),
                    "DSG Tools Plugin", QgsMessageLog.CRITICAL)
                return 1
            numberOfProblems = 0
            for cl in classesWithFlags:
                # preparation
                localProgress = ProgressWidget(
                    0,
                    1,
                    self.tr('Preparing execution for ') + cl,
                    parent=self.iface.mapCanvas())
                localProgress.step()
                processTableName, lyr, keyColumn = self.prepareExecution(cl)
                localProgress.step()
                #running the process in the temp table
                localProgress = ProgressWidget(0,
                                               1,
                                               self.tr('Running process on ') +
                                               cl,
                                               parent=self.iface.mapCanvas())
                localProgress.step()
                problems = self.abstractDb.forceValidity(
                    processTableName, self.flagsDict[cl], keyColumn)
                localProgress.step()
                numberOfProblems += problems
                # finalization
                self.postProcessSteps(processTableName, lyr)
                QgsMessageLog.logMessage(
                    self.tr('{0} features from {1} were changed.').format(
                        problems, cl), "DSG Tools Plugin",
                    QgsMessageLog.CRITICAL)
            self.setStatus(
                self.tr('{0} features were changed.').format(numberOfProblems),
                1)  #Finished
            return 1
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                     QgsMessageLog.CRITICAL)
            self.finishedWithError()
            return 0
 def execute(self):
     """
         Reimplementation of the execute method from the parent class
         """
     QgsMessageLog.logMessage(
         self.tr('Starting ') + self.getName() + self.tr('Process.\n'),
         "DSG Tools Plugin", QgsMessageLog.CRITICAL)
     try:
         self.setStatus(self.tr('Running'), 3)  #now I'm running!
         classesWithElem = self.parameters['Classes']
         snap = self.parameters['Snap']
         self.startTimeCount()
         if len(classesWithElem) == 0:
             self.setStatus(
                 self.tr('No classes selected!. Nothing to be done.'),
                 1)  #Finished
             QgsMessageLog.logMessage(
                 self.tr('No classes selected! Nothing to be done.'),
                 "DSG Tools Plugin", QgsMessageLog.CRITICAL)
             return 1
         for key in classesWithElem:
             # preparation
             classAndGeom = self.classesWithElemDict[key]
             localProgress = ProgressWidget(
                 0,
                 1,
                 self.tr('Preparing execution for ') +
                 classAndGeom['tableName'],
                 parent=self.iface.mapCanvas())
             localProgress.step()
             processTableName, lyr, keyColumn = self.prepareExecution(
                 classAndGeom)
             localProgress.step()
             # running the process
             localProgress = ProgressWidget(
                 0,
                 1,
                 self.tr('Running process for ') +
                 classAndGeom['tableName'],
                 parent=self.iface.mapCanvas())
             localProgress.step()
             self.abstractDb.recursiveSnap([processTableName], snap,
                                           classAndGeom['geom'], keyColumn)
             localProgress.step()
             self.logLayerTime(
                 key
             )  #check this time later (I guess time will be counted twice due to postProcess)
             # finalization
             self.postProcessSteps(processTableName, lyr)
             QgsMessageLog.logMessage(
                 self.tr('All features from {} were snapped.').format(key),
                 "DSG Tools Plugin", QgsMessageLog.CRITICAL)
         self.setStatus(self.tr('All features were snapped.'), 1)  #Finished
         return 1
     except Exception as e:
         QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                  QgsMessageLog.CRITICAL)
         self.finishedWithError()
         return 0
 def on_buttonBox_accepted(self):
     QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
     exceptionList = []
     customJsonDict = dict()
     for i in self.customDict.keys():
         customJsonDict[i] = []
     correspondenceDict = {self.customDict[i]:i for i in self.customDict.keys()}
     nCustom = 0
     for key in self.contentsDict.keys():
         for widgetItem in self.contentsDict[key]['widgetList']:
             nCustom += 1
     progress = ProgressWidget(1,nCustom,self.tr('Preparing to export customizations... '), parent = self)
     progress.initBar()
     for key in self.contentsDict.keys():
         jsonTagList = []
         for widget in self.contentsDict[key]['widgetList']:
             currJsonItem = {'jsonUi':None, 'dbJsonTagList':[]}
             currentWidget = widget.layout().itemAt(0).widget()
             try:
                 jsonTagList = currentWidget.getJSONTag()
                 jsonUi = currentWidget.getUiParameterJsonDict()
             except Exception as e:
                 exceptionList.append(':'.join(e.args))
             if len(exceptionList) == 0:
                 currJsonItem['jsonUi'] = jsonUi
                 for jsonItem in jsonTagList:
                     if jsonItem not in currJsonItem['dbJsonTagList']:
                         currJsonItem['dbJsonTagList'].append(jsonItem)
                 if currJsonItem not in customJsonDict[correspondenceDict[key]]:
                     customJsonDict[correspondenceDict[key]].append(currJsonItem)
             progress.step()
     QApplication.restoreOverrideCursor()
     if self.validateJsonDict(customJsonDict) and len(exceptionList) == 0:
         versionText = 'database_'+self.edgvVersion
         finalJsonDict = {versionText:customJsonDict}
         self.customizationManager.createSetting(self.customizationName, self.edgvVersion, finalJsonDict)
         QMessageBox.information(self, self.tr('Success!'), self.tr('Database Customization ') + self.customizationName + self.tr(' created successfuly!'))
         #EMIT to reload?
         self.close()
     else:
         msg = ''
         if len(exceptionList)> 0:
             msg += self.tr('\Errors occured while trying to export customs built. Check qgis log for further details.')
             for error in exceptionList:
                 QgsMessageLog.logMessage(self.tr('Customization error: ') + error, "DSG Tools Plugin", QgsMessageLog.CRITICAL)
             QMessageBox.warning(self, self.tr('Error!'), msg)
示例#14
0
 def execute(self):
     """
     Reimplementation of the execute method from the parent class
     """
     QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
     try:
         self.setStatus(self.tr('Running'), 3) #now I'm running!
         self.abstractDb.deleteProcessFlags(self.getName()) #erase previous flags
         classesWithElem = self.parameters['Classes']
         if len(classesWithElem) == 0:
             self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished
             QgsMessageLog.logMessage(self.tr('No classes selected! Nothing to be done.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
             return 1
         tol = self.parameters['Angle']
         error = False
         flagLyr = self.getFlagLyr(0)
         for key in classesWithElem:
             self.startTimeCount()
             # preparation
             classAndGeom = self.classesWithElemDict[key]
             lyr = self.loadLayerBeforeValidationProcess(classAndGeom)
             # running the process
             localProgress = ProgressWidget(0, 1, self.tr('Running process on ')+classAndGeom['tableName'], parent=self.iface.mapCanvas())
             localProgress.step()
             result = self.getOutOfBoundsAngleList(lyr, tol, classAndGeom['geom'], onlySelected = self.parameters['Only Selected'])
             localProgress.step()
             
             # storing flags
             if len(result) > 0:
                 numberOfProblems = self.buildAndRaiseOutOfBoundsFlag(classAndGeom['tableSchema'], classAndGeom['tableName'], flagLyr, result)
                 QgsMessageLog.logMessage(str(numberOfProblems) + self.tr(' features from') + classAndGeom['tableName'] + self.tr(' have out of bounds angle(s). Check flags.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
             else:
                 QgsMessageLog.logMessage(self.tr('There are no out of bounds angles on ') + classAndGeom['tableName'] + '.', "DSG Tools Plugin", QgsMessageLog.CRITICAL)
             self.logLayerTime(classAndGeom['tableSchema']+'.'+classAndGeom['tableName'])
         if error:
             self.setStatus(self.tr('There are features with angles out of bounds. Check log.'), 4) #Finished with errors
         else:
             self.setStatus(self.tr('There are no features with angles out of bounds.'), 1) #Finished
         return 1
     except Exception as e:
         QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
         self.finishedWithError()
         return 0
示例#15
0
 def updateLayersFromDbs(self, type, dbList, showViews = False):
     """
     
     """
     errorDict = dict()
     if type == 'added':
         progress = ProgressWidget(1, len(dbList), self.tr('Reading selected databases... '), parent=self)
         progress.initBar()
         for dbName in dbList:
             try:
                 QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
                 geomList = self.customServerConnectionWidget.selectedDbsDict[dbName].getGeomColumnTupleList(showViews = showViews)
                 for tableSchema, tableName, geom, geomType, tableType in geomList:
                     if self.customServerConnectionWidget.edgvType == 'Non_EDGV':
                         lyrName = tableName
                         cat = tableSchema
                     else:
                         lyrName = '_'.join(tableName.split('_')[1::])
                         cat = tableName.split('_')[0]
                     key = ','.join([cat, lyrName, geom, geomType, tableType])
                     if key not in self.lyrDict.keys():
                         self.lyrDict[key] = dict()
                     self.lyrDict[key][dbName] = {'tableSchema':tableSchema, 'tableName':tableName, 'geom':geom, 'geomType':geomType, 'tableType':tableType, 'lyrName':lyrName, 'cat':cat}
             except Exception as e:
                 errorDict[dbName] = ':'.join(e.args)
                 QApplication.restoreOverrideCursor()
             progress.step()
             QApplication.restoreOverrideCursor()
             
     elif type == 'removed':
         for key in self.lyrDict.keys():
             for db in self.lyrDict[key].keys():
                 if db in dbList:
                     self.lyrDict[key].pop(db)
             if self.lyrDict[key] == dict():
                 self.lyrDict.pop(key)
     interfaceDictList = []
     for key in self.lyrDict.keys():
         cat, lyrName, geom, geomType, tableType = key.split(',')
         interfaceDictList.append({self.tr('Category'):cat, self.tr('Layer Name'):lyrName, self.tr('Geometry\nColumn'):geom, self.tr('Geometry\nType'):geomType, self.tr('Layer\nType'):tableType})
     self.layersCustomSelector.setInitialState(interfaceDictList,unique = True)
示例#16
0
 def createDb(self, dbName, srid, paramDict = dict(), parentWidget = None):
     destination = os.path.join(self.outputDir,dbName+'.sqlite')
     if 'version' not in paramDict.keys():
         raise Exception('Undefined database version')
     edgvPath = self.getTemplateLocation(paramDict['version'])
     f = open(edgvPath,'rb')
     g = open(destination,'wb')
     x = f.readlines()
     if parentWidget:
         progress = ProgressWidget(1,len(x)+2,self.tr('Creating Spatialite {0}... ').format(dbName), parent = parentWidget)
         progress.initBar()
     for i in x:
         g.write(i)
         if parentWidget:
             progress.step()
     g.close()
     f.close()
     #TODO: put defineSrid into AbstractDb
     self.defineSrid(destination, srid)
     if parentWidget:
         progress.step()
     newDb = self.instantiateNewDb(destination)
     if parentWidget:
         progress.step()
     return newDb
示例#17
0
 def createDb(self, dbName, srid, paramDict=dict(), parentWidget=None):
     destination = os.path.join(self.outputDir, dbName + '.sqlite')
     if 'version' not in paramDict.keys():
         raise Exception('Undefined database version')
     edgvPath = self.getTemplateLocation(paramDict['version'])
     f = open(edgvPath, 'rb')
     g = open(destination, 'wb')
     x = f.readlines()
     if parentWidget:
         progress = ProgressWidget(
             1,
             len(x) + 2,
             self.tr('Creating Spatialite {0}... ').format(dbName),
             parent=parentWidget)
         progress.initBar()
     for i in x:
         g.write(i)
         if parentWidget:
             progress.step()
     g.close()
     f.close()
     #TODO: put defineSrid into AbstractDb
     self.defineSrid(destination, srid)
     if parentWidget:
         progress.step()
     newDb = self.instantiateNewDb(destination)
     if parentWidget:
         progress.step()
     return newDb
 def searchDanglesOnPointDict(self, endVerticesDict, tableSchema,
                              tableName):
     """
     Counts the number of points on each endVerticesDict's key and returns a list of QgsPoint built from key candidate.
     """
     pointList = []
     idList = []
     # actual search for dangles
     localProgress = ProgressWidget(
         1,
         len(endVerticesDict.keys()),
         self.tr('Searching dangles on {0}.{1}').format(
             tableSchema, tableName),
         parent=self.iface.mapCanvas())
     for point in endVerticesDict.keys():
         # this means we only have one occurrence of point, therefore it is a dangle
         if len(endVerticesDict[point]) > 1:
             localProgress.step()
             continue
         pointList.append(point)
         localProgress.step()
     return pointList
示例#19
0
 def browseServer(self, dbList, host, port, user, password):
     """
     Browses server for EDGV databases
     dbList: databases list
     host: server host ip address
     port: server port
     user: user name
     password: password
     """
     canLoad = True
     if self.superNeeded:
         canLoad = False
         try:
             if self.serverWidget.abstractDb.checkSuperUser():
                 canLoad = True
             else:
                 QMessageBox.warning(self, self.tr('Info!'), self.tr('Connection refused. Connect with a super user to inspect server.'))
                 return []
         except Exception as e:
             QMessageBox.critical(self, self.tr('Critical!'), ':'.join(e.args))
     if canLoad:
         progress = ProgressWidget(1,len(dbList),self.tr('Loading databases from server... '), parent = self)
         progress.initBar()
         gen = self.factory.createSqlGenerator(False)
         edvgDbList = []
         for database in dbList:
             db = self.getPostGISDatabaseWithParams(database, host, port, user, password)
             if not db.open():
                 qgis.utils.iface.messageBar().pushMessage('DB :'+database+'| msg: '+db.lastError().databaseText(), level=QgsMessageBar.CRITICAL)
 
             query = QSqlQuery(db)
             if query.exec_(gen.getEDGVVersion()):
                 while query.next():
                     version = query.value(0)
                     if version:
                         edvgDbList.append((database, version))
             progress.step()
         return edvgDbList
示例#20
0
    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        self.startTimeCount()
        try:
            self.setStatus(self.tr('Running'), 3) #now I'm running!
            self.abstractDb.deleteProcessFlags(self.getName())
            
            rules = self.getRules()
            for rule in rules:
                # preparation
                localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + rule[0], parent=self.iface.mapCanvas())
                localProgress.step()
                class_a, lyrA, aKeyColumn = self.prepareExecution(rule[0])
                class_b, lyrB, bKeyColumn = self.prepareExecution(rule[3])
                # getting keyColumn because we want to be generic
                aGeomColumn = self.getGeometryColumnFromLayer(lyrA)
                bGeomColumn = self.getGeometryColumnFromLayer(lyrB)
                localProgress.step()

                #running the process in the temp table
                localProgress = ProgressWidget(0, 1, self.tr('Running process on ') + class_a, parent=self.iface.mapCanvas())
                localProgress.step()
                invalidGeomRecordList = self.abstractDb.testSpatialRule(class_a, rule[1], rule[2], class_b, rule[4], rule[5], rule[6], aKeyColumn, bKeyColumn, aGeomColumn, bGeomColumn)
                localProgress.step()
                                
                # dropping temp table
                self.abstractDb.dropTempTable(class_a)
                self.abstractDb.dropTempTable(class_b)

                if len(invalidGeomRecordList) > 0:
                    numberOfInvGeom = self.addFlag(invalidGeomRecordList)
                    for tuple in invalidGeomRecordList:
                        self.addClassesToBeDisplayedList(tuple[0])
                    msg = str(numberOfInvGeom) + self.tr(' features are invalid. Check flags.')
                    self.setStatus(msg, 4) #Finished with flags
                else:
                    msg = self.tr('All features are valid.')
                    self.setStatus(msg, 1) #Finished
            return 1             
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
            self.finishedWithError()
            return 0
示例#21
0
 def batchCreateDb(self, dbNameList, srid, paramDict  = dict()):
     outputDbDict = dict()
     errorDict = dict()
     templateDb = None
     if self.parentWidget:
         progress = ProgressWidget(1,len(dbNameList),self.tr('Creating databases... '),parent = self.parentWidget)
         progress.initBar()
     for dbName in dbNameList:
         try:
             if not templateDb: 
                 newDb = self.createDb(dbName, srid, paramDict = paramDict, parentWidget = self.parentWidget)
                 templateDb = dbName
             else:
                 paramDict['templateDb'] = templateDb
                 newDb = self.createDb(dbName, srid, paramDict, parentWidget = self.parentWidget)
             outputDbDict[dbName] = newDb
         except Exception as e:
             if dbName not in errorDict.keys():
                 errorDict[dbName] = ':'.join(e.args)
             else:
                 errorDict[dbName] += '\n' + ':'.join(e.args)
         if self.parentWidget:
             progress.step()
     return outputDbDict, errorDict
示例#22
0
    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        try:
            self.startTimeCount()
            self.setStatus(self.tr('Running'), 3) #now I'm running!

            # getting parameters after the execution of our pre process
            self.flagsDict = self.abstractDb.getFlagsDictByProcess('IdentifyDuplicatedGeometriesProcess')

            flagsClasses = self.flagsDict.keys()
            if len(flagsClasses) == 0:
                self.setStatus(self.tr('There are no duplicated geometries.'), 1) #Finished
                return 1
            numberOfProblems = 0
            for cl in flagsClasses:
                self.startTimeCount()
                # preparation
                localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + cl, parent=self.iface.mapCanvas())
                localProgress.step()
                processTableName, lyr, keyColumn = self.prepareExecution(cl)
                localProgress.step()
                #running the process in the temp table
                localProgress = ProgressWidget(0, 1, self.tr('Running process on ') + cl, parent=self.iface.mapCanvas())
                localProgress.step()
                problems = self.abstractDb.removeFeatures(processTableName,self.flagsDict[cl], keyColumn)
                localProgress.step()
                numberOfProblems += problems
                # finalization
                self.postProcessSteps(processTableName, lyr)
                QgsMessageLog.logMessage(str(problems) + self.tr(' duplicated features from ') + cl + self.tr(' were removed.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
                self.logLayerTime(cl)
            self.setStatus(str(numberOfProblems) + self.tr(' duplicated features were removed.'), 1)
            return 1
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
            self.finishedWithError()
            return 0
示例#23
0
    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        try:
            self.setStatus(self.tr('Running'), 3) #now I'm running!
            self.abstractDb.deleteProcessFlags(self.getName()) #erase previous flags
            tol = self.parameters[self.tr('Length')]
            classesWithElem = self.parameters['Classes']
            if len(classesWithElem) == 0:
                self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished
                QgsMessageLog.logMessage(self.tr('No classes selected! Nothing to be done.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
                return 1
            classesWithGeom = []
            recordList = []
            for key in classesWithElem:
                # preparation
                classAndGeom = self.classesWithElemDict[key]
                localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + classAndGeom['tableName'], parent=self.iface.mapCanvas())
                localProgress.step()
                lyr = self.loadLayerBeforeValidationProcess(classAndGeom)
                localProgress.step()

                allIds = lyr.allFeatureIds()
                localProgress = ProgressWidget(1, len(allIds) - 1, self.tr('Running process on ') + classAndGeom['tableName'], parent=self.iface.mapCanvas())
                if self.parameters['Only Selected']:
                    featureList = lyr.selectedFeatures()
                else:
                    featureList = lyr.getFeatures()
                for feat in featureList:
                    if feat.geometry().length() < tol:
                        geometry = binascii.hexlify(feat.geometry().asWkb())
                        recordList.append((classAndGeom['tableSchema']+'.'+classAndGeom['tableName'], feat.id(), self.tr('Small Line.'), geometry, classAndGeom['geom']))
                    localProgress.step()

            if len(recordList) > 0:
                numberOfProblems = self.addFlag(recordList)
                msg =  str(numberOfProblems)+ self.tr(' features have small lines. Check flags.')
                self.setStatus(msg, 4) #Finished with flags
                QgsMessageLog.logMessage(msg, "DSG Tools Plugin", QgsMessageLog.CRITICAL)
            else:
                msg = self.tr('There are no small lines.')
                self.setStatus(msg, 1) #Finished
                QgsMessageLog.logMessage(msg, "DSG Tools Plugin", QgsMessageLog.CRITICAL)
            return 1
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
            self.finishedWithError()
            return 0
示例#24
0
 def createDbFromMIList(self, miList, srid, prefix = None, sufix = None, createFrame = False,  paramDict = dict()):
     outputDbDict = dict()
     errorDict = dict()
     templateDb = None
     if self.parentWidget:
         progress = ProgressWidget(1,2*len(miList)+1,self.tr('Creating databases... '),parent = self.parentWidget)
         progress.initBar()
         progress.step()
     for mi in miList:
         dbName = self.buildDatabaseName(mi, prefix, sufix)
         try:
             if not templateDb: 
                 newDb = self.createDb(dbName, srid, paramDict, parentWidget = self.parentWidget)
                 templateDb = dbName
             else:
                 paramDict['templateDb'] = templateDb
                 newDb = self.createDb(dbName, srid, paramDict, parentWidget = self.parentWidget)
             outputDbDict[dbName] = newDb
         except Exception as e:
             if dbName not in errorDict.keys():
                 errorDict[dbName] = ':'.join(e.args)
             else:
                 errorDict[dbName] += '\n' + ':'.join(e.args)
         if self.parentWidget:
             progress.step()
     if createFrame:
         for dbName in outputDbDict.keys():
             try:           
                 scale = self.scaleMIDict[len(mi.split('-'))]
                 mi = [i for i in miList if i in dbName][0]
                 outputDbDict[dbName].createFrame('mi', scale, mi, paramDict = paramDict)
             except Exception as e:
                 if dbName not in errorDict.keys():
                     errorDict[dbName] = ':'.join(e.args)
                 else:
                     errorDict[dbName] += '\n' + ':'.join(e.args)
             if self.parentWidget:
                 progress.step()
     return outputDbDict, errorDict
示例#25
0
    def on_buttonBox_accepted(self):
        """
        Loads the selected classes/categories
        """
        #1- filter classes if categories is checked and build list.
        selectedKeys = self.layersCustomSelector.getSelectedNodes()
        if len(selectedKeys) == 0:
            QMessageBox.information(
                self, self.tr('Error!'),
                self.tr('Select at least one layer to be loaded!'))
            return

        #2- get parameters
        withElements = self.checkBoxOnlyWithElements.isChecked()
        selectedStyle = None
        if self.customServerConnectionWidget.edgvType == 'Non_EDGV':
            isEdgv = False
        else:
            isEdgv = True
        if self.styleComboBox.currentIndex() != 0:
            selectedStyle = self.customServerConnectionWidget.stylesDict[
                self.styleComboBox.currentText()]
        uniqueLoad = self.uniqueLoadCheckBox.isChecked()
        onlyParents = self.onlyParentsCheckBox.isChecked()
        #3- Build factory dict
        factoryDict = dict()
        dbList = self.customServerConnectionWidget.selectedDbsDict.keys()
        for dbName in dbList:
            factoryDict[dbName] = self.layerFactory.makeLoader(
                self.iface,
                self.customServerConnectionWidget.selectedDbsDict[dbName])
        #4- load for each db
        exceptionDict = dict()
        progress = ProgressWidget(
            1,
            len(dbList),
            self.tr('Loading layers from selected databases... '),
            parent=self)
        for dbName in factoryDict.keys():
            QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
            try:
                selectedClasses = []
                for i in selectedKeys:
                    if i in self.lyrDict.keys():
                        if dbName in self.lyrDict[i].keys():
                            selectedClasses.append(self.lyrDict[i][dbName])
                factoryDict[dbName].load(selectedClasses,
                                         uniqueLoad=uniqueLoad,
                                         onlyWithElements=withElements,
                                         stylePath=selectedStyle,
                                         useInheritance=onlyParents,
                                         isEdgv=isEdgv,
                                         parent=self)
                progress.step()
            except Exception as e:
                exceptionDict[dbName] = ':'.join(e.args)
                QApplication.restoreOverrideCursor()
                progress.step()
            QApplication.restoreOverrideCursor()
            if factoryDict[dbName].errorLog != '':
                if dbName in exceptionDict.keys():
                    exceptionDict[
                        dbName] += '\n' + factoryDict[dbName].errorLog
                else:
                    exceptionDict[dbName] = factoryDict[dbName].errorLog
        QApplication.restoreOverrideCursor()
        self.logInternalError(exceptionDict)
        self.close()
示例#26
0
    def updateLayersFromDbs(self, type, dbList, showViews=False):
        """
        
        """
        errorDict = dict()
        if type == 'added':
            progress = ProgressWidget(
                1,
                len(dbList),
                self.tr('Reading selected databases... '),
                parent=self)
            progress.initBar()
            for dbName in dbList:
                try:
                    QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
                    geomList = self.customServerConnectionWidget.selectedDbsDict[
                        dbName].getGeomColumnTupleList(showViews=showViews)
                    for tableSchema, tableName, geom, geomType, tableType in geomList:
                        if self.customServerConnectionWidget.edgvType == 'Non_EDGV':
                            lyrName = tableName
                            cat = tableSchema
                        else:
                            lyrName = '_'.join(tableName.split('_')[1::])
                            cat = tableName.split('_')[0]
                        key = ','.join(
                            [cat, lyrName, geom, geomType, tableType])
                        if key not in self.lyrDict.keys():
                            self.lyrDict[key] = dict()
                        self.lyrDict[key][dbName] = {
                            'tableSchema': tableSchema,
                            'tableName': tableName,
                            'geom': geom,
                            'geomType': geomType,
                            'tableType': tableType,
                            'lyrName': lyrName,
                            'cat': cat
                        }
                except Exception as e:
                    errorDict[dbName] = ':'.join(e.args)
                    QApplication.restoreOverrideCursor()
                progress.step()
                QApplication.restoreOverrideCursor()

        elif type == 'removed':
            for key in self.lyrDict.keys():
                for db in self.lyrDict[key].keys():
                    if db in dbList:
                        self.lyrDict[key].pop(db)
                if self.lyrDict[key] == dict():
                    self.lyrDict.pop(key)
        interfaceDictList = []
        for key in self.lyrDict.keys():
            cat, lyrName, geom, geomType, tableType = key.split(',')
            interfaceDictList.append({
                self.tr('Category'): cat,
                self.tr('Layer Name'): lyrName,
                self.tr('Geometry\nColumn'): geom,
                self.tr('Geometry\nType'): geomType,
                self.tr('Layer\nType'): tableType
            })
        self.layersCustomSelector.setInitialState(interfaceDictList,
                                                  unique=True)
示例#27
0
    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(
            self.tr('Starting ') + self.getName() + self.tr(' Process.'),
            "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        try:
            self.setStatus(self.tr('Running'), 3)  #now I'm running!
            classesWithElem = self.parameters['Classes']
            if len(classesWithElem) == 0:
                self.setStatus(
                    self.tr('No classes selected!. Nothing to be done.'),
                    1)  #Finished
                QgsMessageLog.logMessage(
                    self.tr('No classes selected! Nothing to be done.'),
                    "DSG Tools Plugin", QgsMessageLog.CRITICAL)
                return 1
            #getting parameters
            tol = self.parameters['Snap']
            for key in classesWithElem:
                # preparation
                classAndGeom = self.classesWithElemDict[key]
                localProgress = ProgressWidget(
                    0,
                    1,
                    self.tr('Preparing execution for ') +
                    classAndGeom['tableName'],
                    parent=self.iface.mapCanvas())
                localProgress.step()
                processTableName, lyr, keyColumn = self.prepareExecution(
                    classAndGeom)
                localProgress.step()

                # specific EPSG search
                parameters = {
                    'tableSchema': classAndGeom['tableSchema'],
                    'tableName': classAndGeom['tableName'],
                    'geometryColumn': classAndGeom['geom']
                }
                srid = self.abstractDb.findEPSG(parameters=parameters)

                #running the process in the temp table
                localProgress = ProgressWidget(0,
                                               1,
                                               self.tr('Running process on ') +
                                               classAndGeom['tableName'],
                                               parent=self.iface.mapCanvas())
                localProgress.step()
                self.abstractDb.snapToGrid([processTableName], tol, srid,
                                           classAndGeom['geom'])
                localProgress.step()

                # finalization
                self.postProcessSteps(processTableName, lyr)

                #setting status
                QgsMessageLog.logMessage(
                    self.tr('All features from ') + classAndGeom['tableName'] +
                    self.tr(' snapped to grid successfully.'),
                    "DSG Tools Plugin", QgsMessageLog.CRITICAL)
            #returning success
            self.setStatus(
                self.tr('All features from ') + classAndGeom['tableName'] +
                self.tr(' snapped successfully.'), 1)  #Finished
            return 1
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                     QgsMessageLog.CRITICAL)
            self.finishedWithError()
            #returning error
            return 0
示例#28
0
    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(
            self.tr('Starting ') + self.getName() + self.tr('Process.'),
            "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        try:
            self.setStatus(self.tr('Running'), 3)  #now I'm running!
            self.abstractDb.deleteProcessFlags(self.getName())
            classesWithElem = self.parameters['Classes']
            if len(classesWithElem) == 0:
                self.setStatus(
                    self.tr('No classes selected!. Nothing to be done.'),
                    1)  #Finished
                return 1
            for key in classesWithElem:
                self.startTimeCount()
                # preparation
                classAndGeom = self.classesWithElemDict[key]
                lyr = self.loadLayerBeforeValidationProcess(classAndGeom)
                localProgress = ProgressWidget(
                    0,
                    1,
                    self.tr('Preparing execution for ') +
                    classAndGeom['lyrName'],
                    parent=self.iface.mapCanvas())
                localProgress.step()
                localProgress.step()

                lyr.startEditing()
                provider = lyr.dataProvider()
                uri = QgsDataSourceURI(provider.dataSourceUri())
                keyColumn = uri.keyColumn()

                if self.parameters['Only Selected']:
                    featureList = lyr.selectedFeatures()
                    size = len(featureList)
                else:
                    featureList = lyr.getFeatures()
                    size = len(lyr.allFeatureIds())

                localProgress = ProgressWidget(1,
                                               size,
                                               self.tr('Running process on ') +
                                               classAndGeom['lyrName'],
                                               parent=self.iface.mapCanvas())
                for feat in featureList:
                    geom = feat.geometry()
                    if not geom:
                        #insert deletion
                        lyr.deleteFeature(feat.id())
                        localProgress.step()
                        continue
                    if geom.geometry().partCount() > 1:
                        parts = geom.asGeometryCollection()
                        for part in parts:
                            part.convertToMultiType()
                        addList = []
                        for i in range(1, len(parts)):
                            if parts[i]:
                                newFeat = QgsFeature(feat)
                                newFeat.setGeometry(parts[i])
                                idx = newFeat.fieldNameIndex(keyColumn)
                                newFeat.setAttribute(
                                    idx, provider.defaultValue(idx))
                                addList.append(newFeat)
                        feat.setGeometry(parts[0])
                        lyr.updateFeature(feat)
                        lyr.addFeatures(addList, True)
                    localProgress.step()
                self.logLayerTime(classAndGeom['lyrName'])

            msg = self.tr('All geometries are now single parted.')
            self.setStatus(msg, 1)  #Finished
            return 1
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                     QgsMessageLog.CRITICAL)
            self.finishedWithError()
            return 0
示例#29
0
 def load(self, inputList, useQml = False, uniqueLoad = False, useInheritance = False, stylePath = None, onlyWithElements = False, geomFilterList = [], isEdgv = True, parent = None):
     """
     1. Get loaded layers
     2. Filter layers;
     3. Load domains;
     4. Get Aux Dicts;
     5. Build Groups;
     6. Load Layers;
     """
     layerList, isDictList = self.preLoadStep(inputList)
     #1. Get Loaded Layers
     loadedLayers = self.iface.legendInterface().layers()
     loadedGroups = self.iface.legendInterface().groups()
     #2. Filter Layers:
     filteredLayerList = self.filterLayerList(layerList, useInheritance, onlyWithElements, geomFilterList)
     if isDictList:
         filteredDictList = [i for i in inputList if i['tableName'] in filteredLayerList]
     else:
         filteredDictList = filteredLayerList
     edgvVersion = self.abstractDb.getDatabaseVersion()
     dbGroup = self.getDatabaseGroup(loadedGroups)
     #3. Load Domains
     #do this only if EDGV Version = FTer
     if edgvVersion in ('FTer_2a_Ed', '3.0'):
         domainGroup = self.createGroup(loadedGroups, self.tr("Domains"), dbGroup)
         domLayerDict = self.loadDomains(filteredLayerList, loadedLayers, domainGroup)
     else:
         domLayerDict = dict()
     #4. Get Aux dicts
     domainDict = self.abstractDb.getDbDomainDict(self.geomDict)
     constraintDict = self.abstractDb.getCheckConstraintDict()
     multiColumnsDict = self.abstractDb.getMultiColumnsDict()
     notNullDict = self.abstractDb.getNotNullDictV2()
     lyrDict = self.getLyrDict(filteredDictList, isEdgv=isEdgv)
     
     #5. Build Groups
     groupDict = self.prepareGroups(loadedGroups, dbGroup, lyrDict)
     #6. load layers
     loadedDict = dict()
     if parent:
         primNumber = 0
         for prim in lyrDict.keys():
             for cat in lyrDict[prim].keys():
                 for lyr in lyrDict[prim][cat]:
                     primNumber += 1
         localProgress = ProgressWidget(1, primNumber-1, self.tr('Loading layers... '), parent=parent)
     for prim in lyrDict.keys():
         for cat in lyrDict[prim].keys():
             for lyr in lyrDict[prim][cat]:
                 try:
                     vlayer = self.loadLayer(lyr, groupDict[prim][cat], loadedLayers, useInheritance, useQml, uniqueLoad, stylePath, domainDict, multiColumnsDict, domLayerDict, edgvVersion)
                     if vlayer:
                         loadedLayers.append(vlayer)
                         if isinstance(lyr, dict):
                             key = lyr['lyrName']
                         else:
                             key = lyr
                         loadedDict[key]=vlayer
                 except Exception as e:
                     if isinstance(lyr, dict):
                         key = lyr['lyrName']
                     else:
                         key = lyr
                     self.logErrorDict[key] = self.tr('Error for layer ')+key+': '+':'.join(e.args)
                     self.logError()
                 if parent:
                     localProgress.step()
     return loadedDict
示例#30
0
class ValidationProcess(QObject):
    def __init__(self, postgisDb, iface, instantiating=False):
        """
        Constructor
        """
        super(ValidationProcess, self).__init__()
        self.abstractDb = postgisDb
        if self.getStatus() == None:
            self.setStatus(self.tr('Instantianting process'), 0)
        self.classesToBeDisplayedAfterProcess = []
        self.parameters = None
        self.iface = iface
        self.layerLoader = LayerLoaderFactory().makeLoader(
            self.iface, self.abstractDb)
        self.processAlias = self.tr('Validation Process')
        self.instantiating = instantiating
        self.totalTime = 0
        self.startTime = 0
        self.endTime = 0
        self.dbUserName = None
        self.logMsg = None
        self.processName = None

    def getFlagLyr(self, dimension):
        if dimension == 0:
            layer = {
                'cat': 'aux',
                'geom': 'geom',
                'geomType': 'MULTIPOINT',
                'lyrName': 'flags_validacao_p',
                'tableName': 'aux_flags_validacao_p',
                'tableSchema': 'validation',
                'tableType': 'BASE TABLE'
            }
        elif dimension == 1:
            layer = {
                'cat': 'aux',
                'geom': 'geom',
                'geomType': 'MULTILINESTRING',
                'lyrName': 'flags_validacao_l',
                'tableName': 'aux_flags_validacao_l',
                'tableSchema': 'validation',
                'tableType': 'BASE TABLE'
            }
        elif dimension == 2:
            layer = {
                'cat': 'aux',
                'geom': 'geom',
                'geomType': 'MULTIPOLYGON',
                'lyrName': 'flags_validacao_a',
                'tableName': 'aux_flags_validacao_a',
                'tableSchema': 'validation',
                'tableType': 'BASE TABLE'
            }
        return self.loadLayerBeforeValidationProcess(layer)

    def setProcessName(self, processName):
        """
        Identifies the process name as it is.
        """
        self.processName = processName

    def setDbUserName(self, userName):
        """
        Identifies the database username.
        """
        self.dbUserName = userName

    def setParameters(self, params):
        """
        Define the process parameteres
        """
        self.parameters = params

    def execute(self):
        """
        Abstract method. MUST be reimplemented.
        """
        pass

    def shouldBeRunAgain(self):
        """
        Defines if the method should run again later
        """
        return False

    def getName(self):
        """
        Gets the process name
        """
        return str(self.__class__).split('.')[-1].replace('\'>', '')

    def getProcessGroup(self):
        """
        Returns the process group
        """
        return 'Ungrouped'

    def getClassesToBeDisplayedAfterProcess(self):
        """
        Returns classes to be loaded to TOC after executing this process.
        """
        return self.classesToBeDisplayedAfterProcess

    def addClassesToBeDisplayedList(self, className):
        """
        Add a class into the class list that will be displayed after the process
        """
        if className not in self.classesToBeDisplayedAfterProcess:
            self.classesToBeDisplayedAfterProcess.append(className)

    def clearClassesToBeDisplayedAfterProcess(self):
        """
        Clears the class list to be displayed
        """
        self.classesToBeDisplayedAfterProcess = []

    def preProcess(self):
        """
        Returns the name of the pre process that must run before, must be reimplemented in each process
        """
        return None

    def postProcess(self):
        """
        Returns the name of the post process that must run after, must be reimplemented in each process
        """
        return None

    def addFlag(self, flagTupleList):
        """
        Adds flags
        flagTUpleList: list of tuples to be added as flag
        """
        try:
            return self.abstractDb.insertFlags(flagTupleList, self.getName())
        except Exception as e:
            QMessageBox.critical(
                None, self.tr('Critical!'),
                self.
                tr('A problem occurred inserting flags! Check log for details.'
                   ))
            QgsMessageLog.logMessage(str(e.args[0]), "DSG Tools Plugin",
                                     QgsMessageLog.CRITICAL)

    def removeFeatureFlags(self, layer, featureId):
        """
        Removes specific flags from process
        layer: Name of the layer that should be remove from the flags
        featureId: Feature id from layer name that must be removed
        """
        try:
            return self.abstractDb.removeFeatureFlags(layer, featureId,
                                                      self.getName())
        except Exception as e:
            QMessageBox.critical(
                None, self.tr('Critical!'),
                self.tr('A problem occurred! Check log for details.'))
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                     QgsMessageLog.CRITICAL)

    def getStatus(self):
        """
        Gets the process status
        """
        try:
            return self.abstractDb.getValidationStatus(self.getName())
        except Exception as e:
            QMessageBox.critical(
                None, self.tr('Critical!'),
                self.tr('A problem occurred! Check log for details.'))
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                     QgsMessageLog.CRITICAL)

    def getStatusMessage(self):
        """
        Gets the status message text
        """
        try:
            return self.abstractDb.getValidationStatusText(self.getName())
        except Exception as e:
            QMessageBox.critical(
                None, self.tr('Critical!'),
                self.tr('A problem occurred! Check log for details.'))
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                     QgsMessageLog.CRITICAL)

    def setStatus(self, msg, status):
        """
        Sets the status message
        status: Status number
        msg: Status text message
        """
        try:
            if status not in [
                    0, 3
            ]:  # neither running nor instatiating status should be logged
                self.logProcess()
                if self.logMsg:
                    msg += "\n" + self.logMsg
                elif not self.dbUserName:
                    msg += self.tr("Database username: {}\n").format(
                        self.abstractDb.db.userName())
            self.abstractDb.setValidationProcessStatus(self.getName(), msg,
                                                       status)
        except Exception as e:
            QMessageBox.critical(
                None, self.tr('Critical!'),
                self.tr('A problem occurred! Check log for details.'))
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                     QgsMessageLog.CRITICAL)

    def finishedWithError(self):
        """
        Sets the finished with error status (status number 2)
        Clears the classes to be displayed
        """
        self.setStatus(self.tr('Process finished with errors.'),
                       2)  #Failed status
        #drop temps
        try:
            classesWithElem = self.parameters['Classes']
            for cl in classesWithElem:
                tempName = cl.split(':')[0] + '_temp'
                self.abstractDb.dropTempTable(tempName)
        except:
            pass
        self.clearClassesToBeDisplayedAfterProcess()

    def inputData(self):
        """
        Returns current active layers
        """
        return self.iface.mapCanvas().layers()

    def getTableNameFromLayer(self, lyr):
        """
        Gets the layer name as present in the rules
        """
        uri = lyr.dataProvider().dataSourceUri()
        dsUri = QgsDataSourceURI(uri)
        name = '.'.join([dsUri.schema(), dsUri.table()])
        return name

    def mapInputLayer(self, inputLyr, selectedFeatures=False):
        """
        Gets the layer features considering the edit buffer in the case
        the layer is already in edition mode
        """
        #return dict
        featureMap = dict()
        #getting only selected features
        if selectedFeatures:
            for feat in inputLyr.selectedFeatures():
                featureMap[feat.id()] = feat
        #getting all features
        else:
            for feat in inputLyr.getFeatures():
                featureMap[feat.id()] = feat
        return featureMap

    def updateOriginalLayer(self,
                            pgInputLayer,
                            qgisOutputVector,
                            featureList=None,
                            featureTupleList=None):
        """
        Updates the original layer using the grass output layer
        pgInputLyr: postgis input layer
        qgisOutputVector: qgis output layer
        Speed up tips: http://nyalldawson.net/2016/10/speeding-up-your-pyqgis-scripts/
        """
        provider = pgInputLayer.dataProvider()
        # getting keyColumn because we want to be generic
        uri = QgsDataSourceURI(pgInputLayer.dataProvider().dataSourceUri())
        keyColumn = uri.keyColumn()
        # starting edition mode
        pgInputLayer.startEditing()
        addList = []
        idsToRemove = []
        #making the changes and inserts
        for feature in pgInputLayer.getFeatures():
            id = feature.id()
            outFeats = []
            #getting the output features with the specific id
            if qgisOutputVector:
                for gf in qgisOutputVector.dataProvider().getFeatures(
                        QgsFeatureRequest(
                            QgsExpression("{0}={1}".format(keyColumn, id)))):
                    outFeats.append(gf)
            elif featureTupleList:
                for gfid, gf in featureTupleList:
                    if gfid == id and gf['classname'] == pgInputLayer.name():
                        outFeats.append(gf)
            else:
                for gf in [gf for gf in featureList if gf.id() == id]:
                    outFeats.append(gf)
            #starting to make changes
            for i in range(len(outFeats)):
                if i == 0:
                    #let's update this feature
                    newGeom = outFeats[i].geometry()
                    newGeom.convertToMultiType()
                    feature.setGeometry(newGeom)
                    pgInputLayer.updateFeature(feature)
                else:
                    #for the rest, let's add them
                    newFeat = QgsFeature(feature)
                    newGeom = outFeats[i].geometry()
                    newGeom.convertToMultiType()
                    newFeat.setGeometry(newGeom)
                    idx = newFeat.fieldNameIndex(keyColumn)
                    newFeat.setAttribute(idx, provider.defaultValue(idx))
                    addList.append(newFeat)
            #in the case we don't find features in the output we should mark them to be removed
            if len(outFeats) == 0:
                idsToRemove.append(id)
        #pushing the changes into the edit buffer
        pgInputLayer.addFeatures(addList, True)
        #removing features from the layer.
        pgInputLayer.deleteFeatures(idsToRemove)

    def updateOriginalLayerV2(self,
                              pgInputLayer,
                              qgisOutputVector,
                              featureList=None,
                              featureTupleList=None,
                              deleteFeatures=True):
        """
        Updates the original layer using the grass output layer
        pgInputLyr: postgis input layer
        qgisOutputVector: qgis output layer
        Speed up tips: http://nyalldawson.net/2016/10/speeding-up-your-pyqgis-scripts/
        1- Make pgIdList, by querying it with flag QgsFeatureRequest.NoGeometry
        2- Build output dict
        3- Perform operation
        """
        provider = pgInputLayer.dataProvider()
        # getting keyColumn because we want to be generic
        uri = QgsDataSourceURI(pgInputLayer.dataProvider().dataSourceUri())
        keyColumn = uri.keyColumn()
        # starting edition mode
        pgInputLayer.startEditing()
        pgInputLayer.beginEditCommand('Updating layer')
        addList = []
        idsToRemove = []
        inputDict = dict()
        #this is done to work generically with output layers that are implemented different from ours
        isMulti = QgsWKBTypes.isMultiType(int(pgInputLayer.wkbType()))  #
        #making the changes and inserts
        #this request only takes ids to build inputDict
        request = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry)
        for feature in pgInputLayer.getFeatures(request):
            inputDict[feature.id()] = dict()
            inputDict[feature.id()]['featList'] = []
            inputDict[feature.id()]['featWithoutGeom'] = feature
        inputDictKeys = inputDict.keys()
        if qgisOutputVector:
            for feat in qgisOutputVector.dataProvider().getFeatures():
                if keyColumn == '':
                    featid = feat.id()
                else:
                    featid = feat[keyColumn]
                if featid in inputDictKeys:  #verificar quando keyColumn = ''
                    inputDict[featid]['featList'].append(feat)
        elif featureTupleList:
            for gfid, gf in featureTupleList:
                if gfid in inputDictKeys and gf[
                        'classname'] == pgInputLayer.name():
                    inputDict[gfid]['featList'].append(gf)
        else:
            for feat in featureList:
                if keyColumn == '':
                    featid = feat.id()
                else:
                    featid = feat[keyColumn]
                if featid in inputDictKeys:
                    inputDict[featid]['featList'].append(feat)
        #finally, do what must be done
        for id in inputDictKeys:
            outFeats = inputDict[id]['featList']
            #starting to make changes
            for i in range(len(outFeats)):
                if i == 0:
                    #let's update this feature
                    newGeom = outFeats[i].geometry()
                    if newGeom:
                        if isMulti:
                            newGeom.convertToMultiType()
                        pgInputLayer.changeGeometry(
                            id, newGeom)  #It is faster according to the api
                    else:
                        if id not in idsToRemove:
                            idsToRemove.append(id)
                else:
                    #for the rest, let's add them
                    newFeat = QgsFeature(inputDict[id]['featWithoutGeom'])
                    newGeom = outFeats[i].geometry()
                    if newGeom:
                        if isMulti and newGeom:
                            newGeom.convertToMultiType()
                        newFeat.setGeometry(newGeom)
                        if keyColumn != '':
                            idx = newFeat.fieldNameIndex(keyColumn)
                            newFeat.setAttribute(idx,
                                                 provider.defaultValue(idx))
                        addList.append(newFeat)
                    else:
                        if id not in idsToRemove:
                            idsToRemove.append(id)
            #in the case we don't find features in the output we should mark them to be removed
            if len(outFeats) == 0 and deleteFeatures:
                idsToRemove.append(id)
        #pushing the changes into the edit buffer
        pgInputLayer.addFeatures(addList, True)
        #removing features from the layer.
        pgInputLayer.deleteFeatures(idsToRemove)
        pgInputLayer.endEditCommand()

    def getProcessingErrors(self, layer):
        """
        Gets processing errors
        layer: error layer (QgsVectorLayer) output made by grass
        """
        recordList = []
        for feature in layer.getFeatures():
            recordList.append(
                (feature.id(), binascii.hexlify(feature.geometry().asWkb())))
        return recordList

    def loadLayerBeforeValidationProcess(self, cl):
        """
        Loads all layers to QGIS' TOC prior the validation process
        """
        #creating vector layer
        if self.abstractDb.getDatabaseVersion() == 'Non_EDGV':
            isEdgv = False
        else:
            isEdgv = True
        if isinstance(cl, dict):
            lyr = self.layerLoader.load([cl], uniqueLoad=True,
                                        isEdgv=isEdgv)[cl['lyrName']]
        else:
            schema, layer_name = self.abstractDb.getTableSchema(cl)
            lyr = self.layerLoader.load([layer_name],
                                        uniqueLoad=True,
                                        isEdgv=isEdgv)[layer_name]
        return lyr

    def prepareExecution(self,
                         cl,
                         geometryColumn='geom',
                         selectedFeatures=False):
        """
        Prepare the process to be executed
        cl: table name
        """
        # loading layer prior to execution
        lyr = self.loadLayerBeforeValidationProcess(cl)
        # getting keyColumn because we want to be generic
        uri = QgsDataSourceURI(lyr.dataProvider().dataSourceUri())
        keyColumn = uri.keyColumn()
        #getting feature map including the edit buffer
        featureMap = self.mapInputLayer(lyr, selectedFeatures=selectedFeatures)
        #getting table name with schema
        if isinstance(cl, dict):
            tableSchema = cl['tableSchema']
            tableName = cl['tableName']
            geometryColumn = cl['geom']
            fullTableName = '''{0}.{1}'''.format(cl['tableSchema'],
                                                 cl['tableName'])
        else:
            fullTableName = cl
            tableSchema, tableName = cl.split('.')

        #setting temp table name
        processTableName = fullTableName + '_temp'
        # specific EPSG search
        parameters = {
            'tableSchema': tableSchema,
            'tableName': tableName,
            'geometryColumn': geometryColumn
        }
        srid = self.abstractDb.findEPSG(parameters=parameters)
        #creating temp table
        self.abstractDb.createAndPopulateTempTableFromMap(
            fullTableName, featureMap, geometryColumn, keyColumn, srid)
        return processTableName, lyr, keyColumn

    def postProcessSteps(self, processTableName, lyr):
        """
        Execute the final steps after the actual process
        """
        #getting the output as a QgsVectorLayer
        outputLayer = QgsVectorLayer(
            self.abstractDb.getURI(processTableName, True).uri(),
            processTableName, "postgres")
        #updating the original layer (lyr)
        self.updateOriginalLayerV2(lyr, outputLayer)
        #dropping the temp table as we don't need it anymore
        self.abstractDb.dropTempTable(processTableName)

    def getGeometryTypeText(self, geomtype):
        if geomtype == QGis.WKBPoint:
            return 'Point'
        elif geomtype == QGis.WKBMultiPoint:
            return 'MultiPoint'
        elif geomtype == QGis.WKBLineString:
            return 'Linestring'
        elif geomtype == QGis.WKBMultiLineString:
            return 'MultiLinestring'
        elif geomtype == QGis.WKBPolygon:
            return 'Polygon'
        elif geomtype == QGis.WKBMultiPolygon:
            return 'MultiPolygon'
        else:
            raise Exception(
                self.tr('Operation not defined with provided geometry type!'))

    def createUnifiedLineLayer(self, layerList, onlySelected=False):
        """
        For each layer in layerList, transforms it into lines if lyrType 
        is polygon and adds features into layerList.
        Duplicates can happen in this process.
        """
        srid = layerList[0].crs().authid().split(':')[-1]
        coverage = self.iface.addVectorLayer(
            "{0}?crs=epsg:{1}".format('Linestring', srid), "coverage_lines",
            "memory")
        provider = coverage.dataProvider()
        coverage.startEditing()
        coverage.beginEditCommand('Creating coverage lines layer')

        self.localProgress = ProgressWidget(
            1,
            len(layerList) - 1,
            self.tr('Building unified layers with  ') +
            ', '.join([i.name() for i in layerList]) + '.',
            parent=self.iface.mapCanvas())
        addFeatureList = []
        for lyr in layerList:
            isPolygon = True if lyr.dataProvider().geometryType() in [
                QGis.WKBPolygon, QGis.WKBMultiPolygon
            ] else False
            isMulti = QgsWKBTypes.isMultiType(int(lyr.wkbType()))
            featureIterator = lyr.getFeatures(
            ) if not onlySelected else lyr.selectedFeatures()
            for feature in featureIterator:
                geom = feature.geometry()
                if geom:
                    parts = geom.asGeometryCollection()
                    if parts:
                        for part in parts:
                            if isPolygon:
                                linestrings = part.asPolygon()
                                for line in linestrings:
                                    newfeat = QgsFeature(
                                        coverage.pendingFields())
                                    newfeat.setGeometry(
                                        QgsGeometry.fromPolyline(line))
                                    addFeatureList.append(newfeat)
                            else:
                                newfeat = QgsFeature(coverage.pendingFields())
                                newfeat.setGeometry(part)
                                addFeatureList.append(newfeat)
            self.localProgress.step()
        coverage.addFeatures(addFeatureList, True)
        coverage.endEditCommand()
        coverage.commitChanges()
        return coverage

    def createUnifiedLayer(self,
                           layerList,
                           attributeTupple=False,
                           attributeBlackList='',
                           onlySelected=False):
        """
        Creates a unified layer from a list of layers
        """
        #getting srid from something like 'EPSG:31983'
        srid = layerList[0].crs().authid().split(':')[
            -1]  #quem disse que tudo tem que ter mesmo srid? TODO: mudar isso
        # creating the layer
        geomtype = layerList[0].dataProvider().geometryType()
        for lyr in layerList:
            if lyr.dataProvider().geometryType() != geomtype:
                raise Exception(
                    self.tr('Error! Different geometry primitives!'))

        coverage = self.iface.addVectorLayer(
            "{0}?crs=epsg:{1}".format(self.getGeometryTypeText(geomtype),
                                      srid), "coverage", "memory")
        provider = coverage.dataProvider()
        coverage.startEditing()
        coverage.beginEditCommand('Creating coverage layer')  #speedup

        #defining fields
        if not attributeTupple:
            fields = [
                QgsField('featid', QVariant.Int),
                QgsField('classname', QVariant.String)
            ]
        else:
            fields = [
                QgsField('featid', QVariant.Int),
                QgsField('classname', QVariant.String),
                QgsField('tupple', QVariant.String),
                QgsField('blacklist', QVariant.String)
            ]
        provider.addAttributes(fields)
        coverage.updateFields()

        totalCount = 0
        for layer in layerList:
            if onlySelected:
                totalCount += layer.selectedFeatureCount()
            else:
                totalCount += layer.pendingFeatureCount()
        self.localProgress = ProgressWidget(
            1,
            totalCount - 1,
            self.tr('Building unified layers with  ') +
            ', '.join([i.name() for i in layerList]) + '.',
            parent=self.iface.mapCanvas())
        featlist = []
        if attributeBlackList != '':
            bList = attributeBlackList.replace(' ', '').split(',')
        else:
            bList = []
        for layer in layerList:
            # recording class name
            classname = layer.name()
            uri = QgsDataSourceURI(layer.dataProvider().dataSourceUri())
            keyColumn = uri.keyColumn()
            if onlySelected:
                featureList = layer.selectedFeatures()
            else:
                featureList = layer.getFeatures()
            for feature in featureList:
                newfeat = QgsFeature(coverage.pendingFields())
                newfeat.setGeometry(feature.geometry())
                newfeat['featid'] = feature.id()
                newfeat['classname'] = classname
                if attributeTupple:
                    attributeList = []
                    attributes = [
                        field.name() for field in feature.fields()
                        if (field.type() != 6 and field.name() != keyColumn)
                    ]
                    attributes.sort()
                    for attribute in attributes:
                        if attribute not in bList:
                            attributeList.append(
                                u'{0}'.format(feature[attribute]
                                              ))  #done due to encode problems
                    tup = ','.join(attributeList)
                    newfeat['tupple'] = tup
                featlist.append(newfeat)
                self.localProgress.step()

        #inserting new features into layer
        coverage.addFeatures(featlist, False)
        coverage.endEditCommand()
        coverage.commitChanges()
        return coverage

    def splitUnifiedLayer(self, outputLayer, layerList):
        """
        Updates all original layers making requests with the class name
        """
        for layer in layerList:
            classname = layer.name()
            tupplelist = [(feature['featid'], feature)
                          for feature in outputLayer.getFeatures()
                          if feature['classname'] == classname]
            self.updateOriginalLayerV2(layer,
                                       None,
                                       featureTupleList=tupplelist)

    def getGeometryColumnFromLayer(self, layer):
        uri = QgsDataSourceURI(layer.dataProvider().dataSourceUri())
        geomColumn = uri.geometryColumn()
        return geomColumn

    def startTimeCount(self):
        self.startTime = datetime.now()

    def endTimeCount(self, cummulative=True):
        self.endTime = datetime.now()
        elapsedTime = (self.endTime - self.startTime)
        if cummulative:
            if self.totalTime == 0:
                self.totalTime = elapsedTime
            else:
                self.totalTime += elapsedTime
        return elapsedTime

    def logLayerTime(self, lyr):
        time = self.endTimeCount()
        if self.startTime != 0 and self.endTime != 0:
            QgsMessageLog.logMessage(
                self.tr(
                    'Elapsed time for process {0} on layer {1}: {2}').format(
                        self.processAlias, lyr, str(time)), "DSG Tools Plugin",
                QgsMessageLog.CRITICAL)

    def logTotalTime(self):
        if self.startTime != 0 and self.endTime != 0 and self.totalTime != 0:
            QgsMessageLog.logMessage(
                self.tr('Elapsed time for process {0}: {1}').format(
                    self.processAlias, str(self.totalTime)),
                "DSG Tools Plugin", QgsMessageLog.CRITICAL)

    def jsonifyParameters(self, params):
        """
        Sets a dict type feature to a json structure in order to make it visually better
        both to expose on log and to save it on validation history table.
        parameter params: a dict type variable
        returns: a json structured text
        """
        return json.dumps(params, sort_keys=True, indent=4)

    def logProcess(self):
        """
        Returns information to user:
        -userName (get information from abstractDb.db.userName())
        -parameters (get parameters from parameter dict) ***
        -layersRun (the layers that were used)
        -flagNumber (number of flags)
        -elapsedTime
        """
        # logging username
        logMsg = ""
        if self.dbUserName:
            logMsg += self.tr("\nDatabase username: {0}").format(
                self.dbUserName)
        else:
            logMsg += self.tr("\nUnable to get database username.")
        # logging process parameters
        if self.parameters:
            parametersString = self.tr(
                "\nParameters used on this execution of process {}\n").format(
                    self.processAlias)
            parametersString += self.jsonifyParameters(self.parameters)
            logMsg += parametersString
        else:
            logMsg += self.tr(
                "\nUnable to get database parameters for process {}.").format(
                    self.processAlias)
        # logging #Flag
        logMsg += self.tr("\nNumber of flags raised by the process: {}").format(\
                        str(self.abstractDb.getNumberOfFlagsByProcess(self.processName)))
        # logging total time elapsed
        self.endTimeCount()
        if self.totalTime:
            logMsg += self.tr(
                "\nTotal elapsed time for process {0}: {1}\n").format(
                    self.processAlias, self.totalTime)
        else:
            logMsg += self.tr("\nUnable to get total elapsed time.")
        self.logMsg = logMsg
        QgsMessageLog.logMessage(logMsg, "DSG Tools Plugin",
                                 QgsMessageLog.CRITICAL)

    def raiseVectorFlags(self, flagLyr, featFlagList):
        flagLyr.startEditing()
        flagLyr.beginEditCommand('Raising flags')  #speedup
        flagLyr.addFeatures(featFlagList, False)
        flagLyr.endEditCommand()
        flagLyr.commitChanges()
        return len(featFlagList)

    def buildFlagFeature(self, flagLyr, processName, tableSchema, tableName,
                         feat_id, geometry_column, geom, reason):
        newFeat = QgsFeature(flagLyr.pendingFields())
        newFeat['process_name'] = processName
        newFeat['layer'] = '{0}.{1}'.format(tableSchema, tableName)
        newFeat['feat_id'] = feat_id
        newFeat['reason'] = reason
        newFeat['geometry_column'] = geometry_column
        newFeat['user_fixed'] = False
        newFeat['dimension'] = geom.type()
        newFeat.setGeometry(geom)
        return newFeat

    def getFeatures(self,
                    lyr,
                    onlySelected=False,
                    returnIterator=True,
                    returnSize=True):
        if onlySelected:
            featureList = lyr.selectedFeatures()
            size = len(featureList)
        else:
            featureList = [i for i in lyr.getFeatures()
                           ] if not returnIterator else lyr.getFeatures()
            size = len(lyr.allFeatureIds())
        if returnIterator:
            return featureList, size
        else:
            return featureList
示例#31
0
 def execute(self):
     """
     Reimplementation of the execute method from the parent class
     """
     QgsMessageLog.logMessage(
         self.tr('Starting ') + self.getName() + self.tr(' Process.'),
         "DSG Tools Plugin", QgsMessageLog.CRITICAL)
     try:
         self.startTimeCount()
         self.setStatus(self.tr('Running'), 3)  #now I'm running!
         self.abstractDb.deleteProcessFlags(
             self.getName())  #erase previous flags
         classesWithElem = self.parameters['Classes']
         if len(classesWithElem) == 0:
             self.setStatus(
                 self.tr('No classes selected!. Nothing to be done.'),
                 1)  #Finished
             return 1
         gapsRecordList = []
         for key in classesWithElem:
             self.startTimeCount()
             # preparation
             classAndGeom = self.classesWithElemDict[key]
             localProgress = ProgressWidget(
                 0,
                 1,
                 self.tr('Preparing execution for ') +
                 classAndGeom['tableName'],
                 parent=self.iface.mapCanvas())
             localProgress.step()
             processTableName, lyr, keyColumn = self.prepareExecution(
                 classAndGeom)
             localProgress.step()
             # running the process
             localProgress = ProgressWidget(
                 0,
                 1,
                 self.tr('Running process for ') +
                 classAndGeom['tableName'],
                 parent=self.iface.mapCanvas())
             localProgress.step()
             gaps = self.abstractDb.getGapsRecords(processTableName,
                                                   classAndGeom['geom'],
                                                   keyColumn)
             localProgress.step()
             self.abstractDb.dropTempTable(processTableName)
             # storing flags
             if len(gaps) > 0:
                 if classAndGeom['tableSchema'] not in ('validation'):
                     for result in gaps:
                         id, reason, geom = result
                         gapsRecordList.append(
                             (classAndGeom['tableSchema'] + '.' +
                              classAndGeom['tableName'], id, reason, geom,
                              classAndGeom['geom']))
             self.logLayerTime(classAndGeom['tableSchema'] + '.' +
                               classAndGeom['tableName'])
         # storing flags
         if len(gapsRecordList) > 0:
             numberOfGappingGeom = self.addFlag(gapsRecordList)
             msg = str(numberOfGappingGeom) + self.tr(
                 ' gaps were found. Check flags.')
             self.setStatus(msg, 4)  #Finished with flags
         else:
             msg = self.tr('There are no gaps.')
             self.setStatus(msg, 1)  #Finished
         return 1
     except Exception as e:
         QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                  QgsMessageLog.CRITICAL)
         self.finishedWithError()
         return 0
示例#32
0
class ValidationProcess(QObject):
    def __init__(self, postgisDb, iface, instantiating=False):
        """
        Constructor
        """
        super(ValidationProcess, self).__init__()
        self.abstractDb = postgisDb
        if self.getStatus() == None:
            self.setStatus(self.tr('Instantianting process'), 0)
        self.classesToBeDisplayedAfterProcess = []
        self.parameters = None
        self.iface = iface
        self.layerLoader = LayerLoaderFactory().makeLoader(self.iface, self.abstractDb)
        self.processAlias = self.tr('Validation Process')
        self.instantiating = instantiating
        
    def setParameters(self, params):
        """
        Define the process parameteres
        """
        self.parameters = params

    def execute(self):
        """
        Abstract method. MUST be reimplemented.
        """
        pass
    
    def shouldBeRunAgain(self):
        """
        Defines if the method should run again later
        """
        return False
    
    def getName(self):
        """
        Gets the process name
        """
        return str(self.__class__).split('.')[-1].replace('\'>', '')
    
    def getProcessGroup(self):
        """
        Returns the process group
        """
        return 'Ungrouped'
    
    def getClassesToBeDisplayedAfterProcess(self):
        """
        Returns classes to be loaded to TOC after executing this process.
        """
        return self.classesToBeDisplayedAfterProcess
    
    def addClassesToBeDisplayedList(self,className):
        """
        Add a class into the class list that will be displayed after the process
        """
        if className not in self.classesToBeDisplayedAfterProcess:
            self.classesToBeDisplayedAfterProcess.append(className)
    
    def clearClassesToBeDisplayedAfterProcess(self):
        """
        Clears the class list to be displayed
        """
        self.classesToBeDisplayedAfterProcess = []
    
    def preProcess(self):
        """
        Returns the name of the pre process that must run before, must be reimplemented in each process
        """
        return None
    
    def postProcess(self):
        """
        Returns the name of the post process that must run after, must be reimplemented in each process
        """        
        return None
    
    def addFlag(self, flagTupleList):
        """
        Adds flags
        flagTUpleList: list of tuples to be added as flag
        """
        try:
            return self.abstractDb.insertFlags(flagTupleList, self.getName())
        except Exception as e:
            QMessageBox.critical(None, self.tr('Critical!'), self.tr('A problem occurred inserting flags! Check log for details.'))
            QgsMessageLog.logMessage(str(e.args[0]), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
            
    def removeFeatureFlags(self, layer, featureId):
        """
        Removes specific flags from process
        layer: Name of the layer that should be remove from the flags
        featureId: Feature id from layer name that must be removed
        """
        try:
            return self.abstractDb.removeFeatureFlags(layer, featureId, self.getName())
        except Exception as e:
            QMessageBox.critical(None, self.tr('Critical!'), self.tr('A problem occurred! Check log for details.'))
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
    
    def getStatus(self):
        """
        Gets the process status
        """
        try:
            return self.abstractDb.getValidationStatus(self.getName())
        except Exception as e:
            QMessageBox.critical(None, self.tr('Critical!'), self.tr('A problem occurred! Check log for details.'))
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
    
    def getStatusMessage(self):
        """
        Gets the status message text
        """
        try:
            return self.abstractDb.getValidationStatusText(self.getName())
        except Exception as e:
            QMessageBox.critical(None, self.tr('Critical!'), self.tr('A problem occurred! Check log for details.'))
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
    
    def setStatus(self, msg, status):
        """
        Sets the status message
        status: Status number
        msg: Status text message
        """
        try:
            self.abstractDb.setValidationProcessStatus(self.getName(), msg, status)
        except Exception as e:
            QMessageBox.critical(None, self.tr('Critical!'), self.tr('A problem occurred! Check log for details.'))
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
    
    def finishedWithError(self):
        """
        Sets the finished with error status (status number 2)
        Clears the classes to be displayed
        """
        self.setStatus(self.tr('Process finished with errors.'), 2) #Failed status
        #drop temps
        try:
            classesWithElem = self.parameters['Classes']
            for cl in classesWithElem:
                tempName = cl.split(':')[0]+'_temp'
                self.abstractDb.dropTempTable(tempName)
        except:
            pass
        self.clearClassesToBeDisplayedAfterProcess()
    
    def inputData(self):
        """
        Returns current active layers
        """
        return self.iface.mapCanvas().layers()

    def getTableNameFromLayer(self, lyr):
        """
        Gets the layer name as present in the rules
        """
        uri = lyr.dataProvider().dataSourceUri()
        dsUri = QgsDataSourceURI(uri)
        name = '.'.join([dsUri.schema(), dsUri.table()])
        return name

    def mapInputLayer(self, inputLyr, selectedFeatures = False):
        """
        Gets the layer features considering the edit buffer in the case
        the layer is already in edition mode
        """
        #return dict
        featureMap = dict()
        #getting only selected features
        if selectedFeatures:
            for feat in inputLyr.selectedFeatures():
                featureMap[feat.id()] = feat
        #getting all features
        else:
            for feat in inputLyr.getFeatures():
                featureMap[feat.id()] = feat
        return featureMap
    
    def updateOriginalLayer(self, pgInputLayer, qgisOutputVector, featureList=None, featureTupleList=None):
        """
        Updates the original layer using the grass output layer
        pgInputLyr: postgis input layer
        grassOutputLyr: grass output layer
        """
        provider = pgInputLayer.dataProvider()
        # getting keyColumn because we want to be generic
        uri = QgsDataSourceURI(pgInputLayer.dataProvider().dataSourceUri())
        keyColumn = uri.keyColumn()
        # starting edition mode
        pgInputLayer.startEditing()
        addList = []
        idsToRemove = []
        #making the changes and inserts
        for feature in pgInputLayer.getFeatures():
            id = feature.id()
            outFeats = []
            #getting the output features with the specific id
            if qgisOutputVector:
                for gf in qgisOutputVector.dataProvider().getFeatures(QgsFeatureRequest(QgsExpression("{0}={1}".format(keyColumn, id)))):
                    outFeats.append(gf)
            elif featureTupleList:
                for gfid, gf in featureTupleList:
                    if gfid == id and gf['classname'] == pgInputLayer.name():
                        outFeats.append(gf)
            else:
                for gf in [gf for gf in featureList if gf.id() == id]:
                    outFeats.append(gf)
            #starting to make changes
            for i in range(len(outFeats)):
                if i == 0:
                    #let's update this feature
                    newGeom = outFeats[i].geometry()
                    newGeom.convertToMultiType()
                    feature.setGeometry(newGeom)
                    pgInputLayer.updateFeature(feature)
                else:
                    #for the rest, let's add them
                    newFeat = QgsFeature(feature)
                    newGeom = outFeats[i].geometry()
                    newGeom.convertToMultiType()
                    newFeat.setGeometry(newGeom)
                    idx = newFeat.fieldNameIndex(keyColumn)
                    newFeat.setAttribute(idx, provider.defaultValue(idx))
                    addList.append(newFeat)
            #in the case we don't find features in the output we should mark them to be removed
            if len(outFeats) == 0:
                idsToRemove.append(id)
        #pushing the changes into the edit buffer
        pgInputLayer.addFeatures(addList, True)
        #removing features from the layer.
        pgInputLayer.deleteFeatures(idsToRemove)

    def getProcessingErrors(self, layer):
        """
        Gets processing errors
        layer: error layer (QgsVectorLayer) output made by grass
        """
        recordList = []
        for feature in layer.getFeatures():
            recordList.append((feature.id(), binascii.hexlify(feature.geometry().asWkb())))
        return recordList
    
    def loadLayerBeforeValidationProcess(self, cl):
        """
        Loads all layers to QGIS' TOC prior the validation process
        """
        #creating vector layer
        if self.abstractDb.getDatabaseVersion() == 'Non_EDGV':
            isEdgv = False
        else:
            isEdgv = True
        if isinstance(cl, dict):
            lyr = self.layerLoader.load([cl], uniqueLoad=True, isEdgv=isEdgv)[cl['lyrName']]
        else:
            schema, layer_name = self.abstractDb.getTableSchema(cl)
            lyr = self.layerLoader.load([layer_name], uniqueLoad=True, isEdgv=isEdgv)[layer_name]
        return lyr
    
    def prepareExecution(self, cl, geometryColumn='geom', selectedFeatures = False):
        """
        Prepare the process to be executed
        cl: table name
        """
        # loading layer prior to execution
        lyr = self.loadLayerBeforeValidationProcess(cl)
        # getting keyColumn because we want to be generic
        uri = QgsDataSourceURI(lyr.dataProvider().dataSourceUri())
        keyColumn = uri.keyColumn()
        #getting feature map including the edit buffer
        featureMap = self.mapInputLayer(lyr, selectedFeatures = selectedFeatures)
        #getting table name with schema
        if isinstance(cl, dict):
            tableSchema = cl['tableSchema']
            tableName = cl['tableName']
            geometryColumn = cl['geom']
            fullTableName = '''{0}.{1}'''.format(cl['tableSchema'], cl['tableName'])
        else:
            fullTableName = cl
            tableSchema, tableName = cl.split('.')

        #setting temp table name
        processTableName = fullTableName+'_temp'
        # specific EPSG search
        parameters = {'tableSchema':tableSchema, 'tableName':tableName, 'geometryColumn':geometryColumn}
        srid = self.abstractDb.findEPSG(parameters=parameters)
        #creating temp table
        self.abstractDb.createAndPopulateTempTableFromMap(fullTableName, featureMap, geometryColumn, keyColumn, srid)
        return processTableName, lyr, keyColumn
    
    def postProcessSteps(self, processTableName, lyr):
        """
        Execute the final steps after the actual process
        """
        #getting the output as a QgsVectorLayer
        outputLayer = QgsVectorLayer(self.abstractDb.getURI(processTableName, True).uri(), processTableName, "postgres")
        #updating the original layer (lyr)
        self.updateOriginalLayer(lyr, outputLayer)
        #dropping the temp table as we don't need it anymore
        self.abstractDb.dropTempTable(processTableName)
    
    def getGeometryTypeText(self, geomtype):
        if geomtype == QGis.WKBPoint:
            return 'Point'
        elif geomtype == QGis.WKBMultiPoint:
            return 'MultiPoint'
        elif geomtype == QGis.WKBLineString:
            return 'Linestring'
        elif geomtype == QGis.WKBMultiLineString:
            return 'MultiLinestring'
        elif geomtype == QGis.WKBPolygon:
            return 'Polygon'
        elif geomtype == QGis.WKBMultiPolygon:
            return 'MultiPolygon'
        else:
            raise Exception(self.tr('Operation not defined with provided geometry type!'))

    def createUnifiedLayer(self, layerList, attributeTupple = False, attributeBlackList = ''):
        """
        Creates a unified layer from a list of layers
        """
        #getting srid from something like 'EPSG:31983'
        srid = layerList[0].crs().authid().split(':')[-1]
        # creating the layer
        geomtype = layerList[0].dataProvider().geometryType()
        for lyr in layerList:
            if lyr.dataProvider().geometryType() != geomtype:
                raise Exception(self.tr('Error! Different geometry primitives!'))

        coverage = self.iface.addVectorLayer("{0}?crs=epsg:{1}".format(self.getGeometryTypeText(geomtype),srid), "coverage", "memory")
        provider = coverage.dataProvider()
        coverage.startEditing()

        #defining fields
        if not attributeTupple:
            fields = [QgsField('featid', QVariant.Int), QgsField('classname', QVariant.String)]
        else:
            fields = [QgsField('featid', QVariant.Int), QgsField('classname', QVariant.String), QgsField('tupple', QVariant.String), QgsField('blacklist', QVariant.String)]
        provider.addAttributes(fields)
        coverage.updateFields()

        totalCount = 0
        for layer in layerList:
            totalCount += layer.pendingFeatureCount()
        self.localProgress = ProgressWidget(1, totalCount - 1, self.tr('Building unified layers with  ') + ', '.join([i.name() for i in layerList])+'.', parent=self.iface.mapCanvas())
        featlist = []
        if attributeBlackList != '':
            bList = attributeBlackList.replace(' ','').split(',')
        else:
            bList = []
        for layer in layerList:
            # recording class name
            classname = layer.name()
            uri = QgsDataSourceURI(layer.dataProvider().dataSourceUri())
            keyColumn = uri.keyColumn()
            for feature in layer.getFeatures():
                newfeat = QgsFeature(coverage.pendingFields())
                newfeat.setGeometry(feature.geometry())
                newfeat['featid'] = feature.id()
                newfeat['classname'] = classname
                if attributeTupple:
                    attributeList = []
                    attributes = [field.name() for field in feature.fields() if (field.type() != 6 and field.name() != keyColumn)]
                    for attribute in attributes:
                        if attribute not in bList:
                            attributeList.append(u'{0}'.format(feature[attribute])) #done due to encode problems
                    tup = ','.join(attributeList)
                    newfeat['tupple'] = tup
                featlist.append(newfeat)
                self.localProgress.step()
        
        #inserting new features into layer
        coverage.addFeatures(featlist, True)
        coverage.commitChanges()
        return coverage

    def splitUnifiedLayer(self, outputLayer, layerList):
        """
        Updates all original layers making requests with the class name
        """
        for layer in layerList:
            classname = layer.name()
            tupplelist = [(feature['featid'], feature) for feature in outputLayer.getFeatures()]
            self.updateOriginalLayer(layer, None, featureTupleList=tupplelist)

    def getGeometryColumnFromLayer(self, layer):
        uri = QgsDataSourceURI(layer.dataProvider().dataSourceUri())
        geomColumn = uri.geometryColumn()
        return geomColumn
        
                    
                    
class SnapLayerOnLayerProcess(ValidationProcess):
    def __init__(self, postgisDb, iface, instantiating=False):
        """
        Constructor
        """
        super(SnapLayerOnLayerProcess, self).__init__(postgisDb, iface, instantiating)
        self.processAlias = self.tr('Snap Layer on Layer')
        
        if not self.instantiating:
            # getting tables with elements
            self.classesWithElemDict = self.abstractDb.getGeomColumnDictV2(primitiveFilter=['a', 'l'], withElements=True, excludeValidation = True)
            # adjusting process parameters
            interfaceDict = dict()
            for key in self.classesWithElemDict:
                cat, lyrName, geom, geomType, tableType = key.split(',')
                interfaceDict[key] = {self.tr('Category'):cat, self.tr('Layer Name'):lyrName, self.tr('Geometry\nColumn'):geom, self.tr('Geometry\nType'):geomType, self.tr('Layer\nType'):tableType}
            # adjusting process parameters
            self.parameters = {'Snap': 5.0, 'Reference and Layers': OrderedDict({'referenceDictList':{}, 'layersDictList':interfaceDict}), 'Only Selected':False}

    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(self.tr('Starting ')+self.getName()+self.tr(' Process.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        self.startTimeCount()
        try:
            self.setStatus(self.tr('Running'), 3) #now I'm running!
            refKey = self.parameters['Reference and Layers'][0]
            classesWithElemKeys = self.parameters['Reference and Layers'][1]
            if len(classesWithElemKeys) == 0:
                self.setStatus(self.tr('No classes selected!. Nothing to be done.'), 1) #Finished
                return 1

            if not refKey:
                self.setStatus(self.tr('One reference must be selected! Stopping.'), 1) #Finished
                return 1

            # preparing reference layer
            refcl = self.classesWithElemDict[refKey]
            reflyr = self.loadLayerBeforeValidationProcess(refcl)
            snapper = DsgGeometrySnapper(reflyr)
            snapper.featureSnapped.connect(self.updateProgress)
            tol = self.parameters['Snap']
            msg = ''
            for key in classesWithElemKeys:
                # preparation
                clDict = self.classesWithElemDict[key]
                localProgress = ProgressWidget(0, 1, self.tr('Preparing execution for ') + clDict['tableName'], parent=self.iface.mapCanvas())
                localProgress.step()
                lyr = self.loadLayerBeforeValidationProcess(clDict)
                localProgress.step()

                # snapping lyr to reference
                if self.parameters['Only Selected']:
                    featureList = lyr.selectedFeatures()
                else:
                    featureList = lyr.getFeatures()
                features = [feature for feature in featureList]
                self.localProgress = ProgressWidget(1, len(features) - 1, self.tr('Processing features on ') + clDict['tableName'], parent=self.iface.mapCanvas())

                snappedFeatures = snapper.snapFeatures(features, tol)
                self.updateOriginalLayerV2(lyr, None, featureList=snappedFeatures)
                self.logLayerTime(clDict['lyrName'])

                localMsg = self.tr('All features from ') +clDict['lyrName']+ self.tr(' snapped to reference ') +refcl['tableName']+ self.tr(' succesfully.\n')
                QgsMessageLog.logMessage(localMsg, "DSG Tools Plugin", QgsMessageLog.CRITICAL)
                msg += localMsg
            self.setStatus(msg, 1) #Finished
            return 1
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
            self.finishedWithError()
            return 0

    def updateProgress(self):
        self.localProgress.step()
示例#34
0
    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(
            self.tr('Starting ') + self.getName() + self.tr(' Process.'),
            "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        try:
            self.setStatus(self.tr('Running'), 3)  #now I'm running!
            self.abstractDb.deleteProcessFlags(
                self.getName())  #erase previous flags
            #TODO: check if frame is created

            #getting earth coverage configuration
            edgvVersion = self.abstractDb.getDatabaseVersion()
            propertyDict = self.abstractDb.getAllSettingsFromAdminDb(
                'EarthCoverage')
            propertyName = propertyDict[edgvVersion][0]
            settingDict = json.loads(
                self.abstractDb.getSettingFromAdminDb('EarthCoverage',
                                                      propertyName,
                                                      edgvVersion))
            earthCoverageDict = settingDict['earthCoverageDict']
            self.frameLayer = settingDict['frameLayer']

            coverageClassList = earthCoverageDict.keys()
            if coverageClassList.__len__() == 0:
                self.setStatus(self.tr('Empty earth coverage!'), 1)  #Finished
                QgsMessageLog.logMessage(self.tr('Empty earth coverage!'),
                                         "DSG Tools Plugin",
                                         QgsMessageLog.CRITICAL)
                return

            self.cleanCentroidsAreas(coverageClassList)
            #making temp layers
            epsg = self.abstractDb.findEPSG()
            areaLyr, centroidLyr = self.createAuxStruct(epsg)

            #building centroid index
            self.populateCentroidLyr(coverageClassList, centroidLyr)
            centroidIdx = self.makeIndex(centroidLyr)

            relateDict = dict()
            for cl in coverageClassList:
                localProgress = ProgressWidget(
                    0,
                    1,
                    self.tr('Processing earth coverage on ') + cl,
                    parent=self.iface.mapCanvas())
                localProgress.step()
                #must gather all lines (including frame) to close areas
                lineLyr = self.defineQueryLayer(earthCoverageDict[cl])
                #close areas from lines
                self.runPolygonize(cl, areaLyr, lineLyr)
                self.relateAreasWithCentroids(cl, areaLyr, centroidLyr,
                                              relateDict, centroidIdx)
                # reclassifying areas
                self.prepareReclassification(cl, areaLyr, centroidLyr,
                                             relateDict)
                self.reclassifyAreasWithCentroids(coverageClassList, areaLyr,
                                                  centroidLyr, relateDict)
                localProgress.step()
            self.raiseFlags(areaLyr)
            return 1
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                     QgsMessageLog.CRITICAL)
            self.finishedWithError()
            return 0
示例#35
0
    def execute(self):
        """
        Reimplementation of the execute method from the parent class
        """
        QgsMessageLog.logMessage(
            self.tr('Starting ') + self.getName() + self.tr(' Process.'),
            "DSG Tools Plugin", QgsMessageLog.CRITICAL)
        try:
            self.setStatus(self.tr('Running'), 3)  #now I'm running!
            self.abstractDb.deleteProcessFlags(
                self.getName())  #erase previous flags
            classesWithElem = self.parameters['Classes']
            if len(classesWithElem) == 0:
                self.setStatus(
                    self.tr('No classes selected!. Nothing to be done.'),
                    1)  #Finished
                QgsMessageLog.logMessage(
                    self.tr('No classes selected! Nothing to be done.'),
                    "DSG Tools Plugin", QgsMessageLog.CRITICAL)
                return 1
            tol = self.parameters['Angle']
            error = False
            for key in classesWithElem:
                # preparation
                classAndGeom = self.classesWithElemDict[key]
                localProgress = ProgressWidget(
                    0,
                    1,
                    self.tr('Preparing execution for ') +
                    classAndGeom['tableName'],
                    parent=self.iface.mapCanvas())
                localProgress.step()
                processTableName, lyr, keyColumn = self.prepareExecution(
                    classAndGeom,
                    selectedFeatures=self.parameters['Only Selected'])
                tableSchema, tableName = self.abstractDb.getTableSchema(
                    processTableName)
                localProgress.step()

                # running the process
                localProgress = ProgressWidget(0,
                                               1,
                                               self.tr('Running process on ') +
                                               classAndGeom['tableName'],
                                               parent=self.iface.mapCanvas())
                localProgress.step()
                result = self.abstractDb.getOutOfBoundsAnglesRecords(
                    tableSchema, tableName, tol, classAndGeom['geom'],
                    classAndGeom['geomType'], keyColumn)
                localProgress.step()

                # dropping temp table
                self.abstractDb.dropTempTable(processTableName)

                # storing flags
                if len(result) > 0:
                    error = True
                    recordList = []
                    for tupple in result:
                        recordList.append(
                            (classAndGeom['tableSchema'] + '.' +
                             classAndGeom['tableName'], tupple[0],
                             self.tr('Angle out of bound.'), tupple[1],
                             classAndGeom['geom']))
                        self.addClassesToBeDisplayedList(tupple[0])
                    numberOfProblems = self.addFlag(recordList)
                    QgsMessageLog.logMessage(
                        str(numberOfProblems) + self.tr(' features from') +
                        classAndGeom['tableName'] +
                        self.tr(' have out of bounds angle(s). Check flags.'),
                        "DSG Tools Plugin", QgsMessageLog.CRITICAL)
                else:
                    QgsMessageLog.logMessage(
                        self.tr('There are no out of bounds angles on ') +
                        classAndGeom['tableName'] + '.', "DSG Tools Plugin",
                        QgsMessageLog.CRITICAL)
            if error:
                self.setStatus(
                    self.
                    tr('There are features with angles out of bounds. Check log.'
                       ), 4)  #Finished with errors
            else:
                self.setStatus(
                    self.tr(
                        'There are no features with angles out of bounds.'),
                    1)  #Finished
            return 1
        except Exception as e:
            QgsMessageLog.logMessage(':'.join(e.args), "DSG Tools Plugin",
                                     QgsMessageLog.CRITICAL)
            self.finishedWithError()
            return 0
示例#36
0
    def load(self,
             inputList,
             useQml=False,
             uniqueLoad=False,
             useInheritance=False,
             stylePath=None,
             onlyWithElements=False,
             geomFilterList=[],
             isEdgv=True,
             parent=None):
        """
        1. Get loaded layers
        2. Filter layers;
        3. Load domains;
        4. Get Aux Dicts;
        5. Build Groups;
        6. Load Layers;
        """
        layerList, isDictList = self.preLoadStep(inputList)
        #1. Get Loaded Layers
        loadedLayers = self.iface.legendInterface().layers()
        loadedGroups = self.iface.legendInterface().groups()
        #2. Filter Layers:
        filteredLayerList = self.filterLayerList(layerList, useInheritance,
                                                 onlyWithElements,
                                                 geomFilterList)
        if isDictList:
            filteredDictList = [
                i for i in inputList if i['tableName'] in filteredLayerList
            ]
        else:
            filteredDictList = filteredLayerList
        edgvVersion = self.abstractDb.getDatabaseVersion()
        dbGroup = self.getDatabaseGroup(loadedGroups)
        #3. Load Domains
        #do this only if EDGV Version = FTer
        if edgvVersion in ('FTer_2a_Ed', '3.0'):
            domainGroup = self.createGroup(loadedGroups, self.tr("Domains"),
                                           dbGroup)
            domLayerDict = self.loadDomains(filteredLayerList, loadedLayers,
                                            domainGroup)
        else:
            domLayerDict = dict()
        #4. Get Aux dicts
        domainDict = self.abstractDb.getDbDomainDict(self.geomDict)
        constraintDict = self.abstractDb.getCheckConstraintDict()
        multiColumnsDict = self.abstractDb.getMultiColumnsDict()
        notNullDict = self.abstractDb.getNotNullDictV2()
        lyrDict = self.getLyrDict(filteredDictList, isEdgv=isEdgv)

        #5. Build Groups
        groupDict = self.prepareGroups(loadedGroups, dbGroup, lyrDict)
        #6. load layers
        loadedDict = dict()
        if parent:
            primNumber = 0
            for prim in lyrDict.keys():
                for cat in lyrDict[prim].keys():
                    for lyr in lyrDict[prim][cat]:
                        primNumber += 1
            localProgress = ProgressWidget(1,
                                           primNumber - 1,
                                           self.tr('Loading layers... '),
                                           parent=parent)
        for prim in lyrDict.keys():
            for cat in lyrDict[prim].keys():
                for lyr in lyrDict[prim][cat]:
                    try:
                        vlayer = self.loadLayer(lyr, groupDict[prim][cat],
                                                loadedLayers, useInheritance,
                                                useQml, uniqueLoad, stylePath,
                                                domainDict, multiColumnsDict,
                                                domLayerDict, edgvVersion)
                        if vlayer:
                            loadedLayers.append(vlayer)
                            if isinstance(lyr, dict):
                                key = lyr['lyrName']
                            else:
                                key = lyr
                            loadedDict[key] = vlayer
                    except Exception as e:
                        if isinstance(lyr, dict):
                            key = lyr['lyrName']
                        else:
                            key = lyr
                        self.logErrorDict[key] = self.tr(
                            'Error for layer ') + key + ': ' + ':'.join(e.args)
                        self.logError()
                    if parent:
                        localProgress.step()
        return loadedDict