Entfernen Sie Duplikate von Spatialite

9

Ich habe eine Spatialite-Datenbank mit Punkten. Von Zeit zu Zeit werden jetzt Punkte hinzugefügt. Was wäre der einfachste Weg, um Duplikate basierend auf den Koordinaten zu entfernen?

johannes
quelle

Antworten:

7

Durch das automatische Verknüpfen der Tabelle können Sie doppelte Zeilen finden. So etwas sollte funktionieren:

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

wenn Punkte:

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

(nicht getestet .....)

simo
quelle
2
Dank a, das mich in die richtige Richtung gebracht hat, habe ich es gelöst mit: DELETE FROM mytable2 WHERE geom IN (SELECT geom FROM mytable1);
Johannes
8

Ich denke, es ist am einfachsten, das Duplikat niemals einzulassen. Fügen Sie dem Geometriefeld eine eindeutige Einschränkung hinzu. Ich weiß nicht, wie das bei Spatiallit funktionieren wird, aber bei Postgis würde die Einschränkung die Begrenzungsrahmen vergleichen, die bei Punkten den gewünschten Effekt erzielen.

Wenn es keine Rolle spielt, welches der Duplikate entfernt werden soll, können Sie eine Abfrage erstellen, die alle Zeilen mit der ID löscht, die nicht in einer Unterabfrage gefunden wird, in der die verschiedenen Geometrien ausgewählt werden. das gleiche hier, sicher mit Punkten, aber nicht mit anderen Typen, da nur die bbox verglichen wird, nicht die tatsächliche Geometrie (wenn sie genauso funktioniert wie Postgis).

/ Nicklas

Nicklas Avén
quelle
Vielen Dank für Ihre Antwort, ich mag die Idee mit Einschränkungen.
Johannes
0

In meinem Fall ist es am effizientesten, den räumlichen Index der Ebene zu verwenden. Bei dieser Abfrage behalte ich nur 1 Geometrie für jedes überlappende Feature. Ich habe den Test mit einer in Linestring konvertierten TIN durchgeführt.

   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)

Um räumliche Indizes richtig zu verstehen, werden hier zwei Abfragen durchgeführt, um räumliche Indizes in Polygone umzuwandeln.

    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;

Stellen Sie bei Erfolg die Geometriespalte wieder her, um sie in Ihrem bevorzugten Viewer zu visualisieren:

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