Este es mi enfoque,
Se denomina "agrupación del buffer a la distancia requerida"
(no te alejes de los peces de la manada a la distancia especificada, y entonces te comeremos :-)),
Consta de 6 puntos, nadando...
Los datos de origen mostrados en la figura 1
Se trata de polígonos de tipo poligonal. Las restricciones, el ejemplo, se muestran sin la semántica del objeto, para que pueda guardarlo usted mismo.
1) Cree un búfer que equivalga a casi la mitad de la distancia requerida, por ejemplo 501 m:
create table polygons_byf as SELECT ((ST_Buffer(geography(geom),501))::geometry) as geom FROM polygons;
2) Polígono disolvente:
create table polygons_byf_dump as select st_buffer( (st_dump( st_union( st_buffer(geom, 0.0000000001)))).geom, -0.0000000001) as geom FROM polygons_byf;
(John Powell :-)...)
ver figura 2
3) Crear el punto mediano al polígono original:
create table polygons_byf_centr as SELECT ST_PointOnSurface(geom) as geom FROM polygons;
ver figura 3
4) Cuente el número de puntos que caen en los polígonos combinados:
create table polygons_pt_count as SELECT b.geom, count (*) as cnt FROM polygons_byf_centr a, polygons_byf_dump b WHERE st_intersects(a.geom, b.geom) GROUP BY b.geom ORDER BY b.geom;
ver figura 4
5) Eliminar los polígonos que sólo tienen un punto:
DELETE from polygons_pt_count WHERE cnt = '1';
ver figura 5
6) Seleccionar sólo los polígonos que cumplen nuestra condición:
create table polygons_sel as SELECT ST_Intersection(a.geom, b.geom) as geom FROM polygons_pt_count a, polygons as b WHERE ST_Intersects (a.geom, b.geom)
ver figura 6
7) Eso es todo, este es nuestro resultado.