7 votos

¿Cómo puedo clúster de todos los puntos en una tabla postgis conjunto en función de su distancia uno de otro?

Tengo un PostGIS (en postgres 9.3) mesa que tiene Puntos. Quiero averiguar los "clusters" en los datos. Si 2 puntos de < X distancia, deben agregarse a un grupo, y esto se debe hacer de forma recursiva. En esencia, un clúster es un subconjunto de los puntos, donde cada punto es que dentro de X distancia de al menos un punto en el clúster.

Sin embargo no puedo pensar en ninguna forma de hacerlo con un PostgreSQL consulta. Hay ninguna consulta para hacer esto, o tengo que escribir un programa que externamente la consulta de datos, y fortalecimiento de los clusters, y continuar a consulta en busca de quién sabe cuántos pasos?

6voto

mataap Puntos 121

Si usted puede updgrade a postgis 2.2.0 podría ser la suerte debido a que la función ha sido introducida. A partir de la doc: "ST_ClusterWithin es una función de agregado que devuelve una matriz de GeometryCollections, donde cada GeometryCollection representa un conjunto de geometrías separados por no más de la distancia especificada."

Marque esta: http://postgis.net/docs/manual-2.2/ST_ClusterWithin.html

5voto

Dave Puntos 319

Esta técnica funcionará en las versiones de PostGIS < 2.2.0. Crear clúster polígonos de amortiguación de los puntos por la mitad de su clúster de distancia, asignar un ID de clúster, a continuación, transferir el ID de clúster a los puntos de los polígonos se cruzan:

--Buffer all points by the half the cluster distance (in this case 40 metres),
--merge into a multipolygon using st_union(), 
--then separate into single parts with st_dump() and .geom

create table clusterpolys1 as
select (st_dump(st_union(st_buffer(geom, 40)))).geom from points1;

--Add a unique cluster ID to the cluster polygons
alter table clusterpolys1 add column cluster_id serial;

--Transfer the cluster ID to the points
alter table points1 add column cluster_id integer;

update points1 a
set cluster_id = b.cluster_id
from  clusterpolys1 b
where st_intersects(a.geom, b.geom);

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X