Rimuovi i duplicati da Spatialite


9

Ho un database Spatialite con punti. Di tanto in tanto ora vengono aggiunti punti. Quale sarebbe il modo più semplice per rimuovere i duplicati in base alle coordinate?

Risposte:


7

Unire automaticamente la tabella consentirebbe di trovare righe duplicate. Qualcosa del genere dovrebbe funzionare:

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

se punti:

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

(non testato .....)


2
Grazie a che mi ha portato nella giusta direzione, l'ho risolto con: ELIMINA DA mytable2 DOVE geom IN (SELEZIONA geom DA mytable1);
johannes,

8

Penso che il più semplice sia non permettere mai al duplicato di entrare. Aggiungere un vincolo unico nel campo della geometria. Non so come funzionerà in spatiallite ma in postgis il costrutto confronterebbe le scatole di delimitazione che immergeranno l'effetto desiderato nel caso di punti.

se non importa quale dei duplicati rimuovere, è possibile creare una query che elimina tutte le righe con ID che non si trova in una sottoquery che seleziona le geometrie distinte. lo stesso qui, sicuro con i punti ma non altri tipi poiché solo la bbox verrà confrontata non con la geometria effettiva (se funziona allo stesso modo dei postgis).

/ Nicklas


Grazie per la tua risposta, mi piace l'idea con vincoli.
johannes,


0

Nel mio caso il modo più efficiente è usare l'indice spaziale dal livello. Con questa query, mantengo solo 1 geometria per ogni funzione sovrapposta. Ho fatto il test con una TIN convertita in Linestring.

   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)

Per comprendere correttamente gli indici spaziali, qui due query per convertire l'indice spaziale in poligoni.

    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;

In caso di successo, ripristina la colonna Geometria per poter visualizzare nel tuo visualizzatore preferito:

    select RecoverGeometryColumn( 'tin_line_sp_representation','geometry', 25832 , 'POLYGON', 2 )
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.