From 02fc22f7dfd5f778a6e4dc8e661a4408d4cbcc14 Mon Sep 17 00:00:00 2001 From: Aitor Gil Martin Date: Fri, 7 Sep 2018 14:12:03 +0200 Subject: [PATCH] Added equaling_geom_count function --- reffunctions.py | 63 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/reffunctions.py b/reffunctions.py index 5e0a3ee..0031387 100644 --- a/reffunctions.py +++ b/reffunctions.py @@ -808,7 +808,7 @@ def geomtouches(values, feature, parent): else: parent.setEvalErrorString("error: no features to compare") -@qgsfunction(-1, "Reference", register=False,usesgeometry=True) +@qgsfunction(2, "Reference", register=False,usesgeometry=True) def geomintersects(values, feature, parent): """ Retrieve target field value when source feature intersects target feature in target layer @@ -830,13 +830,9 @@ def geomintersects(values, feature, parent):

""" dbg=debug() - dbg.out("evaluating geomintersects") + dbg.out("evaluating geomtouches") targetLayerName = values[0] targetFieldName = values[1] - if len(values) == 3: - sourceGeometry = values[2] - else: - sourceGeometry = feature.geometry() #layerSet = {layer.name():layer for layer in iface.legendInterface().layers()} layerSet = _getLayerSet() if not (targetLayerName in layerSet.keys()): @@ -851,7 +847,7 @@ def geomintersects(values, feature, parent): for feat in layerSet[targetLayerName].getFeatures(): count += 1 if count < 100000: - if sourceGeometry.intersects(feat.geometry()): + if feature.geometry().intersects(feat.geometry()): if targetFieldName=="$geometry": dminRes = feat.geometry().exportToWkt() elif targetFieldName=="$id": @@ -1274,7 +1270,56 @@ def intersecting_geom_count(values, feature, parent): else: return False + +@qgsfunction(args=1, group='Reference',register = False, usesgeometry=True) +def equaling_geom_count(values, feature, parent): + """ + Get the count of the features in target layer equaling (same geometry) by the source feature + +

Syntax

+

equaling_geom_count('target_layer_name')

+

Arguments

+

target_layer_name : name of the target layer, for exemple 'COUNTRIES'.
+ +

Example

+

+ equaling_geom_count('COUNTRIES') → 665

+ + """ + + DEBUG = True + try: #qgis 3 + if DEBUG : print('feat geom ',feature.geometry().asPolygon(), feature.geometry().area(), feature.hasGeometry()) + except: #qgis 2 + if DEBUG : print('feat geom ', feature.geometry()) + + targetLayerName = values[0] + #targetFieldName = values[1] + + if feature.geometry() is not None: + #layerSet = {layer.name():layer for layer in iface.legendInterface().layers()} + layerSet = _getLayerSet() + + + if not (targetLayerName in layerSet.keys()): + parent.setEvalErrorString("error: targetLayer not present") + return + if layerSet[targetLayerName].type() != qgis.core.QgsMapLayer.VectorLayer: + parent.setEvalErrorString("error: targetLayer is not a vector layer") + return + count = 0 + + request = qgis.core.QgsFeatureRequest() + request.setFilterRect(feature.geometry().boundingBox()) + for feat in layerSet[targetLayerName].getFeatures(request): + if feat.geometry().isGeosEqual(feature.geometry()): + count += 1 + if DEBUG : print('feat ',feature.id(),'count',count) + return count + + else: + return False @qgsfunction(args=2, group='Reference',register = False, usesgeometry=True) @@ -1443,6 +1488,8 @@ def initGui(self): QgsExpression.registerFunction(intersecting_geom_count) QgsExpression.registerFunction(intersecting_geom_sum) + QgsExpression.registerFunction(equaling_geom_count) + icon_path = os.path.join(self.plugin_dir,"icon.png") # map tool action self.action = QAction(QIcon(icon_path),"refFunctions", self.iface.mainWindow()) @@ -1479,6 +1526,8 @@ def unload(self): QgsExpression.unregisterFunction('intersecting_geom_count') QgsExpression.unregisterFunction('intersecting_geom_sum') + QgsExpression.unregisterFunction('equaling_geom_count') + self.iface.removePluginMenu(u"&refFunctions", self.action) self.iface.removeToolBarIcon(self.action)