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", "")
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", "")
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", "")
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)
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