Eliminar duplicados de Spatialite

9

Tengo una base de datos Spatialite con puntos. De vez en cuando ahora se agregan puntos. ¿Cuál sería la forma más fácil de eliminar duplicados en función de las coordenadas?

johannes
fuente

Respuestas:

7

Unir automáticamente la tabla le permitiría encontrar filas duplicadas. Algo así debería funcionar:

DELETE t1
FROM mytable t1, mytable t2
WHERE t1.the_geom = t2.the_geom

si puntos:

DELETE t1
FROM mytable t1, mytable t2
WHERE t1.x = t2.x
AND t1.y > t2.y

(no probado .....)

simo
fuente
2
Gracias a que me llevó en la dirección correcta, lo resolví con: DELETE FROM mytable2 WHERE geom IN (SELECT geom FROM mytable1);
johannes
8

Creo que lo más fácil es nunca dejar entrar el duplicado. Agregar una restricción única en el campo de geometría. No sé cómo funcionará eso en spaceiallite, pero en postgis la restricción compararía los cuadros delimitadores que sumergirán el efecto deseado en el caso de los puntos.

si no importa cuál de los duplicados eliminar, puede crear una consulta que elimine todas las filas con una identificación que no se encuentra en una subconsulta que selecciona las geometrías distintas. lo mismo aquí, seguro con puntos pero no con otros tipos, ya que solo se comparará el bbox, no la geometría real (si funciona de la misma manera que postgis).

/ Nicklas

Nicklas Avén
fuente
Gracias por su respuesta, me gusta la idea con restricciones.
johannes
0

En mi caso, la forma más eficiente es usar el índice espacial de la capa. Con esta consulta, mantengo solo 1 geometría para cada entidad superpuesta. He realizado la prueba con un TIN convertido en Cadena de líneas.

   delete from tin_line_sp where ogc_fid not in ( 

   select min(s1.rowid) as id_to_keep from
   idx_tin_line_sp_geometry as s1,
   idx_tin_line_sp_geometry as s2

   where 
       s1.xmin = s2.xmin and 
       s1.xmax = s2.xmax and 
       s1.ymin = s2.ymin and 
       s1.ymax = s2.ymax

   group by s1.xmin,s1.xmax,s1.ymin,s1.ymax)

Para comprender correctamente los índices espaciales, aquí hay dos consultas para convertir el índice espacial en polígonos.

    create table tin_line_sp_representation as 
    select PolygonFromText('POLYGON(('||
    xmin || ' ' || ymin || ',' ||
    xmax || ' ' || ymin || ',' || 
    xmax || ' ' || ymax || ',' || 
    xmin || ' ' || ymax || ',' || 
    xmin || ' ' || ymin || '))',25832) as geometry
    from idx_tin_line_sp_geometry;

En caso de éxito, recupere la columna de geometría para poder visualizar en su visor favorito:

    select RecoverGeometryColumn( 'tin_line_sp_representation','geometry', 25832 , 'POLYGON', 2 )
PEL
fuente