[prev in list] [next in list] [prev in thread] [next in thread] 

List:       postgis-users
Subject:    Re: [postgis-users] duplicated nodes
From:       "=?iso-8859-1?Q?Olivier_Lepr=EAtre?=" <o.lepretre () gmail ! com>
Date:       2017-08-03 14:46:30
Message-ID: 001d01d30c67$4d162ca0$e74285e0$ () noetika ! com
[Download RAW message or body]

This is a multipart message in MIME format.

[Attachment #2 (multipart/related)]
This is a multipart message in MIME format.

[Attachment #4 (multipart/alternative)]


Thanks for this helpful precision/explanation. This function needs to be
known, a bit harsh to understand but many applications for geomatics…

 

Olivier

 

De : postgis-users [mailto:postgis-users-bounces@lists.osgeo.org] De la part
de Regina Obe
Envoyé : jeudi 3 août 2017 15:28
À : 'PostGIS Users Discussion' <postgis-users@lists.osgeo.org>
Objet : Re: [postgis-users] duplicated nodes

 

Ah great.  Sorry about forgetting about the over on that one. Glad you
figured it out.

 

BTW in new docs, I cut in a picture so it's hopeful a bit clearer to folks
what it does.  I've got to clean up the formatting a bit.

 

http://postgis.net/docs/manual-dev/ST_ClusterDBSCAN.html

 

 

Thanks,

Regina

http://postgis.us

 

 

From: postgis-users [mailto:postgis-users-bounces@lists.osgeo.org] On Behalf
Of Olivier Leprêtre
Sent: Thursday, August 03, 2017 4:07 AM
To: 'PostGIS Users Discussion' <postgis-users@lists.osgeo.org
<mailto:postgis-users@lists.osgeo.org> >
Subject: Re: [postgis-users] duplicated nodes

 

Thanks very much Regina, it’s exactly what I searched for, it solved me two
problems : false positives and  groups display.

 

Typo : I just added ‘over()’  after ST_ClusterDBSCAN

 

Olivier

 

De : postgis-users [mailto:postgis-users-bounces@lists.osgeo.org] De la part
de Regina Obe
Envoyé : mercredi 2 août 2017 23:15
À : 'PostGIS Users Discussion' <postgis-users@lists.osgeo.org
<mailto:postgis-users@lists.osgeo.org> >
Objet : Re: [postgis-users] duplicated nodes

 

If you are running PostGIS 2.3 or above, I think ST_ClusterDBSCAN might do
the trick for you:

 

http://postgis.net/docs/manual-2.3/ST_ClusterDBSCAN.html

 

You can set distance to 0 and minpoints to 2.  All points that are not 0
distance from any other point will have NULL in the bucket column.

All other ones that have bucket numbers are duplicated.

 

So:

 

SELECT n.code, n.geom, ST_ClusterDBSCAN(n.geom, 0,2) AS bucket

FROM nodes 

 

 

If you want the counts instead of the bucket, you can do

 

SELECT o.code, o.geom, COUNT(*) OVER(PARTITION BY bucket)  AS npoints,
bucket

FROM (SELECT n.code, n.geom, ST_ClusterDBSCAN(n.geom, 0,2) AS bucket

FROM nodes  ) AS o

WHERE bucket IS NOT NULL;

 

 

I didn't test so I might have a typo.

 

Hope that helps,

Regina

 

From: postgis-users [mailto:postgis-users-bounces@lists.osgeo.org] On Behalf
Of Olivier Leprêtre
Sent: Wednesday, August 02, 2017 3:28 PM
To: postgis-users@lists.osgeo.org <mailto:postgis-users@lists.osgeo.org> 
Subject: [postgis-users] duplicated nodes

 

Hi,

 

I have a point layer that contains several superposed nodes two, three times
or more. I would like to display each group list and the number of item in
each. I found this query which “works” but returns some false positive

 

select case when lag(o.geom) OVER (PARTITION BY o.geom) = o.geom then ''
else 'x ' || o.nbre::text end,d.code from

(select geom,count(*) as nbre from nodes group by geom having count(*) >1)
as o,

lateral (select * from nodes) as d where st_within(o.geom,d.geom)

 

I understand that false positives (yellow beneath) comes  from “group by
geom” which use a bounding box and catch close but not duplicated points.

 



 

I tried other solutions which all get too complicated with several “join of
join”. I would appreciate if someone has an idea on the top of his/her head
!

 

Thanks

 

Olivier

 


[Attachment #7 (text/html)]

<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=iso-8859-1"><meta name=Generator content="Microsoft Word \
15 (filtered medium)"><!--[if !mso]><style>v\:* {behavior:url(#default#VML);} o\:* \
{behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0cm;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:#0563C1;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:#954F72;
	text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
	{mso-style-name:msonormal;
	mso-margin-top-alt:auto;
	margin-right:0cm;
	mso-margin-bottom-alt:auto;
	margin-left:0cm;
	font-size:11.0pt;
	font-family:"Calibri",sans-serif;}
span.EmailStyle18
	{mso-style-type:personal;
	font-family:"Calibri",sans-serif;
	color:windowtext;}
span.EmailStyle19
	{mso-style-type:personal;
	font-family:"Calibri",sans-serif;
	color:#1F497D;}
span.EmailStyle20
	{mso-style-type:personal;
	font-family:"Calibri",sans-serif;
	color:windowtext;}
span.EmailStyle21
	{mso-style-type:personal;
	font-family:"Calibri",sans-serif;
	color:#1F497D;}
span.EmailStyle22
	{mso-style-type:personal-reply;
	font-family:"Calibri",sans-serif;
	color:windowtext;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-size:10.0pt;}
@page WordSection1
	{size:612.0pt 792.0pt;
	margin:70.85pt 70.85pt 70.85pt 70.85pt;}
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=FR link="#0563C1" \
vlink="#954F72"><div class=WordSection1><p class=MsoNormal><span lang=EN-GB \
style='mso-fareast-language:EN-US'>Thanks for this helpful precision/explanation. \
This function needs to be known, a bit harsh to understand but many applications for \
geomatics&#8230;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB \
style='mso-fareast-language:EN-US'><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal><span lang=EN-GB \
style='mso-fareast-language:EN-US'>Olivier<o:p></o:p></span></p><p \
class=MsoNormal><span lang=EN-GB \
style='mso-fareast-language:EN-US'><o:p>&nbsp;</o:p></span></p><div><div \
style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p \
class=MsoNormal><b>De&nbsp;:</b> postgis-users \
[mailto:postgis-users-bounces@lists.osgeo.org] <b>De la part de</b> Regina \
Obe<br><b>Envoyé&nbsp;:</b> jeudi 3 août 2017 15:28<br><b>À&nbsp;:</b> 'PostGIS Users \
Discussion' &lt;postgis-users@lists.osgeo.org&gt;<br><b>Objet&nbsp;:</b> Re: \
[postgis-users] duplicated nodes<o:p></o:p></p></div></div><p \
class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal><span lang=EN-US \
style='color:#1F497D'>Ah great.&nbsp; Sorry about forgetting about the over on that \
one. Glad you figured it out.<o:p></o:p></span></p><p class=MsoNormal><span \
lang=EN-US style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span \
lang=EN-US style='color:#1F497D'>BTW in new docs, I cut in a picture so it's hopeful \
a bit clearer to folks what it does.&nbsp; I've got to clean up the formatting a \
bit.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US \
style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US \
style='color:#1F497D'><a \
href="http://postgis.net/docs/manual-dev/ST_ClusterDBSCAN.html">http://postgis.net/docs/manual-dev/ST_ClusterDBSCAN.html</a><o:p></o:p></span></p><p \
class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal><span lang=EN-US \
style='color:#1F497D'>Thanks,<o:p></o:p></span></p><p class=MsoNormal><span \
lang=EN-US style='color:#1F497D'>Regina<o:p></o:p></span></p><p class=MsoNormal><span \
lang=EN-US style='color:#1F497D'><a \
href="http://postgis.us">http://postgis.us</a><o:p></o:p></span></p><p \
class=MsoNormal><span lang=EN-US style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal><span lang=EN-US \
style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><div><div \
style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p \
class=MsoNormal style='margin-left:36.0pt'><b><span lang=EN-US>From:</span></b><span \
lang=EN-US> postgis-users [<a \
href="mailto:postgis-users-bounces@lists.osgeo.org">mailto:postgis-users-bounces@lists.osgeo.org</a>] \
<b>On Behalf Of </b>Olivier Leprêtre<br><b>Sent:</b> Thursday, August 03, 2017 4:07 \
AM<br><b>To:</b> 'PostGIS Users Discussion' &lt;<a \
href="mailto:postgis-users@lists.osgeo.org">postgis-users@lists.osgeo.org</a>&gt;<br><b>Subject:</b> \
Re: [postgis-users] duplicated nodes<o:p></o:p></span></p></div></div><p \
class=MsoNormal style='margin-left:36.0pt'><span \
lang=EN-US><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-GB>Thanks very much Regina, it&#8217;s \
exactly what I searched for, it solved me two problems : false positives and \
&nbsp;groups display.<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-GB><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal style='margin-left:36.0pt'><span lang=EN-GB>Typo : I just added \
&#8216;over()&#8217; &nbsp;after ST_ClusterDBSCAN<o:p></o:p></span></p><p \
class=MsoNormal style='margin-left:36.0pt'><span \
lang=EN-GB><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-GB>Olivier<o:p></o:p></span></p><p \
class=MsoNormal style='margin-left:36.0pt'><span \
lang=EN-GB><o:p>&nbsp;</o:p></span></p><div><div style='border:none;border-top:solid \
#E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal \
style='margin-left:36.0pt'><b>De&nbsp;:</b> postgis-users [<a \
href="mailto:postgis-users-bounces@lists.osgeo.org">mailto:postgis-users-bounces@lists.osgeo.org</a>] \
<b>De la part de</b> Regina Obe<br><b>Envoyé&nbsp;:</b> mercredi 2 août 2017 \
23:15<br><b>À&nbsp;:</b> 'PostGIS Users Discussion' &lt;<a \
href="mailto:postgis-users@lists.osgeo.org">postgis-users@lists.osgeo.org</a>&gt;<br><b>Objet&nbsp;:</b> \
Re: [postgis-users] duplicated nodes<o:p></o:p></p></div></div><p class=MsoNormal \
style='margin-left:36.0pt'><o:p>&nbsp;</o:p></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US style='color:#1F497D'>If you are running \
PostGIS 2.3 or above, I think ST_ClusterDBSCAN might do the trick for \
you:<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span \
lang=EN-US style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US style='color:#1F497D'><a \
href="http://postgis.net/docs/manual-2.3/ST_ClusterDBSCAN.html">http://postgis.net/docs/manual-2.3/ST_ClusterDBSCAN.html</a><o:p></o:p></span></p><p \
class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US \
style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US style='color:#1F497D'>You can set \
distance to 0 and minpoints to 2.&nbsp; All points that are not 0 distance from any \
other point will have NULL in the bucket column.<o:p></o:p></span></p><p \
class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US style='color:#1F497D'>All \
other ones that have bucket numbers are duplicated.<o:p></o:p></span></p><p \
class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US \
style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US \
style='color:#1F497D'>So:<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US \
style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US style='color:#1F497D'>SELECT n.code, \
n.geom, ST_ClusterDBSCAN(n.geom, 0,2) AS bucket<o:p></o:p></span></p><p \
class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US \
style='color:#1F497D'>FROM nodes <o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US \
style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US \
style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US style='color:#1F497D'>If you want the \
counts instead of the bucket, you can do<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US \
style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US style='color:#1F497D'>SELECT o.code, \
o.geom, COUNT(*) OVER(PARTITION BY bucket) &nbsp;AS npoints, \
bucket<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span \
lang=EN-US style='color:#1F497D'>FROM (SELECT n.code, n.geom, \
ST_ClusterDBSCAN(n.geom, 0,2) AS bucket<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US style='color:#1F497D'>FROM nodes &nbsp;) \
AS o<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span \
lang=EN-US style='color:#1F497D'>WHERE bucket IS NOT NULL;<o:p></o:p></span></p><p \
class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US \
style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US \
style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US style='color:#1F497D'>I didn't test so I \
might have a typo.<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US \
style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US style='color:#1F497D'>Hope that \
helps,<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span \
lang=EN-US style='color:#1F497D'>Regina<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:36.0pt'><span lang=EN-US \
style='color:#1F497D'><o:p>&nbsp;</o:p></span></p><div><div \
style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p \
class=MsoNormal style='margin-left:72.0pt'><b><span lang=EN-US>From:</span></b><span \
lang=EN-US> postgis-users [<a \
href="mailto:postgis-users-bounces@lists.osgeo.org">mailto:postgis-users-bounces@lists.osgeo.org</a>] \
<b>On Behalf Of </b>Olivier Leprêtre<br><b>Sent:</b> Wednesday, August 02, 2017 3:28 \
PM<br><b>To:</b> <a href="mailto:postgis-users@lists.osgeo.org">postgis-users@lists.osgeo.org</a><br><b>Subject:</b> \
[postgis-users] duplicated nodes<o:p></o:p></span></p></div></div><p class=MsoNormal \
style='margin-left:72.0pt'><span lang=EN-US><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal style='margin-left:72.0pt'>Hi,<o:p></o:p></p><p class=MsoNormal \
style='margin-left:72.0pt'><o:p>&nbsp;</o:p></p><p class=MsoNormal \
style='margin-left:72.0pt'><span lang=EN-GB>I have a point layer that contains \
several superposed nodes two, three times or more. I would like to display each group \
list and the number of item in each. I found this query which &#8220;works&#8221; but \
returns some false positive<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:72.0pt'><span lang=EN-GB><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal style='margin-left:72.0pt'><span lang=EN-GB>select case when \
lag(o.geom) OVER (PARTITION BY o.geom) = o.geom then '' else 'x ' || o.nbre::text \
end,d.code from<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:72.0pt'><span lang=EN-GB>(select geom,count(*) as nbre from nodes \
group by geom having count(*) &gt;1) as o,<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:72.0pt'><span lang=EN-GB>lateral (select * from nodes) as d where \
st_within(o.geom,d.geom)<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:72.0pt'><span lang=EN-GB><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal style='margin-left:72.0pt'><span lang=EN-GB>I understand that false \
positives (yellow beneath) comes &nbsp;from &#8220;group by geom&#8221; which use a \
bounding box and catch close but not duplicated points.<o:p></o:p></span></p><p \
class=MsoNormal style='margin-left:72.0pt'><span \
lang=EN-GB><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:72.0pt'><img border=0 width=90 height=191 \
style='width:.9416in;height:1.9916in' id="Image_x0020_1" \
src="cid:image001.jpg@01D30C78.0439C4E0" \
alt="cid:image001.jpg@01D30C78.0439C4E0"><span lang=EN-GB><o:p></o:p></span></p><p \
class=MsoNormal style='margin-left:72.0pt'><span \
lang=EN-GB><o:p>&nbsp;</o:p></span></p><p class=MsoNormal \
style='margin-left:72.0pt'><span lang=EN-GB>I tried other solutions which all get too \
complicated with several &#8220;join of join&#8221;. I would appreciate if someone \
has an idea on the top of his/her head !<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:72.0pt'><span lang=EN-GB><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal style='margin-left:72.0pt'><span \
lang=EN-GB>Thanks<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:72.0pt'><span lang=EN-GB><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal style='margin-left:72.0pt'><span \
lang=EN-GB>Olivier<o:p></o:p></span></p><p class=MsoNormal \
style='margin-left:72.0pt'><span \
lang=EN-GB><o:p>&nbsp;</o:p></span></p></div></body></html>


["image001.jpg" (image/jpeg)]
[Attachment #9 (text/plain)]

_______________________________________________
postgis-users mailing list
postgis-users@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/postgis-users

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic