# Rotate a Geometry Generator expression with a 180 degrees rotation

From a point geometry layer to which apply a Geometry Generator expression to creates a new geometry, my goal is to translate this expression rotating 180 degrees, and taking as reference the opposite side of a rectangle polygon layer.

• `translate(rotate(\$geometry, 180), [something with the centroid and x(@map_extent_center)]))`? Feb 27 at 14:41
• `translate` takes 3 parameters, a `geometry`, a `dx` and a `dy` (delta x, delta y). In your failed solution, you are passing `make_line` as `dx`.
– Matt
Feb 27 at 19:37
• `rotate(\$geometry, 180, center:=make_point(0,0))`? I don't understand what you mean as "reference" for the 0, 0 coordinate on your left side and what you mean by "the limits of a rectangle polygon". Feb 27 at 19:38
• What rectangle polygon though? Is it a fixed thing with fixed coordinates? Do you want the expression to look at its geometry? What is its relationship to the geometry you want to use the expression on? Feb 27 at 20:08
• I answer your questions: The rectangular polygon is a layer with fixed coordinates with the extend -3.165,-9.939 : 36.678,10.0965. I think it is necessary for the point layer to look at the geometry of the polygon layer. After rotating, the point layer should be moved to the exact opposite side of the polygon. The relationship of the point layer to the polygon layer is that for each point the distance to the 0.0,0.0 coordinate is calculated. The opposite coordinate is 33.00, 0.0 Feb 27 at 20:26

If you're looking to rotate generic geometries, and not just points, then the `rotate` function should work. You just need to specify the right centre point - which is the centroid of the rectangle. It assumes you have a polygon layer called `Rectangle` with a single rectangle feature.

``````rotate(@geometry, 180, centroid(aggregate('Rectangle', 'array_agg', @geometry)[0]))
``````

You should be able to replace the first `@geometry` with any arbitrary expression that creates a geometry - for example, `make_line(make_point(0.0,0.0),\$geometry)`.

I haven't done this as I don't have the same data set as you, but there's no reason that it shouldn't work.

• Perfect. Solved. Feb 28 at 11:17

If you're just to rotate your point within a polygon layer that has a single rectangle, you can use something like the following:

``````with_variable('centroid',centroid(aggregate('Rectangle','array_agg',@geometry)[0]),
with_variable('distance',distance(@geometry,@centroid),
with_variable('azimuth',azimuth(@geometry,@centroid),
project(@centroid,@distance,@azimuth))))
``````

It relies on the fact that a rotation within a rectangle is just projecting the point from the centroid, the same distance and same angle again.

• I have tried your solution, and it does the expected job, and it's almost what I'm looking for. However, I add in my question some remarks. In short, I would like your solution works with any expression no matter how complex it is Feb 28 at 7:30
• @IngridIngravida, you should be able to replace `@geometry` in the `distance` and `azimuth` functions (lines 2 and 3) with any expression that creates a geometry.
– Matt
Feb 28 at 10:11
• @Matt, thanks a lot for this instruction. I have tried to implement it but when I get to the azimuth function there seems to be an incompatibility. I have documented this test in my question Feb 28 at 10:53