<div dir="ltr"><div dir="auto"><div dir="ltr"><div class="gmail_default" style="font-family:monospace">"The terms clockwise and counterclockwise can only be applied to a 
rotational motion once a side of the rotational plane is specified, from
 which the rotation is observed."</div><div class="gmail_default" style="font-family:monospace"><a href="https://en.wikipedia.org/wiki/Clockwise" rel="noreferrer" target="_blank">https://en.wikipedia.org/wiki/Clockwise</a></div><div class="gmail_default" style="font-family:monospace" dir="auto">So, you need some kind of rotation (direction change) and some reference. In case of a polygon (or a closed line representing boundary of a polygon) both are obvious -> boundary direction and interior of a polygon.</div><div class="gmail_default" style="font-family:monospace" dir="auto">In case of a line the reference part is missing.</div><div class="gmail_default" style="font-family:monospace"></div><div class="gmail_default" style="font-family:monospace">What seams reasonable to me is to:</div><div class="gmail_default" style="font-family:monospace">- divide LINESTRING into segments,</div><div class="gmail_default" style="font-family:monospace">- combine consecutive segments into pairs,<br></div><div class="gmail_default" style="font-family:monospace">- chose 1st segment as a reference, <br></div><div class="gmail_default" style="font-family:monospace">- calculate the angle between segments (with respect to its direction OFC) using ST_Angle.</div><div class="gmail_default" style="font-family:monospace">The problem is, that one LINESTRING can have different "orientations". The CW/CCW is a property of {segment pair|the middle vertex of a pair of segments}.</div><div class="gmail_default" style="font-family:monospace">You can also use some direction as a reference (north in your example), but it<span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span> has the same disadvantages and <span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>gives no additional information other than the azimuth/azimuth class.</span></span></span></span></span></span> </div><div class="gmail_default" style="font-family:monospace"></div><div class="gmail_default" style="font-family:monospace"><br></div><div class="gmail_default" style="font-family:monospace">Anyway, the SQL could look like:</div><div class="gmail_default" style="font-family:monospace"><br></div><div class="gmail_default" style="font-family:monospace">with<br>a_line as (<br>      select 1 gid,ST_geomfromtext('LINESTRING(0 0,1 1,2 0,3 1)') a_line<br>    union all<br>     select 2 gid,ST_geomfromtext('LINESTRING(0 0,0.5 1,2 0.5,3.5 1)') a_line<br>      )<br>, points as (<br>      select gid,(ST_DumpPoints(a_line)).* <br> from a_line<br>   )<br>, segments as (<br>    select p1.gid,p1.path||p2.path start_end_points,ST_MakeLine(p1.geom,p2.geom) seg_geom <br>        from points p1, points p2 <br>    where p1.gid=p2.gid and p1.path[1]+1=p2.path[1]<br>       )       <br>select s1.gid<br>       , s1.start_end_points||s2.start_end_points[2] points<br>  , case floor(st_angle(s1.seg_geom,s2.seg_geom)/pi()) when 0 then 'CW' else 'CCW' end<br>from segments s1,segments s2<br>where s1.gid=s2.gid and s1.start_end_points[2]=s2.start_end_points[1];</div><div class="gmail_default" style="font-family:monospace"><br></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>If you insist on using the azimuth, replace the part from ", segments as (" with:<br></span></span></span></div><div class="gmail_default" style="font-family:monospace"><br></div><div class="gmail_default" style="font-family:monospace">        select p1.gid,p1.path||p2.path start_end_points,ST_Azimuth(p1.geom,p2.geom)<br>   from points p1, points p2 <br>    where p1.gid=p2.gid and p1.path[1]+1=p2.path[1]</div><div class="gmail_default" style="font-family:monospace"><br></div><div class="gmail_default" style="font-family:monospace">You can use LEAD() to optimize performance, but the SQL above is more readable in my opinion (it explains the logic better, I think).</div><div class="gmail_default" style="font-family:monospace"><br></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">czw., 17 lut 2022 o 08:32 Shaozhong SHI <<a href="mailto:shishaozhong@gmail.com" rel="noreferrer" target="_blank">shishaozhong@gmail.com</a>> napisał(a):<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div>How about each line gets split into segments.  <span style="font-family:Calibri,sans-serif;font-size:11pt">.  Each segment
is constructed with two points (current and next points.</span></div><div>Then, calculate bearing/azimuth</div><div>Then, determine whether it is clockwise or counter-clockwise.</div><div><br></div><div>Can this be done?</div><div><br></div><div>Regards,</div><div><br></div><div>David</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, 16 Feb 2022 at 20:39, Marcin Mionskowski <<a href="mailto:mionskowskimarcin@gmail.com" rel="noreferrer" target="_blank">mionskowskimarcin@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div style="font-family:monospace"><span lang="en"><span><span>It doesn't make sense for lines.</span></span></span></div><div style="font-family:monospace"><span lang="en"><span><span>Imagine LINESTRING(1 0,1 1) - which "part of a square" is this i.e. where is "the center of the <span lang="en"><span><span>square</span></span></span>": (1) 0.5,0.5 or (2) 1.5,0.5?</span></span></span></div><div style="font-family:monospace"><span lang="en"><span><span>If (1) it's CCW, if (2) CW.<br></span></span></span></div><div style="font-family:monospace"><span lang="en"><span><span><br></span></span></span> </div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">śr., 16 lut 2022 o 21:29 Shaozhong SHI <<a href="mailto:shishaozhong@gmail.com" rel="noreferrer" target="_blank">shishaozhong@gmail.com</a>> napisał(a):<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr">The problem now is that I can not find anything for lines.<div><br></div><div>Anything like <span style="font-family:monospace">ST_IsPolygonCW|ST_</span><span style="font-family:monospace">IsPolygonCCW for lines for instance, something like </span><span style="font-family:monospace">ST_IsLineCW|ST_</span><span style="font-family:monospace">IsLineCCW.</span></div><div><span style="font-family:monospace"><br></span></div><div><font face="monospace">Regards,</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">David</font></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, 16 Feb 2022 at 19:43, Marcin Mionskowski <<a href="mailto:mionskowskimarcin@gmail.com" rel="noreferrer" target="_blank">mionskowskimarcin@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div style="font-family:monospace">Assuming simple polygons, composed from exterior ring only (i.e. no multipolygons), I think that you are looking for a function {ST_IsPolygonCW|ST_IsPolygonCCW}.</div><div style="font-family:monospace"><br></div><div style="font-family:monospace">Greetings,</div><div style="font-family:monospace">Marcin<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">śr., 16 lut 2022 o 19:55 Imre Samu <<a href="mailto:pella.samu@gmail.com" rel="noreferrer" target="_blank">pella.samu@gmail.com</a>> napisał(a):<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>> how vertices run?  clockwise or anti-clockwise?</div><div><br></div>maybe the:<div><a href="https://postgis.net/docs/ST_Angle.html" rel="noreferrer" target="_blank">https://postgis.net/docs/ST_Angle.html</a>  <i>"Computes the clockwise angle between two vectors."</i><br></div><div>or <a href="https://postgis.net/docs/ST_Azimuth.html" rel="noreferrer" target="_blank">https://postgis.net/docs/ST_Azimuth.html</a><br></div><div><br></div><div>regards,</div><div> Imre</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Shaozhong SHI <<a href="mailto:shishaozhong@gmail.com" rel="noreferrer" target="_blank">shishaozhong@gmail.com</a>> ezt írta (időpont: 2022. febr. 16., Sze, 17:06):<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Can we use PostGIS to find out how vertices run?  clockwise or anti-clockwise?</div><div dir="ltr"><br></div><div>Regards,</div><div><br></div><div>David</div></div>
_______________________________________________<br>
postgis-users mailing list<br>
<a href="mailto:postgis-users@lists.osgeo.org" rel="noreferrer" target="_blank">postgis-users@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/postgis-users" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/postgis-users</a><br>
</blockquote></div>
_______________________________________________<br>
postgis-users mailing list<br>
<a href="mailto:postgis-users@lists.osgeo.org" rel="noreferrer" target="_blank">postgis-users@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/postgis-users" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/postgis-users</a><br>
</blockquote></div>
_______________________________________________<br>
postgis-users mailing list<br>
<a href="mailto:postgis-users@lists.osgeo.org" rel="noreferrer" target="_blank">postgis-users@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/postgis-users" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/postgis-users</a><br>
</blockquote></div>
_______________________________________________<br>
postgis-users mailing list<br>
<a href="mailto:postgis-users@lists.osgeo.org" rel="noreferrer" target="_blank">postgis-users@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/postgis-users" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/postgis-users</a><br>
</blockquote></div>
_______________________________________________<br>
postgis-users mailing list<br>
<a href="mailto:postgis-users@lists.osgeo.org" rel="noreferrer" target="_blank">postgis-users@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/postgis-users" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/postgis-users</a><br>
</blockquote></div></div></div>
_______________________________________________<br>
postgis-users mailing list<br>
<a href="mailto:postgis-users@lists.osgeo.org" rel="noreferrer" target="_blank">postgis-users@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/postgis-users" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/postgis-users</a><br>
</blockquote></div>