Esempio n. 1
0
class MemoryLayers():
    def __init__(self, iface):
        self.iface = iface
        self.settings = MySettings()

    def setLayerVisible(self, layer):
        root = QgsProject.instance().layerTreeRoot()
        node = root.findLayer(layer.id())
        node.setVisible(Qt.Checked)

    def lineLayer(self):
        layerID = self.settings.value("memoryLineLayer")
        layer = QgsMapLayerRegistry.instance().mapLayer(layerID)
        if layer is None:
            epsg = self.iface.mapCanvas().mapRenderer().destinationCrs(
            ).authid()
            layer = QgsVectorLayer(
                "LineString?crs=%s&field=id:string&field=type:string&field=x:double&field=y:double&field=observation:double&field=precision:double&index=yes"
                % epsg, "IntersectIt Lines", "memory")
            QgsMapLayerRegistry.instance().addMapLayer(layer)
            layer.layerDeleted.connect(self.__lineLayerDeleted)
            layer.featureDeleted.connect(self.__lineLayerFeatureDeleted)
            self.settings.setValue("memoryLineLayer", layer.id())
        else:
            self.setLayerVisible(layer)
        return layer

    def __lineLayerDeleted(self):
        self.settings.setValue("memoryLineLayer", "")

    def __lineLayerFeatureDeleted(self, fid):
        # todo: delete corresponding feature in other layer
        print "hay"

    def pointLayer(self):
        layerID = self.settings.value("memoryPointLayer")
        layer = QgsMapLayerRegistry.instance().mapLayer(layerID)
        if layer is None:
            epsg = self.iface.mapCanvas().mapRenderer().destinationCrs(
            ).authid()
            layer = QgsVectorLayer(
                "Point?crs=%s&field=id:string&index=yes" % epsg,
                "IntersectIt Points", "memory")
            QgsMapLayerRegistry.instance().addMapLayer(layer)
            layer.layerDeleted.connect(self.__pointLayerDeleted)
            self.settings.setValue("memoryPointLayer", layer.id())
        else:
            self.setLayerVisible(layer)
        return layer

    def __pointLayerDeleted(self):
        self.settings.setValue("memoryPointLayer", "")
Esempio n. 2
0
class MemoryLayers():
    def __init__(self, iface):
        self.iface = iface
        self.settings = MySettings()

    def set_layer_visible(self, layer):
        root = QgsProject.instance().layerTreeRoot()
        node = root.findLayer(layer.id())
        node.setVisible(Qt.Checked)
        
    def remove_layers(self):
        try:
            QgsMapLayerRegistry.instance().removeMapLayer(self.settings.value("memoryLineLayer"))
            QgsMapLayerRegistry.instance().removeMapLayer(self.settings.value("memoryPointLayer"))
        except AttributeError:
            return
        
    def clean_layers(self):
        for layer_name in ('memoryLineLayer', 'memoryPointLayer'):
            layer_id = self.settings.value(layer_name)
            layer = QgsMapLayerRegistry.instance().mapLayer(layer_id)
            layer.selectAll()
            fids = layer.selectedFeaturesIds()
            layer.dataProvider().deleteFeatures(fids)
            layer.featuresDeleted.emit(fids)
        self.iface.mapCanvas().refresh()

    def line_layer(self):
        layer_id = self.settings.value("memoryLineLayer")
        layer = QgsMapLayerRegistry.instance().mapLayer(layer_id)
        if layer is None:
            epsg = self.iface.mapCanvas().mapRenderer().destinationCrs().authid()
            layer = QgsVectorLayer("LineString?crs=%s&field=id:string&field=type:string&field=x:double&field=y:double&field=observation:double&field=precision:double&index=yes" % epsg, "IntersectIt Lines", "memory")
            QgsMapLayerRegistry.instance().addMapLayer(layer)
            layer.layerDeleted.connect(self.__line_layer_deleted)
            layer.featureDeleted.connect(self.__line_layer_feature_deleted)
            self.settings.setValue("memoryLineLayer", layer.id())
        else:
            self.set_layer_visible(layer)
        return layer

    def __line_layer_deleted(self):
        self.settings.setValue("memoryLineLayer", "")

    def __line_layer_feature_deleted(self, fid):
        # todo: delete corresponding feature in other layer
        print "hay"

    def point_layer(self):
        layer_id = self.settings.value("memoryPointLayer")
        layer = QgsMapLayerRegistry.instance().mapLayer(layer_id)
        if layer is None:
            epsg = self.iface.mapCanvas().mapRenderer().destinationCrs().authid()
            layer = QgsVectorLayer("Point?crs=%s&field=id:string&index=yes" % epsg, "IntersectIt Points", "memory")
            QgsMapLayerRegistry.instance().addMapLayer(layer)
            layer.layerDeleted.connect(self.__pointLayerDeleted)
            self.settings.setValue("memoryPointLayer", layer.id())
        else:
            self.set_layer_visible(layer)
        return layer

    def __pointLayerDeleted(self):
        self.settings.setValue("memoryPointLayer", "")
Esempio n. 3
0
class MemoryLayers():
    def __init__(self, iface):
        self.iface = iface
        self.settings = MySettings()

    def set_layer_visible(self, layer):
        root = QgsProject.instance().layerTreeRoot()
        node = root.findLayer(layer.id())
        node.setVisible(Qt.Checked)
        
    def remove_layers(self):
        try:
            QgsMapLayerRegistry.instance().removeMapLayer(self.settings.value("memoryLineLayer"))
            QgsMapLayerRegistry.instance().removeMapLayer(self.settings.value("memoryPointLayer"))
        except AttributeError:
            return
        
    def clean_layers(self):
        for layer_name in ('memoryLineLayer', 'memoryPointLayer'):
            layer_id = self.settings.value(layer_name)
            layer = QgsMapLayerRegistry.instance().mapLayer(layer_id)
            layer.selectAll()
            fids = layer.selectedFeaturesIds()
            layer.dataProvider().deleteFeatures(fids)
            layer.featuresDeleted.emit(fids)
        self.iface.mapCanvas.refresh()

    def line_layer(self):
        layer_id = self.settings.value("memoryLineLayer")
        layer = QgsMapLayerRegistry.instance().mapLayer(layer_id)
        if layer is None:
            epsg = self.iface.mapCanvas().mapRenderer().destinationCrs().authid()
            layer = QgsVectorLayer("LineString?crs=%s&field=id:string&field=type:string&field=x:double&field=y:double&field=observation:double&field=precision:double&index=yes" % epsg, "IntersectIt Lines", "memory")
            QgsMapLayerRegistry.instance().addMapLayer(layer)
            layer.layerDeleted.connect(self.__line_layer_deleted)
            layer.featureDeleted.connect(self.__line_layer_feature_deleted)
            self.settings.setValue("memoryLineLayer", layer.id())
        else:
            self.set_layer_visible(layer)
        return layer

    def __line_layer_deleted(self):
        self.settings.setValue("memoryLineLayer", "")

    def __line_layer_feature_deleted(self, fid):
        # todo: delete corresponding feature in other layer
        print "hay"

    def point_layer(self):
        layer_id = self.settings.value("memoryPointLayer")
        layer = QgsMapLayerRegistry.instance().mapLayer(layer_id)
        if layer is None:
            epsg = self.iface.mapCanvas().mapRenderer().destinationCrs().authid()
            layer = QgsVectorLayer("Point?crs=%s&field=id:string&index=yes" % epsg, "IntersectIt Points", "memory")
            QgsMapLayerRegistry.instance().addMapLayer(layer)
            layer.layerDeleted.connect(self.__pointLayerDeleted)
            self.settings.setValue("memoryPointLayer", layer.id())
        else:
            self.set_layer_visible(layer)
        return layer

    def __pointLayerDeleted(self):
        self.settings.setValue("memoryPointLayer", "")
Esempio n. 4
0
 def __init__(self, iface, point, observation):
     settings = MySettings()
     self.length = settings.value("obsOrientationLength")
     precision = settings.value("obsDefaultPrecisionOrientation")
     Observation.__init__(self, iface, "orientation", point, observation, precision)
Esempio n. 5
0
 def __init__(self, iface, point, observation):
     settings = MySettings()
     self.length = settings.value("obsOrientationLength")
     precision = settings.value("obsDefaultPrecisionOrientation")
     Observation.__init__(self, iface, "orientation", point, observation,
                          precision)
class LogLayer(QObject):
    setProgressMax = pyqtSignal(int)
    setProgressMin = pyqtSignal(int)
    setProgressValue = pyqtSignal(int)

    def __init__(self):
        QObject.__init__(self)
        self.settings = MySettings()
        self.continueSearch = True
        self.layer = None

    def isValid(self):
        self.layer = QgsMapLayerRegistry.instance().mapLayer(
            self.settings.value("logLayer"))
        return self.checkLayer(self.layer)

    def checkLayer(self, layer):
        if layer is None:
            return False
            # TODO check validity
        return True

    def interrupt(self):
        self.continueSearch = False

    def performSearch(self, featureLayer, featureId, pkeyName, searchInserts,
                      searchUpdates, searchDeletes, searchOnlyGeometry,
                      searchAfterDate, searchBeforeDate):
        results = dict()
        if not self.isValid():
            return

        dataUri = QgsDataSourceURI(featureLayer.dataProvider().dataSourceUri())
        if featureLayer.hasGeometryType():
            geomColumn = dataUri.geometryColumn()
        else:
            geomColumn = None

        # initiate the layer feature (feature at given ID, or an empty feature otherwise)
        layerFeature = QgsFeature()
        if featureId != 0:
            featReq = QgsFeatureRequest().setFilterFid(featureId)
            if not featureLayer.hasGeometryType():
                featReq.setFlags(QgsFeatureRequest.NoGeometry)
            if featureLayer.getFeatures(featReq).nextFeature(
                    layerFeature) is False:
                fields = featureLayer.dataProvider().fields()
                layerFeature.setFields(fields)
        else:
            fields = featureLayer.dataProvider().fields()
            layerFeature.setFields(fields)

        # set query subset for layer to drastically improve search speed
        # todo: if a subset already exists, should give a warning
        if self.settings.value("redefineSubset"):
            subset = "schema_name = '%s' and table_name = '%s'" % (
                dataUri.schema(), dataUri.table())
            if not searchInserts or not searchUpdates or not searchDeletes:
                subset += "and ("
                if searchInserts:
                    subset += " action = 'I' or"
                if searchUpdates:
                    subset += " action = 'U' or"
                if searchDeletes:
                    subset += " action = 'D' or"
                subset = subset[:-3] + ")"
            if not searchAfterDate.isNull():
                subset += " and action_tstamp_clk >= '%s'" % searchAfterDate.toString(
                    "yyyy-MM-dd hh:mm:ss")
            if not searchBeforeDate.isNull():
                subset += " and action_tstamp_clk <= '%s'" % searchBeforeDate.toString(
                    "yyyy-MM-dd hh:mm:ss")

            if not self.layer.setSubsetString(subset):
                raise NameError("Subset could not be set.")

        self.continueSearch = True
        logFeature = QgsFeature()
        featReq = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry)
        iterator = self.layer.getFeatures(featReq)
        self.setProgressMin.emit(0)
        self.setProgressMax.emit(self.layer.featureCount())
        k = 0
        while iterator.nextFeature(logFeature):
            self.setProgressValue.emit(k)
            QCoreApplication.processEvents()
            if not self.continueSearch:
                break
            # this condition is redundant if layer subset string is used
            dateAction = QDateTime().fromString(
                logFeature["action_tstamp_clk"], Qt.ISODate)
            if logFeature["schema_name"] == dataUri.schema() and \
               logFeature["table_name"] == dataUri.table() and \
               (searchInserts and logFeature["action"] == 'I' or
                searchUpdates and logFeature["action"] == 'U' or
                searchDeletes and logFeature["action"] == 'D') and \
               (searchAfterDate.isNull() or dateAction >= searchAfterDate) and \
               (searchBeforeDate.isNull() or dateAction <= searchBeforeDate):
                row = LogResultRow(logFeature, featureLayer, pkeyName,
                                   geomColumn)
                if featureId != 0 and row.layerFeatureId != featureId:
                    continue
                if searchOnlyGeometry and not row.changedGeometry():
                    continue

                results[row.dateMs] = row
            k += 1
        if self.settings.value("redefineSubset"):
            self.layer.setSubsetString("")
        return results
class LogLayer(QObject):
    setProgressMax = pyqtSignal(int)
    setProgressMin = pyqtSignal(int)
    setProgressValue = pyqtSignal(int)

    def __init__(self):
        QObject.__init__(self)
        self.settings = MySettings()
        self.continueSearch = True
        self.layer = None

    def isValid(self):
        self.layer = QgsMapLayerRegistry.instance().mapLayer(self.settings.value("logLayer"))
        return self.checkLayer(self.layer)

    def checkLayer(self, layer):
        if layer is None:
            return False
            # TODO check validity
        return True

    def interrupt(self):
        self.continueSearch = False

    def performSearch(self, featureLayer, featureId, pkeyName, searchInserts, searchUpdates, searchDeletes,
                      searchOnlyGeometry, searchAfterDate, searchBeforeDate):
        results = dict()
        if not self.isValid():
            return

        dataUri = QgsDataSourceURI(featureLayer.dataProvider().dataSourceUri())
        if featureLayer.hasGeometryType():
            geomColumn = dataUri.geometryColumn()
        else:
            geomColumn = None

        # initiate the layer feature (feature at given ID, or an empty feature otherwise)
        layerFeature = QgsFeature()
        if featureId != 0:
            featReq = QgsFeatureRequest().setFilterFid(featureId)
            if not featureLayer.hasGeometryType():
                featReq.setFlags(QgsFeatureRequest.NoGeometry)
            if featureLayer.getFeatures(featReq).nextFeature(layerFeature) is False:
                fields = featureLayer.dataProvider().fields()
                layerFeature.setFields(fields)
        else:
            fields = featureLayer.dataProvider().fields()
            layerFeature.setFields(fields)

        # set query subset for layer to drastically improve search speed
        # todo: if a subset already exists, should give a warning
        if self.settings.value("redefineSubset"):
            subset = "schema_name = '%s' and table_name = '%s'" % (dataUri.schema(), dataUri.table())
            if not searchInserts or not searchUpdates or not searchDeletes:
                subset += "and ("
                if searchInserts:
                    subset += " action = 'I' or"
                if searchUpdates:
                    subset += " action = 'U' or"
                if searchDeletes:
                    subset += " action = 'D' or"
                subset = subset[:-3] + ")"
            if not searchAfterDate.isNull():
                subset += " and action_tstamp_clk >= '%s'" % searchAfterDate.toString("yyyy-MM-dd hh:mm:ss")
            if not searchBeforeDate.isNull():
                subset += " and action_tstamp_clk <= '%s'" % searchBeforeDate.toString("yyyy-MM-dd hh:mm:ss")

            if not self.layer.setSubsetString(subset):
                raise NameError("Subset could not be set.")

        self.continueSearch = True
        logFeature = QgsFeature()
        featReq = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry)
        iterator = self.layer.getFeatures(featReq)
        self.setProgressMin.emit(0)
        self.setProgressMax.emit(self.layer.featureCount())
        k = 0
        while iterator.nextFeature(logFeature):
            self.setProgressValue.emit(k)
            QCoreApplication.processEvents()
            if not self.continueSearch:
                break
            # this condition is redundant if layer subset string is used
            dateAction = QDateTime().fromString(logFeature["action_tstamp_clk"], Qt.ISODate)
            if logFeature["schema_name"] == dataUri.schema() and \
               logFeature["table_name"] == dataUri.table() and \
               (searchInserts and logFeature["action"] == 'I' or
                searchUpdates and logFeature["action"] == 'U' or
                searchDeletes and logFeature["action"] == 'D') and \
               (searchAfterDate.isNull() or dateAction >= searchAfterDate) and \
               (searchBeforeDate.isNull() or dateAction <= searchBeforeDate):
                row = LogResultRow(logFeature, featureLayer, pkeyName, geomColumn)
                if featureId != 0 and row.layerFeatureId != featureId:
                    continue
                if searchOnlyGeometry and not row.changedGeometry():
                    continue

                results[row.dateMs] = row
            k += 1
        if self.settings.value("redefineSubset"):
            self.layer.setSubsetString("")
        return results