7 votos

¿Cómo detectar duplicados y mantener sólo uno?

Tengo una tabla con un montón de puntos (200.000). Algunos de ellos son duplicados (no exactamente, pero por ejemplo, una estación de metro, dispone de ocho entradas) y quiero mantener sólo una de estas a las entradas del metro.

Yo soy capaz de identificar los duplicados con la siguiente instrucción (con desc_string = la Estación de Metro de Nombre):

--table of just duplicates
create table dups as 
select t1.* from ciss_poi as t1 join ciss_poi as t2
on st_dwithin(t1.geom,t2.geom,(0.5/111.111)) 
where t1.desc_string=t2.desc_string and t1.gid != t2.gid

Entonces yo esto: Metro duplicates

La imagen muestra a dos estaciones de metro, con un total de 16 puntos. Mi pregunta ahora es ¿cómo puedo mantener sólo un punto de cada estación de metro y eliminar a los demás? Tal vez la creación de las cajas de contorno alrededor de cada uno de los dobles, sería un indicio, pero no sé cómo hacerlo.

Cualquier ayuda bienvenida. Gracias por tu ayuda. Carsten

EDIT: tal vez esto podría de otra forma de solución: Tal vez una posibilidad es la de dibujar las cajas de contorno alrededor de los puntos donde este punto tienen el mismo nombre y que se encuentran en una distancia máxima de 500 metros el uno al otro. Supongo que se puede hacer con st_envelope , pero no sé cómo escribir la consulta SQL.

2voto

Free Wildebeest Puntos 1548

Después de meditar en ello todo el día, creo que están mucho más cerca de la respuesta que usted piensa.

Su consulta inicial mostró todos los puntos de coincidencia de una estación dentro de una cierta distancia, pero excluido el punto inicial. Esto también se excluyen todos los puntos sin que se repitan en las inmediaciones. Esto se hizo con el WHERE cláusula de t1.gid != t2.gid.

Supongamos que usted quita que de la cláusula where, y se añade la SELECT DISTINCT ON de notación, de la siguiente manera:

CREATE TABLE allunique AS  
SELECT DISTINCT ON (t1.desc_string) t1.*  
FROM ciss_poi AS t1  
JOIN ciss_poi AS t2  
 ON ST_Dwithin(t1.geom,t2.geom,(0.5/111.111))  
WHERE t1.desc_string=t2.desc_string  
ORDER BY t1.desc_string, t1.gid

Aquí está la ayuda de la cláusula DISTINCT: SELECT DISTINCT

Cuando se utiliza este con el ON adición, y el nombre del campo, de los grupos, por que el campo seleccionado y, a continuación, devuelve el primer registro. El registro que se devuelve puede ser controlada mediante el uso de la ORDER BY parámetro.

En este caso, si volvemos la de todo el conjunto de registros dentro de una cierta distancia, incluyendo el registro inicial, luego de la orden por la gid, debe devolver solo el uno de un grupo, pero también los registros individuales con nada en los alrededores.

1voto

GriffinHeart Puntos 187

He aquí una posibilidad, mediante un enfoque ligeramente diferente. Usted puede crear un convex hull alrededor de cada conjunto de "duplicados" y encontrar el centroide de entrar en un nuevo PDI de la tabla. Luego de la UNIÓN que consulta con todos los POI que NO están duplicados (no menos de 500 m de cualquier otro). Así:

CREATE TABLE poi_no_dups (gid INTEGER, desc_string text, ...);
SELECT AddGeometryColumn('poi_no_dups', 'geom',<your SRID>,'POINT',2);

INSERT INTO poi_no_dups (gid, desc_string, geom)
   SELECT t1.gid, t1.desc_string, ST_Centroid(ST_ConvexHull(ST_Collect(t1.geometry)))
    FROM ciss_poi AS t1 JOIN ciss_poi AS t2 
    ON ST_DWithin(t1.geom,t2.geom,(0.5/111.111)) 
    WHERE t1.desc_string=t2.desc_string and t1.gid != t2.gid
    LIMIT 1
    UNION
    SELECT t1.gid, t1.desc_string, t1.geometry
    FROM ciss_poi AS t1 JOIN ciss_poi AS t2 
    ON ST_DWithin(t1.geom,t2.geom,(0.5/111.111))=0 
    WHERE t1.desc_string != t2.desc_string and t1.gid != t2.gid
    ;

De esta manera, cuando usted tiene es decir, 4 entradas de una estación de metro, la mesa final contendrá el centroide de las entradas, en lugar de al azar una de las entradas.

He aquí una versión revisada de la respuesta, sin necesidad de la UNIÓN:

SELECT t1.desc_string, 
ST_Centroid(ST_ConvexHull(ST_Collect(t1.geom))) as geom2
FROM ciss_poi AS t1 
WHERE ST_Dwithin(t1.geom, geom2, (0.5/111.111))
GROUP BY t1.desc_string

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