<div dir="ltr"><div class="gmail_default" style="font-family:monospace">Dear List,</div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>I ran across two issues with CurvePolygons today:</span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><br></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>1. <span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>"The last vertex problem" - r</span></span></span></span></span></span></span></span></span></span></span></span>esult of <span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>ST_CurveToLine conversion is missing the "last" vertex:<br></span></span></span></span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><br></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>with<br>p as (select ST_SetSRID(ST_MakePoint(500000,600000),2180) geom)<span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span> --just a point</span></span></span></span></span></span><br>, b as (select st_buffer(geom,10,2) geom from p) --simple buffer<br>, c as (select ST_LineToCurve(geom) geom from b) --conversion to CurvePolygon with expected result: SRID=2180;CURVEPOLYGON (CIRCULARSTRING (500010.0 600000.0, 499990.0 600000.0, 500010.0 600000.0))<br>select ST_CurveToLine(c.geom,2) <br>from c</span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><br></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b gmail-C1N51c"><span>The result looks like this:</span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><br></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><img src="cid:ii_kvtmom0v0" alt="curve2line.png" width="108" height="105"><br><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>WKT: POLYGON ((500010 600000, 500007.07106781186 
600007.0710678119, 500000 600010, 499992.92893218814 600007.0710678119, 
499990 600000, 499992.92893218814 599992.9289321881, 500000 599990, 
500010 600000))</span></span></span></span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>Clearly the last "high precission" coordinate pair is missing.</span></span></span></span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>The buffer distance and number of segments in quadrant in <span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>line2curve</span></span></span></span></span></span></span></span></span></span></span></span> conversion does not matter, at least in my testing.</span></span></span></span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>The tolerance (number of segments) in curve2line conversion on the other hand matters - in range from 2 to 1000 for 35 tolerances the result is "correct":{61,122,197,244,343,345,355,359,375,379,393,394,473,487,488,686,690,693,699,701,710,711,718,733,750,758,786,788,795,801,946,965,974,976,999}</span></span></span></span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>They can be selected with following query:</span></span></span></span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b gmail-C1N51c"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b gmail-C1N51c"><span>with<br>p as (select ST_SetSRID(ST_MakePoint(500000,600000),2180) geom) --just a point<br>, b as (select st_buffer(geom,10,2) geom from p) --simple buffer<br>, c as (select ST_LineToCurve(geom) geom from b) --conversion to CurvePolygon with expected result: SRID=2180;CURVEPOLYGON (CIRCULARSTRING (500010.0 600000.0, 499990.0 600000.0, 500010.0 600000.0))<br>select array_agg(gs)--,ST_NPoints(ST_CurveToLine(c.geom,gs)) np<br>from c<br> ,generate_series(2,1000) gs<br>where gs*4-ST_NPoints(ST_CurveToLine(c.geom,gs))=-1</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b gmail-C1N51c"><span><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><br></span></span></span></span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><br></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>2. "Equality problem" - CurvePolygons generated from the same distance buffers of a single point (differing only in number of segments in quadrants) are not the same:<br></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><br></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>with<br>p as (select ST_SetSRID(ST_MakePoint(500000,600000),2180) geom) --just a point<br>, b as (select gs,st_buffer(geom,10,gs) geom from p,generate_series(2,1000) gs) --some buffers around the point (only the number of segments per quadrant differs)<br>, c as (select gs,ST_LineToCurve(geom) geom from b) --conversion to curvepolygons<br>select array_agg(gs order by gs),geom --grouping by curvepolygon geometry to check equality<br>from c <br></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>group by geom <br></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>order by 1;</span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><br></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>The larger the buffer, the more homogeneous the results</span></span></span> - with </span></span></span></span></span></span>1 m buffer I'm getting 948 distinct (in WKT terms) CurvePolygons, with 100 m buffer there are only 2 different results.</div><div class="gmail_default" style="font-family:monospace"><br></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><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><br></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>So... <span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>Are what I have described bugs or is it supposed to work this way?</span></span></span></span></span></span></span></span></span></div><div class="gmail_default" style="font-family:monospace"><span class="gmail-VIiyi" lang="en"><span class="gmail-JLqJ4b gmail-ChMk0b"><span>My PG versions:<br></span></span></span></div><div class="gmail_default" style="font-family:monospace">PostgreSQL 13.4 (Ubuntu 13.4-4.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit</div><div class="gmail_default" style="font-family:monospace">POSTGIS="3.1.4 ded6c34" [EXTENSION] PGSQL="130" GEOS="3.8.0-CAPI-1.13.1 " PROJ="6.3.1" LIBXML="2.9.10" LIBJSON="0.13.1" LIBPROTOBUF="1.3.3" WAGYU="0.5.0 (Internal)" (core procs from "3.1.1 aaf4c79" need upgrade)</div><div class="gmail_default" style="font-family:monospace"><br></div><div class="gmail_default" style="font-family:monospace">Regards,</div><div class="gmail_default" style="font-family:monospace">Marcin<br></div></div>