2

I want to compare attribute values from different attributes from multiple layers in the Expression string builder in QGIS (3.16.1) in of these layers, but I don't know how to do that. I've tried out aggregate to get values from other layers, but I can only count, summarize etc. values. But I want to compare the values. For example there is the attribute "OBJID"(from the first layer). And I want to say OBJID (from the first layer) = OBJID (from another layer). So that all objects in the first layer are displayed where this equation is true.

3
  • 1
    Please can you provide some examples of your data so we can understand the requirements
    – JClarkson
    Commented Dec 2, 2020 at 15:36
  • For example there is the attribute "OBJID"(from the first layer). And I want to say OBJID (from the first layer) = OBJID(from another layer). So that all objects in the first layer are displayed if this equation is true.
    – Pedda
    Commented Dec 2, 2020 at 15:47
  • I wonder if attribute() or get_feature() may be of some use? docs.qgis.org/3.16/en/docs/user_manual/working_with_vector/…
    – JClarkson
    Commented Dec 2, 2020 at 16:09

2 Answers 2

2

There are at least two possibilities. Instead of using expressions, creating a virtual layer is probably the easier way:

Solution 1: Creating a virtual layer

What you can do is create a virtual layer and add this query:

SELECT Lay1.OBJID_1 as o1, Lay2.OBJID_2 as o2 
FROM Layer_1 as lay1, Layer_2 as lay2
WHERE o1=o2

Solution 2: Using QGIS expressions

If you want to use QGIS epressions, you can use the expression get_feature, where you set the (other) layer as 1st argument (here: 'Layer_2'), the fieldname you are interested in as 2nd argument (here: 'OBJID_2') and the value (here = "OBJID_1") as third argument. Be carful with single ' ' and dobble " " quatation marks. Now you have the feature from Layer_2 in the field OBJID_2 that has a value that equals OBJID_1.

For visualisation purpose, this expression here creates a line for points on Layer_1 to those points on Layer_2 that have the same value for OBJID_2 as the OBJID_1 on layer 1:

make_line (
   ( $geometry ) ,
   geometry ( 
      get_feature ( 
         'Layer_2', 
         'OBJID_2', 
         "OBJID_1" )
   )
)

See:

enter image description here

If you are in the expression editor somewhere on layer_1 and want to get an array of all features of layer_2, use the following expression: array_foreach(array,expression). This iterates for every element of the input-array (1st argument) over an expression (2nd argument) and outputs the collected results of the iterated expression.

We create an input-array containing the numbers from 1 to the number of the last feature with the expression generate_series(start,stop) where start is 1 and stop is the number of features the layer contains. We can get this number with the expression to_int ( layer_property ('Layer_2', 'feature_count') ) - we have to convert it to integer to_int()

So now we are ready to start going through each feature of layer_2. We get the features with the expression get_feature_by_id ( layer , feature_id ) and we can now set as feature_id the integers from the array created before: we reference it by @element. All together, it looks like:

array_foreach (
   generate_series ( 
      1,
      to_int ( layer_property (
         'Layer_2', 'feature_count')
      )
   ),
   ( get_feature_by_id ( 
      'Layer_2', 
      @element)
   )
)
1
  • Thank you! That helps me.
    – Pedda
    Commented Dec 4, 2020 at 17:29
2

I would use an attribute join (Processing > Vector general > Join attributes by field value). Using your example, the tool's input layer = Layer_1, and Table field = Layer_1's OBJID. Likewise, input layer 2 = Layer_2, and Table field 2 = Layer_2's OBJID.

Following the join, open the output layer's attribute table and click the Select features using an expression button (yellow box with a superimposed sigma). In the left-hand panel, insert the expression "OBJID" = "OBJID_2" (include the double-quotes). Voila! the selected records represent the cases where the expression is true.

1
  • Thank you! That helps me too.
    – Pedda
    Commented Dec 4, 2020 at 17:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.