[postgis-users] Finding all 'adjacent' points in a point set

Paul Ramsey pramsey at cleverelephant.ca
Thu Jul 29 15:29:41 PDT 2021


Why are you materializing the tables in a CTE? Do a direct self-join

SELECT 
p1.id as src,
p2.id as dest,
st_makeline(p1.geom,p2.geom) as geom,
FROM points p1, points p2
WHERE p1.id != p2.id  -- don't link a point to itself
and  ST_DWithin (p1.geom,p2.geom, 16 * 1.74 )  -- only link to nearest 6 points (spacing 16)
and p1.geom > p2.geom  -- only link in one direction

And have an index on points, of course. 

CREATE INDEX points_geom_x ON points USING GIST (geom);



> On Jul 29, 2021, at 3:25 PM, Bruce Rindahl <bruce.rindahl at gmail.com> wrote:
> 
> I have a table of points on a regular hexagon grid spacing.  I need to create an edge table between every point and the points in its adjacent hexagon. 
> Say the table is points with an id field and point geom.  I am trying :
> 
> WITH
> p1 as (select * from points),
> p2 as (select * from points)
> SELECT 
> p1.id as src,
> p2.id as dest,
> st_makeline(p1.geom,p2.geom) as geom,
> FROM p1, p2
> WHERE p1.id != p2.id  -- don't link a point to itself
> and  ST_dwithin (p1.geom,p2.geom, 16 * 1.74 )  -- only link to nearest 6 points (spacing 16)
> and p1.geom > p2.geom  -- only link in one direction
> 
> This works fine but gets really slow with lots of points.  Is there a better way of attacking this problem?
> 
> Thanks
> _______________________________________________
> postgis-users mailing list
> postgis-users at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/postgis-users



More information about the postgis-users mailing list