I am looking for an expression to get_feature with two values from two different fields.
At its core is the question: How can I transform a chain of values which define a point into a valid geometry expression? For example for Point B:
?? geometry ("obj_art" = 'Ansicht' and "ptnr" = 'B') ??
Kasper has given us the answer to the question how a geometry can be defined over several values. You can use the aggregate ( ) expression. On the last position (filter:=), an arbitrarily long chain of values or conditions can be placed. The expression is unfortunately not self explanatory, but there are plenty of examples.
aggregate(layer:=' ', aggregate:=' ', expression:= ,
filter:="prof_nr"= @atlas_pagename and "obj_art"='Ansicht' and "ptnr" ='B' and so on and so on )
My Goal is to plot archaeological profiles via QGIS Atlas. Therefore I want to use Point A and Point B to filter page name. enter image description here As coverage layer I have a point layer in which point A and B are located. Both points have the same value in field "prof_nr" so that is page name. Both points are defined by two other values from two different fields (Image 1).
My approach is to make_line out of both points, so that I always get only one Atlas feature per archaeological profile on which the map zooms in the middle. Both points can be easily called by CASE WHEN but with the expression I do not succeed in creating a line (Image 1)
CASE WHEN "obj_art" = 'Ansicht' and "ptnr" = 'A' or "obj_art" ='Ansicht' and "ptnr" = 'B' THEN "prof_nr" END
Therefore I select only point A for page name and moved the make_line to the extents of the map (Image2, 3) enter image description here enter image description here
x_min(
bounds(
make_line(
start_point(@atlas_geometry),geometry(
get_feature('E_Point', 'ptnr','B')
)
)
)
)
Here I can connect both points with make_line, but with get_feature I can only assign a value from one field but to define the point I need two values from two fields for each point.
Does anyone have a solution?
-
Sharing a project with sample data could help understanding the problem. Otherwise, one has first to try re-creating a similar project what quite takes some time that would be better spent on finding a solution.Babel– Babel2023年02月05日 14:46:58 +00:00Commented Feb 5, 2023 at 14:46
-
1Why not use the line generated from the point as your atlas layer? Or even group the points in a multipoint geometry?Al rl– Al rl2023年02月05日 14:49:37 +00:00Commented Feb 5, 2023 at 14:49
-
In my coverage layer there are other points to which the filter 'E_Point', 'ptnr','B' applies. Therefore I need to add another value from another field to specify the filter (and the point).Janko– Janko2023年02月05日 15:16:55 +00:00Commented Feb 5, 2023 at 15:16
-
Have a look at the 'aggregate' function and it's examples, you will be able to get your feature thanks to an appropriate filter (ptnr = B and prof_nr = whatever needed)Kasper– Kasper2023年02月05日 15:56:19 +00:00Commented Feb 5, 2023 at 15:56
-
Tried a lot with something like: aggregate (layer:='E_Point',aggregate:='collect',expression:=bounds($geometry),filter:= "ptnr" ='B'and"obj_art"='Ansicht'). But its always a geometrie: emtpy, NULL or in this case a geometry: Multipolygon?Janko– Janko2023年02月05日 17:37:44 +00:00Commented Feb 5, 2023 at 17:37
1 Answer 1
The Solution ist to override the x_Extents of the map!
For x_min I call point A
x_min(
aggregate (layer:='E_Point',aggregate:='collect',
expression:=bounds($geometry)
,filter:="prof_nr"= @atlas_pagename and "obj_art"='Ansicht' and "ptnr" ='A' )
)
For x_max I call point B
x_max(
aggregate (layer:='E_Point',aggregate:='collect',
expression:=bounds($geometry)
,filter:="prof_nr"= @atlas_pagename and "obj_art"='Ansicht' and "ptnr" ='B' )
)
Filter for pagename is to call Point A (or Point B, it doesn't matter)
CASE WHEN "obj_art" = 'Ansicht' and "ptnr" = 'A' THEN "prof_nr" END
That's it
Explore related questions
See similar questions with these tags.