<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
 /* List Definitions */
 @list l0
        {mso-list-id:102460714;
        mso-list-template-ids:-2070779980;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1
        {mso-list-id:710303793;
        mso-list-template-ids:95835370;}
@list l1:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l2
        {mso-list-id:1280916343;
        mso-list-template-ids:187353362;}
@list l2:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l3
        {mso-list-id:1443063541;
        mso-list-template-ids:356796956;}
@list l3:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l4
        {mso-list-id:1932934958;
        mso-list-template-ids:-129224938;}
@list l4:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-US link=blue vlink=purple>

<div class=WordSection1>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>David,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>I like that very much! It’s not because the ESRI
definition of World File have been confusing for years that we must continue in
the same way (like GDAL did). scalex is not pixelsize. Period. I like that we
name things by their real names, in a clearer way. The fact that ST_PixelSizeX will
return the samething as ST_ScaleX for all non rotated rasters make the
transition easy.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>I think we should split ST_Rotation into ST_RotationX and ST_RotationY
so a user can always test if ST_RotationX = ST_RotationY and determine himself if
it is a true rotation.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>+1<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Pierre<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
postgis-devel-bounces@postgis.refractions.net
[mailto:postgis-devel-bounces@postgis.refractions.net] <b>On Behalf Of </b>David
Zwarg<br>
<b>Sent:</b> 22 septembre 2010 09:55<br>
<b>To:</b> PostGIS Development Discussion<br>
<b>Subject:</b> Re: [postgis-devel] WKTRaster Scale and Skew<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Raster devs, sorry for the delay,<br>
<br>
I've been thinking of a solution that would be acceptable moving forward for
all cases.  I am playing a bit of the Devil's advocate on this issue, so
please bear with me.<br>
<br>
I'll back off on my earlier request to rename things -- I was proposing that
because it made sense to me, but I see that GDAL (and the like) don't do things
that way, and it would be confusing to new users.<br>
<br>
It seems like it would be most clear to have a set of functions for accessing
the georeference components, named 'scale', 'skew', and 'upperleft'. The
'scale' functions would be renamed from their current name, which is
'pixelsize'. That would provide 3 sets of functions:<br>
<br>
Scale (renamed from Pixelsize):<o:p></o:p></p>

<ul type=disc>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l0 level1 lfo1'>ST_SetScale(r,x,y)<o:p></o:p></li>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l0 level1 lfo1'>ST_ScaleX(r)<o:p></o:p></li>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l0 level1 lfo1'>ST_ScaleY(r)<o:p></o:p></li>
</ul>

<p class=MsoNormal>Skew:<o:p></o:p></p>

<ul type=disc>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l4 level1 lfo2'>ST_SetSkew(r,x,y) <o:p></o:p></li>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l4 level1 lfo2'>ST_SkewX(r)<o:p></o:p></li>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l4 level1 lfo2'>ST_SkewY(r)<o:p></o:p></li>
</ul>

<p class=MsoNormal>Upper Left:<o:p></o:p></p>

<ul type=disc>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l3 level1 lfo3'>ST_SetUpperLeft(r,x,y)<o:p></o:p></li>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l3 level1 lfo3'>ST_UpperLeftX(r)<o:p></o:p></li>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l3 level1 lfo3'>ST_UpperLeftY(r)<o:p></o:p></li>
</ul>

<p class=MsoNormal>Then, I propose adding some new functions that compute their
values based on the values in the georeference. I propose that pixelsize
is now computed from scale and skew, to accurately reflect the size of a pixel
at any rotation angle.  Also, rotation is also computed from scale and
skew.  When these values are 'set', both scale and skew will change. That
would provide another couple sets of functions:<br>
<br>
PixelSize (dynamically computed from scale and skew):<o:p></o:p></p>

<ul type=disc>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l2 level1 lfo4'>ST_SetPixelSize(r,x,y)<o:p></o:p></li>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l2 level1 lfo4'>ST_PixelSizeX(r)<o:p></o:p></li>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l2 level1 lfo4'>ST_PixelSizeY(r)<o:p></o:p></li>
</ul>

<p class=MsoNormal>Rotation (dynamically computed from scale and skew):<o:p></o:p></p>

<ul type=disc>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l1 level1 lfo5'>ST_SetRotation(r,angle)<o:p></o:p></li>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l1 level1 lfo5'>ST_Rotation(r)<o:p></o:p></li>
</ul>

<p class=MsoNormal style='margin-bottom:12.0pt'>If one uses these methods on a
North-up raster, skew will be 0,0, rotation will be 0, and PixelSize = Scale
(let's say these are 1).  This is consistent with the way wktraster
currently works. Now, when one uses these methods on a Pi/6 radian (30 degree)
rotated raster, the skew will be 0.5, 0.5, rotation will be Pi/6, PixelSize
will <i>still be</i> 1, and scale will be 0.866, 0.866.  It is important
that as one rotates the raster, the <b>Pixelsize remains constant</b>. Note
that the skew values are pixelsize * sin(rotation), and scale values are
pixelsize * cos(rotation).<br>
<br>
I haven't yet figured out a good way to represent rotation for diamond-shaped
rasters (with different skewX and skewY values).  Maybe ST_Rotation is
broken into ST_RotationX and ST_RotationY?<br>
<br>
Thoughts?<br>
Zwarg<o:p></o:p></p>

<div>

<p class=MsoNormal>On Tue, Sep 14, 2010 at 11:19 AM, Pierre Racine <<a
href="mailto:Pierre.Racine@sbf.ulaval.ca">Pierre.Racine@sbf.ulaval.ca</a>>
wrote:<o:p></o:p></p>

<div>

<div>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span
style='font-size:11.0pt;color:#1F497D'>So in the end, what are the proposed
changes from the users point of view (in rtpostgis.sql)? Sorry I have been away
a bit.</span><o:p></o:p></p>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span
style='font-size:11.0pt;color:#1F497D'> </span><o:p></o:p></p>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span
style='font-size:11.0pt;color:#1F497D'>Pierre</span><o:p></o:p></p>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span
style='font-size:11.0pt;color:#1F497D'> </span><o:p></o:p></p>

<div style='border:none;border-left:solid windowtext 1.5pt;padding:0cm 0cm 0cm 4.0pt;
border-color:-moz-use-text-color -moz-use-text-color -moz-use-text-color blue'>

<div>

<div style='border:none;border-top:solid windowtext 1.0pt;padding:3.0pt 0cm 0cm 0cm;
border-color:-moz-use-text-color -moz-use-text-color'>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span
style='font-size:10.0pt'>From:</span></b><span style='font-size:10.0pt'> <a
href="mailto:postgis-devel-bounces@postgis.refractions.net" target="_blank">postgis-devel-bounces@postgis.refractions.net</a>
[mailto:<a href="mailto:postgis-devel-bounces@postgis.refractions.net"
target="_blank">postgis-devel-bounces@postgis.refractions.net</a>] <b>On Behalf
Of </b>David Zwarg<br>
<b>Sent:</b> 10 septembre 2010 11:35<br>
<b>To:</b> PostGIS Development Discussion<br>
<b>Subject:</b> Re: [postgis-devel] WKTRaster Scale and Skew</span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p>

<div>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>On
Fri, Sep 10, 2010 at 11:16 AM, Pierre Racine <<a
href="mailto:Pierre.Racine@sbf.ulaval.ca" target="_blank">Pierre.Racine@sbf.ulaval.ca</a>>
wrote:<o:p></o:p></p>

<div>

<p class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt'>>
 Width is computed based on scale & skew?<o:p></o:p></p>

</div>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>In
99% of the cases there is no rotation and pixel width & height ARE synonyms
for scale X and scale Y. Is it worth changing their names? Adding confusion?
How does GDAL name it?<o:p></o:p></p>

<div>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><br>
I agree that 99% of the time, there is no rotation.  I don't propose
changing the names of the pixel width methods, just change the way it is
computed to account for the skewing.  I wouldn't mind hiding the
set_skews() method, in favor of accepting all adjustments in the form of the
georeference string.  This is the way GDAL gets around it -- they don't
name the 6 components of the georeference, and just note that "In case of
north up images, the GT(2) and GT(4) coefficients are zero" -- not much
help if you want to know what happens when north is not up.<br>
 <o:p></o:p></p>

</div>

<blockquote style='border:none;border-left:solid windowtext 1.0pt;padding:0cm 0cm 0cm 6.0pt;
margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt;
border-color:-moz-use-text-color -moz-use-text-color -moz-use-text-color rgb(204, 204, 204)'>

<div>

<p class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt'><br>
>We don't call it scaleX and scaleY, but cell_width_x and cell_height_y<br>
>We don't call it skewX and skewY, but cell_width_y and cell_height_x<o:p></o:p></p>

</div>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>In
rt_api.c? Why not...<o:p></o:p></p>

<div>

<p class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt'><br>
>We separate the accessors for the pixel width and the georeference
component that is now used as the width.<o:p></o:p></p>

</div>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>You
mean creating a "truepixelwidth" function? Same reluctance since it
is not really a width when the pixel shape is a diamond. But you could say
"this happen only 0.001 of the time"... Does that mean removing or
renaming the ST_PixelSizeX and ST_PixelSizeY function?<o:p></o:p></p>

</blockquote>

<div>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><br>
I would propose some other name besides pixel 'width', since it's only a part
of the width.  Maybe we don't have any accessors for this value at all,
and the only way to get it is through the georeference string?<br>
 <o:p></o:p></p>

</div>

<blockquote style='border:none;border-left:solid windowtext 1.0pt;padding:0cm 0cm 0cm 6.0pt;
margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt;
border-color:-moz-use-text-color -moz-use-text-color -moz-use-text-color rgb(204, 204, 204)'>

<div>

<p class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt'><br>
>Tests assume the upper left coordinate is SMALLER in the X and GREATER in
the Y for all other coordinates in the raster -- this would require adjusting
our tests to handle the coordinate space uniformly.<o:p></o:p></p>

</div>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Ok.<br>
<br>
My main concern is to not confuse users with scale, skew and width. Most people
know only pixelsize.<o:p></o:p></p>

</blockquote>

<div>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><br>
I agree -- it took me a few minutes to understand that the parameters are not
exactly width or scale or skew.  This may be sacrilege, but what if all
that was hidden under the hood, and we just provide the true width/height get functions
and the get/set functions for the georeference?  Because most of the time,
nobody will care about the skew.<br>
<br>
Thoughts?<br>
Zwarg<br>
 <o:p></o:p></p>

</div>

<blockquote style='border:none;border-left:solid windowtext 1.0pt;padding:0cm 0cm 0cm 6.0pt;
margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt;
border-color:-moz-use-text-color -moz-use-text-color -moz-use-text-color rgb(204, 204, 204)'>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><br>
Pierre<br>
_______________________________________________<br>
postgis-devel mailing list<br>
<a href="mailto:postgis-devel@postgis.refractions.net" target="_blank">postgis-devel@postgis.refractions.net</a><br>
<a href="http://postgis.refractions.net/mailman/listinfo/postgis-devel"
target="_blank">http://postgis.refractions.net/mailman/listinfo/postgis-devel</a><o:p></o:p></p>

</blockquote>

</div>

<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p>

</div>

</div>

</div>

</div>

</div>

<p class=MsoNormal style='margin-bottom:12.0pt'><br>
_______________________________________________<br>
postgis-devel mailing list<br>
<a href="mailto:postgis-devel@postgis.refractions.net">postgis-devel@postgis.refractions.net</a><br>
<a href="http://postgis.refractions.net/mailman/listinfo/postgis-devel"
target="_blank">http://postgis.refractions.net/mailman/listinfo/postgis-devel</a><o:p></o:p></p>

</div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

</div>

</body>

</html>