The only reason I can think why QGIS and DBeaver would show something different 
is how they are projecting.

 

I’m guessing they are both projecting to Web Mercator or some such thing  to 
overlay your geometry on the map, and their assumptions about SRID 28992  are 
different.

 

I’d try transforming both your geometries to 4326

 

ST_Transform( ST_Polygon(…), 4326)

 

I’m guessing whatever spatial projecting they do from 4326 should be consistent.

 

Alternatively ditch the map overlay and then maybe they won’t try to reproject.

 

From: Eloi Ribeiro <m...@eloiribeiro.eu> 
Sent: Thursday, March 21, 2024 11:47 AM
To: PostGIS Users Discussion <postgis-users@lists.osgeo.org>
Subject: RE: How to properly rotate a raster

 

Hi Regina and all,

 

I' seeing different things depending on what application I use. On QGIS the 
rotated raster appears smaller in width and height. On DBeaver, both rotate, 
although in different directions.

 

-- Create raster from polygon (black line)

DROP TABLE IF EXISTS public.rast_not_rotated;

CREATE TABLE public.rast_not_rotated AS

    SELECT ST_AsRaster(t.geom,1000,1000,'8BUI',1,0) AS rast

    FROM (SELECT ST_GeomFromText('POLYGON((166989.36462303242 
505764.77048559673,

                                 166996.25788353998 505576.476318614,

                                 167265.54134611748 505585.94966528506,

                                 167258.67088940175 505774.2438322678,

                                 166989.36462303242 
505764.77048559673))',28992) geom) t;

ALTER TABLE public.rast_not_rotated ADD COLUMN rid SERIAL PRIMARY KEY;

CREATE INDEX rast_not_rotated_rast_gist ON public.rast_not_rotated USING gist 
(st_convexhull(rast));

SELECT AddRasterConstraints('public'::name, 
'rast_not_rotated'::name,'rast'::name);

 

-- rotate previous raster (blue)

DROP TABLE IF EXISTS public.rast_rotated_from_raster;

CREATE TABLE public.rast_rotated_from_raster AS SELECT ST_SetRotation(rast, 
-0.5) rast FROM public.rast_not_rotated;

ALTER TABLE public.rast_rotated_from_raster ADD COLUMN rid SERIAL PRIMARY KEY;

CREATE INDEX rast_rotated_from_raster_rast_gist ON 
public.rast_rotated_from_raster USING gist (st_convexhull(rast));

SELECT AddRasterConstraints('public'::name, 
'rast_rotated_from_raster'::name,'rast'::name);

 

-- rotate polygon and then save as raster (red)

DROP TABLE IF EXISTS public.rast_rotated_from_vector;

CREATE TABLE public.rast_rotated_from_vector AS

    SELECT ST_AsRaster(t.geom,1000,1000,'8BUI',1,0) AS rast

    FROM (SELECT ST_Rotate(

                    ST_GeomFromText('POLYGON((166989.36462303242 
505764.77048559673,

                                    166996.25788353998 505576.476318614,

                                    167265.54134611748 505585.94966528506,

                                    167258.67088940175 505774.2438322678,

                                    166989.36462303242 
505764.77048559673))',28992)

                                    ,-0.5, 166989.36462303242, 
505764.77048559673) geom) t;

ALTER TABLE public.rast_rotated_from_vector ADD COLUMN rid SERIAL PRIMARY KEY;

CREATE INDEX rast_rotated_from_vector_rast_gist ON 
public.rast_rotated_from_vector USING gist (st_convexhull(rast));

SELECT AddRasterConstraints('public'::name, 
'rast_rotated_from_vector'::name,'rast'::name);

 

On QGIS.

black line - raster from polygon

red - the rotated polygon and then converted to raster

blue - rotated raster, different from how it is displayed in DBeaver.

 

 


On DBeaver this is how it shows the rotated raster.



 

On DBeaver this is how it shows the rotated polygon and then converted to 
raster.

 

 

 

 

 

On Tuesday, March 19th, 2024 at 14:58, Regina Obe <l...@pcorp.us 
<mailto:l...@pcorp.us> > wrote:



An easier way to compare what is happening is to look at the ST_Polygon output 
of the two. https://postgis.net/docs/en/RT_ST_Polygon.html

 

I’m thinking the confusion (which I had thought myself) is that the width and 
height is measured against the X y axis, but now I think about it, I think it’s 
measured along the skew so width and height would remain the same in both 
cases. In the case of your polygon you rotate and then save as raster, the new 
raster is axis aligned and so there you do see the width and height change.

 

So when I run this query:

 

 

SELECT ST_Polygon(r1.rast) AS orig_geom_rast, ST_Polygon(r2.rast) AS 
rotated_geom_rast, ST_Width(r1.rast) AS orig_width, ST_Width(r2.rast) AS 
rotated_width

FROM (SELECT rast FROM rast_not_rotated) AS r1,

(SELECT ST_SetRotation(rast, -0.5 ) AS rast FROM rast_not_rotated) AS r2;

 

The dashed polygon is the original polygon and the filled in one is after you 
rotate the raster. In both cases the ST_Width and ST_Height do not change so 
that’s not a good measure of what is going on.

 

 



 

 

 

 

From: Eloi Ribeiro <m...@eloiribeiro.eu <mailto:m...@eloiribeiro.eu> > 
Sent: Tuesday, March 19, 2024 6:56 AM
To: PostGIS Users Discussion <postgis-users@lists.osgeo.org 
<mailto:postgis-users@lists.osgeo.org> >
Subject: RE: How to properly rotate a raster

 

 

Hi all,

 

Here an example with the code.

If you compare rast_rotated_from_raster with rast_rotated_from_vector, the 
latest is rotated as expected and the first is not.

I guess, I must be doing something wrong when creating rast_rotated_from_raster.

Any guess?

 

-- non rotated raster

DROP TABLE IF EXISTS public.rast_not_rotated;

CREATE TABLE public.rast_not_rotated AS

    SELECT ST_AsRaster(t.geom,1000,1000,'8BUI',1,0) AS rast 

    FROM (SELECT ST_GeomFromText('POLYGON((166989.36462303242 
505764.77048559673,

                                 166996.25788353998 505576.476318614,

                                 167265.54134611748 505585.94966528506,

                                 167258.67088940175 505774.2438322678,

                                 166989.36462303242 
505764.77048559673))',28992) geom) t;

ALTER TABLE public.rast_not_rotated ADD COLUMN rid SERIAL PRIMARY KEY;

CREATE INDEX rast_not_rotated_rast_gist ON public.rast_not_rotated USING gist 
(st_convexhull(rast));

SELECT AddRasterConstraints('public'::name, 
'rast_not_rotated'::name,'rast'::name);

 

-- rotate previous raster

DROP TABLE IF EXISTS public.rast_rotated_from_raster;

CREATE TABLE public.rast_rotated_from_raster AS SELECT ST_SetRotation(rast, 
-0.035162353342492736) rast FROM public.rast_not_rotated;

ALTER TABLE public.rast_rotated_from_raster ADD COLUMN rid SERIAL PRIMARY KEY;

CREATE INDEX rast_rotated_from_raster_rast_gist ON 
public.rast_rotated_from_raster USING gist (st_convexhull(rast));

SELECT AddRasterConstraints('public'::name, 
'rast_rotated_from_raster'::name,'rast'::name);

 

-- rotate polygon and then save as raster

DROP TABLE IF EXISTS public.rast_rotated_from_vector;

CREATE TABLE public.rast_rotated_from_vector AS

    SELECT ST_AsRaster(t.geom,1000,1000,'8BUI',1,0) AS rast 

    FROM (SELECT ST_Rotate(

                    ST_GeomFromText('POLYGON((166989.36462303242 
505764.77048559673,

                                    166996.25788353998 505576.476318614,

                                    167265.54134611748 505585.94966528506,

                                    167258.67088940175 505774.2438322678,

                                    166989.36462303242 
505764.77048559673))',28992)

                                    ,-0.035162353342492736, 166989.36462303242, 
505764.77048559673) geom) t;

ALTER TABLE public.rast_rotated_from_vector ADD COLUMN rid SERIAL PRIMARY KEY;

CREATE INDEX rast_rotated_from_vector_rast_gist ON 
public.rast_rotated_from_vector USING gist (st_convexhull(rast));

SELECT AddRasterConstraints('public'::name, 
'rast_rotated_from_vector'::name,'rast'::name);

 

 

Eloi

 

 

On Monday, March 18th, 2024 at 19:11, Eloi Ribeiro <m...@eloiribeiro.eu 
<mailto:m...@eloiribeiro.eu> > wrote:

Hi Regina and all,

 

Elaborating a bit more. I have a vector layer consisting of a rectangle (farm 
plot), and this rectangle is subdivided into several (polygons) stripes 
parallel to the outer edge of the rectangle. I want to produce a raster where 
the rectangle and stripes long edges are parallel to the latitude line.

 

Using ST_Rotate(geom, -0.035, x, y) in all vector layers together with 
ST_AsRaster(), I managed to get what I want. Good.

 

Nevertheless, if I first produce the raster and then try to rotated it using 
ST_SetRotation(rast, -0.035), I barely see any rotation. In this step, I must 
be doing something wrong.

I would like to first rasterize vector and then rotate the raster. Instead of 
rasterize non rotated vector and then, again rasterize rotated vector.

 

The change in size (width and height), I mentioned in my first message, was 
while testing with 0.5 rad, not with -0.035 rad.

-- input raster

SELECT ST_Width(rast), ST_Height(rast), ST_SkewX(rast) FROM plot_3;

--  st_width | st_height | st_skewx 

-- ----------+-----------+----------

--      1000 |      1000 |        0

 

-- output raster of ST_SetRotation(rast, -0.035162353342492736)

SELECT ST_Width(rast), ST_Height(rast), ST_SkewX(rast) FROM 
plot_3_rotated_from_raster;

--  st_width | st_height |       st_skewx       

-- ----------+-----------+----------------------

--      1000 |      1000 | 0.006952538312005269

 

-- output raster of ST_SetRotation(rast, -0.035162353342492736)

SELECT ST_Width(rast), ST_Height(rast), ST_SkewX(rast) FROM 
plot_3_rotated_from_vect;

--  st_width | st_height | st_skewx 

-- ----------+-----------+----------

--       977 |       964 |        0

 

-- output raster of ST_SetRotation(rast, -0.5)

SELECT ST_Width(rast), ST_Height(rast), ST_SkewX(rast) FROM 
plot_3_rotated_from_raster_05;

--  st_width | st_height |      st_skewx       

-- ----------+-----------+---------------------

--      1000 |      1000 | 0.09481479675190897

 

 

Cheers,

Eloi

 

 

On Monday, March 18th, 2024 at 14:01, Regina Obe <l...@pcorp.us 
<mailto:l...@pcorp.us> > wrote:

By size, what do you mean exactly? It would change the width and height.

 

What are you expecting rotation to do. Perhaps you can give example out of the 
below and some sample

 

ST_Width, ST_Height, ST_SkewX before and after and what you were expecting.

 

https://postgis.net/docs/en/RT_ST_SetRotation.html

 

From: Eloi Ribeiro <m...@eloiribeiro.eu <mailto:m...@eloiribeiro.eu> > 
Sent: Monday, March 18, 2024 4:57 AM
To: PostGIS Users Discussion <postgis-users@lists.osgeo.org 
<mailto:postgis-users@lists.osgeo.org> >
Subject: How to properly rotate a raster

 

Hi all,

 

I need to rotate a raster, for that I'm using the function ST_SetRotation, like 
so: 

CREATE TABLE plot_3_rotated AS 
SELECT ST_SetRotation(rast, 0.03516235334249185) rast 
FROM plot_3;

 

But I see that is not producing the expected results and is changing size of 
the raster. What am I doing wrong?

Cheers,

 

Eloi

 

 

 

 

Reply via email to