Opened 13 years ago

Closed 13 years ago

Last modified 7 years ago

#1331 closed enhancement (duplicate)

[raster] Physically relevant geotransform settings

Reported by: bnordgren Owned by: pracine
Priority: medium Milestone: PostGIS Fund Me
Component: raster Version: master
Keywords: Cc:

Description

I only have the forward calculations worked out and described on the wiki. I have an approach in mind for the reverse calculations.

Algorithm documentation: DevWikiAffineParameters

This could stand to be reviewed/edited (for clarity and correctness) by someone other than me. Code will follow feedback on the proposed algorithm.

This approach allows users to specify the geotransform in terms of the following parameters:

  • The magnitude of the ib basis vector (distance between pixels along i axis)
  • The magnitude of the jb basis vector (distance between pixels along j axis)
  • The angle θi (the angle by which the raster's grid needs to be rotated, positive clockwise -- for compatibility with "heading/bearing")
  • The angle θij (the angle from the i basis vector to the j basis vector positive counterclockwise -- for consistency with right-handed coordinate system)
  • The offsets tx and ty

This would likely result in a single function with a signature like:

ST_SetGeoTransform(raster raster, 
                   float8 i_magnitude,
                   float8 j_magnitude, 
                   float8 theta_i default 0,
                   float8 theta_ij default -90)

... or the equivalent if I pooched the SQL syntax.

We should also downplay the scale/skew accessors after this is implemented. They're still relevant for copying individual parameters from an external source, but it's almost never appropriate to change just one or two of them. ...and the names for the parameters are somewhat misleading.

Change History (9)

comment:1 by bnordgren, 13 years ago

The method to calculate these physically relevant parameters given an arbitrary transform is presented on DevWikiRealParameters.

This would likely result in a single function with a signature like:

ST_GetGeoTransform(raster rast)

returning a setof 4 values:

  • i_magnitude
  • j_magnitude
  • theta_i
  • theta_ij

After implementation, ST_GetRotation should be modified to return theta_i from this function. Currently, ST_GetRotation returns NaN if theta_ij is not +-90 degrees.

If other accessors for individual parameters are desired, they may be implemented on top of the two general functions presented here with little or no loss of performance.

comment:2 by bnordgren, 13 years ago

Tentative implementation here: https://github.com/bnordgren/postgis/blob/ri-gen2-svn/raster/rt_core/rt_api.c#L3837

CUnit tests here: https://github.com/bnordgren/postgis/blob/ri-gen2-svn/raster/test/core/cu_geotransform.c

I have the "setGeotransform" function implemented in rt_pg.c. "getGeotransform" needs to return 1 row with four columns, but I'm not sure how to do that.

comment:3 by bnordgren, 13 years ago

Version: 1.5.Xtrunk

The implementation in my git repo is now exposed to the SQL interface. This includes:

  • A new type (geotransform)
  • A getter (ST_Getgeotransform)
  • Two setter variants (ST_setgeotransform)

The type :

CREATE TYPE geotransform AS (
        imag     double precision,
        jmag     double precision,
        theta_i  double precision,
        theta_ij double precision,
        xoffset  double precision,
        yoffset  double precision) ;

The getter signature:

ST_GetGeotransform(raster) -> geotransform

The setter signatures:

ST_SetGeotransform(rast raster,
                imag double precision, jmag double precision,
                theta_i double precision, theta_ij double precision,
                xoffset double precision, yoffset double precision) -> raster

ST_SetGeotransform(rast raster, gt geotransform) -> raster

These terms are consistent with the wiki pages, but not necessarily with the other accessors.

  • theta_i has been referred to as "rotation"
  • imag has been referred to as "pixelwidth"
  • jmag has been referred to as "pixelheight"

The current terms for the last two are only intuitive if theta_i=0; and they mean exactly the opposite of the intuitive sense if theta_i= +-pi/2 (e.g., width is height and vice versa. However, imag and jmag always represent the pixel length along the i and j axes, respectively.)

xoffset and yoffset specify the location of the origin (i,j)=(0,0). This is identical to the upper left corner if and only if theta_i=0 and theta_ij=-pi/2. Otherwise, it could be any of the other three corners of the raster.

I'm flexible on the terminology, but whatever is chosen should be meticulously docmented, probably in the "raster best practices" section suggested by robe. Reasonable defaults could also be provided.

https://github.com/bnordgren/postgis/tree/ri-gen2-svn

comment:4 by robe, 13 years ago

Bryce,

If the ST_GetGeoTransform is the only thing that will be using geotransform, please use OUT parameters instead of a type. Types are a real pain to add in upgrades or change in PostgreSQL. I already yelled at other raster folks for their over love of types.

RETURNS TABLE would be fine too (probably clearer) but all the other code uses OUT parameters so we should probably stick with that convention for now. also the fact I don't have provision in docs for documenting RETURNS TABLE.

comment:5 by bnordgren, 13 years ago

Oh my. that is nicer. Forgive my inexperience with postgresql implementation concepts.

Done.

ST_GetGeotransform(rast raster,
        OUT imag     double precision,
        OUT jmag     double precision,
        OUT theta_i  double precision,
        OUT theta_ij double precision,
        OUT xoffset  double precision,
        OUT yoffset  double precision)
ST_SetGeotransform(rast raster,
                imag double precision, jmag double precision,
                theta_i double precision, theta_ij double precision,
                xoffset double precision, yoffset double precision) -> raster

comment:6 by bnordgren, 13 years ago

I think that #1556 duplicates this ticket, but I haven't had a chance to actually look at what's in SVN yet.

comment:7 by bnordgren, 13 years ago

Resolution: duplicate
Status: newclosed

Yup, looks like this has been covered in #1556

comment:8 by pracine, 13 years ago

Milestone: PostGIS Raster FuturePostGIS Future

comment:9 by robe, 7 years ago

Milestone: PostGIS FuturePostGIS Fund Me

Milestone renamed

Note: See TracTickets for help on using tickets.