<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: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=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Monaco;
        panose-1:0 0 0 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        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;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></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'>Steve,<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'>Haven't had a chance to look thru what you have here and test it out myself. <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'>The issue I flagged in the ticket was fixed in PostgreSQL 9.5 code base upstream:<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'><a href="http://www.postgresql.org/message-id/55630D9D.3090508@iki.fi">http://www.postgresql.org/message-id/55630D9D.3090508@iki.fi</a><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'>It's my understanding that you should never get that notice again.  So I'm a bit concerned you are.  It's possible you found another area where this issue arises and is not handled.<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'>Are you running PostgreSQL 9.5RC1 and latest PostGIS 2.2 branch (or 2.2.0?).<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'>Thanks,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'>Regina<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 style='margin-left:.5in'><b><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'>From:</span></b><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'> postgis-devel [mailto:postgis-devel-bounces@lists.osgeo.org] <b>On Behalf Of </b>Stephen Mather<br><b>Sent:</b> Sunday, January 03, 2016 1:56 AM<br><b>To:</b> PostGIS Development Discussion <postgis-devel@lists.osgeo.org><br><b>Subject:</b> [postgis-devel] KNN and 9.5<o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p><div><div><p class=MsoNormal style='margin-left:.5in'>Hi All,<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>Short version:<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>Does Regina's comment on <a href="http://trac.osgeo.org/postgis/ticket/2703">http://trac.osgeo.org/postgis/ticket/2703</a> regarding <span style='font-size:10.0pt;color:black;background:#F7F7F7'>ERROR: index returned tuples in wrong order</span> apply to any uses of indices in conjunction with KNN?<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>Long version:<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>Digging many of the 2.2 / 9.5 updates. Having fun on break playing with skeleton simplification and using KNN in the process. Yes. For those of you who know me, this is an obsession that won't die quietly.<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><a href="https://smathermather.files.wordpress.com/2016/01/screen-shot-2016-01-03-at-1-19-26-am.png">https://smathermather.files.wordpress.com/2016/01/screen-shot-2016-01-03-at-1-19-26-am.png</a><o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>I've got a function that does my KNN in the usual style, finds the nearest 2 points, and makes a line from them:<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><div><p class=MsoNormal style='margin-left:.5in'>CREATE OR REPLACE FUNCTION zz_knn_wonderful_points (geometry) RETURNS geometry AS $$<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>-- Here are my wonderful points to KNN search:<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>WITH index_query AS (<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>            SELECT edge.geom AS geom<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>            FROM (SELECT * FROM regions_dpoints WHERE gid = 882) AS edge<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>-- This is my query point<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>            ORDER BY $1<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>                        <-><o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>            edge.geom LIMIT 2<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>            )<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>SELECT ST_MakeLine(geom) FROM index_query<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>$$ LANGUAGE SQL;<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>The intent is to implement angle values as an importance criterion for simplifying the skeleton as described at minute 2:20 in Balint Miklos video on the scale axis transform: <a href="http://balintmiklos.com/scale-axis/The_Scale_Axis_Picture_Show.mp4">http://balintmiklos.com/scale-axis/The_Scale_Axis_Picture_Show.mp4</a><o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>Actually, in the final function, I will likely directly calculate the angle and return that instead of the geometry, but I digress.<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>Regardless, when I use this function as is, it works great in drawing lines connecting the two nearest points to the vertex in the medial axis:<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>DROP TABLE IF EXISTS test CASCADE;<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>CREATE TABLE test AS<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>WITH returnline AS (<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>            SELECT oid, gid,<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>                        ST_Union(<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>                        ST_MakeLine( ST_StartPoint(zz_knn_wonderful_points(subset.geom)), subset.geom),<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>                        ST_MakeLine( ST_EndPoint(zz_knn_wonderful_points(subset.geom)), subset.geom)<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>                        )<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>                        AS geom FROM<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>                        (SELECT * FROM regions_points WHERE oid = 882) subset<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>)<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>SELECT * FROM returnline<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>;<o:p></o:p></p></div></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>However, as implemented, this will not work in the case of overlapping geometries, such as Natural Earth's label polygon dataset "ne_10m_geography_regions_polys":<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><a href="https://smathermather.files.wordpress.com/2016/01/screen-shot-2016-01-03-at-1-33-01-am.png">https://smathermather.files.wordpress.com/2016/01/screen-shot-2016-01-03-at-1-33-01-am.png</a><o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>And so I add a constraint using an integer ID:<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><div><p class=MsoNormal style='margin-left:.5in'>CREATE OR REPLACE FUNCTION zz_knn(integer,geometry) RETURNS geometry AS $$<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>-- Here are my wonderful points to KNN search:<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>WITH index_query AS (<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>            SELECT edge.geom AS geom<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>            FROM (SELECT * FROM regions_dpoints WHERE gid = $1) AS edge<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>-- This is my query point<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>            ORDER BY $2<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>                        <-><o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>            edge.geom LIMIT 2<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>            )<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>SELECT ST_MakeLine(geom) FROM index_query<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>$$ LANGUAGE SQL;<o:p></o:p></p></div></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>And now it takes much longer and fails with <o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>"<o:p></o:p></p></div><div><p style='mso-margin-top-alt:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;margin-bottom:.0001pt'><span style='font-size:9.0pt;font-family:"Monaco",serif'>ERROR:  index returned tuples in wrong order<o:p></o:p></span></p><p style='mso-margin-top-alt:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;margin-bottom:.0001pt'><span style='font-size:9.0pt;font-family:"Monaco",serif'>CONTEXT:  SQL function "zz_knn" statement 1<o:p></o:p></span></p><p style='mso-margin-top-alt:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;margin-bottom:.0001pt'><span style='font-size:9.0pt;font-family:"Monaco",serif'>********** Error **********<o:p></o:p></span></p><p style='mso-margin-top-alt:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;margin-bottom:.0001pt;min-height:16px'><span style='font-size:9.0pt;font-family:"Monaco",serif'><o:p> </o:p></span></p><p style='mso-margin-top-alt:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;margin-bottom:.0001pt'><span style='font-size:9.0pt;font-family:"Monaco",serif'>ERROR: index returned tuples in wrong order<o:p></o:p></span></p><p style='mso-margin-top-alt:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;margin-bottom:.0001pt'><span style='font-size:9.0pt;font-family:"Monaco",serif'>SQL state: XX000<o:p></o:p></span></p><p style='mso-margin-top-alt:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;margin-bottom:.0001pt'><span style='font-size:9.0pt;font-family:"Monaco",serif'>Context: SQL function "zz_knn" statement 1<o:p></o:p></span></p><p style='mso-margin-top-alt:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;margin-bottom:.0001pt;min-height:16px'><span style='font-size:9.0pt;font-family:"Monaco",serif'>"<o:p></o:p></span></p></div><div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>Thanks!<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>Cheers,<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>Best,<o:p></o:p></p></div><div><p class=MsoNormal style='margin-left:.5in'>Steve Mather<o:p></o:p></p></div></div></div></body></html>