Пример #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 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
Пример #3
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()
Пример #4
0
    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
Пример #5
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 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
Пример #7
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()
Пример #8
0
    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
Пример #9
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
    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
Пример #11
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!
            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
Пример #12
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)
Пример #13
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
Пример #14
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
Пример #15
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
 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)
Пример #17
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
Пример #18
0
 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 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
Пример #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)
        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
    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
Пример #22
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)
Пример #23
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()
Пример #24
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
Пример #25
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!

            # 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
                QgsMessageLog.logMessage(self.tr('There are no small areas.'), "DSG Tools Plugin", QgsMessageLog.CRITICAL)
                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.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!
             classesWithElem = self.parameters['Classes']
             snap = self.parameters['Snap']
             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:
                 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()
                 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            
Пример #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!
            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
Пример #28
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
Пример #29
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())

            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
                    QgsMessageLog.logMessage(msg, "DSG Tools Plugin",
                                             QgsMessageLog.CRITICAL)
                else:
                    msg = self.tr('All features are valid.')
                    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
Пример #30
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
Пример #31
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
Пример #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
        
                    
                    
Пример #33
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
            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 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()
            msg = self.tr('Process executed successfully!')
            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
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()
Пример #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
            classesWithGeom = []
            recordFlagList = []
            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,
                    selectedFeatures=self.parameters['Only Selected'])
                localProgress.step()

                # running the process
                localProgress = ProgressWidget(0,
                                               1,
                                               self.tr('Running process ') +
                                               classAndGeom['tableName'],
                                               parent=self.iface.mapCanvas())
                localProgress.step()
                result = self.abstractDb.getNotSimpleRecords(
                    processTableName, classAndGeom['geom'], keyColumn)
                localProgress.step()
                # dropping temp table
                self.abstractDb.dropTempTable(processTableName)
                #storing flags
                if len(result) > 0:
                    if classAndGeom['tableSchema'] not in ('validation'):
                        for r in result:
                            featId, geom = r
                            recordFlagList.append(
                                (classAndGeom['tableSchema'] + '.' +
                                 classAndGeom['tableName'], featId,
                                 self.tr('Not simple geometry.'), geom,
                                 classAndGeom['geom']))
                self.logLayerTime(classAndGeom['tableSchema'] + '.' +
                                  classAndGeom['tableName'])
            # storing flags
            if len(recordFlagList) > 0:
                numberOfProblems = self.addFlag(recordFlagList)
                msg = str(numberOfProblems) + self.tr(
                    ' features are not simple. Check flags.')
                self.setStatus(msg, 4)  #Finished with flags
            else:
                msg = self.tr('All features are simple.')
                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
Пример #36
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