Supprimer les doublons de Spatialite

9

J'ai une base de données Spatialite avec des points. De temps en temps maintenant, des points sont ajoutés. Quelle serait la façon la plus simple de supprimer les doublons en fonction des coordonnées?

johannes
la source

Réponses:

7

Rejoindre automatiquement le tableau vous permettrait de trouver des lignes en double. Quelque chose comme ça devrait fonctionner:

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

si points:

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

(pas testé .....)

simo
la source
2
Merci a qui m'a mis dans la bonne direction, je l'ai résolu avec: DELETE FROM mytable2 WHERE geom IN (SELECT geom FROM mytable1);
johannes
8

Je pense que le plus simple est de ne jamais laisser le doublon entrer. Ajouter une contrainte unique sur le champ géométrique. Je ne sais pas comment cela fonctionnera dans la spatiallite mais en postgis la constrint comparerait les boîtes englobantes qui plongeront l'effet voulu dans le cas des points.

si le doublon à supprimer n'a pas d'importance, vous pouvez créer une requête qui supprime toutes les lignes dont l'ID ne se trouve pas dans une sous-requête qui sélectionne les géométries distinctes. Même chose ici, en sécurité avec des points mais pas avec d'autres types car seule la bbox sera comparée et non la géométrie réelle (si elle fonctionne de la même manière que les postgis).

/ Nicklas

Nicklas Avén
la source
Merci pour votre réponse, j'aime l'idée avec des contraintes.
johannes
0

Dans mon cas, le moyen le plus efficace consiste à utiliser l'index spatial de la couche. Avec cette requête, je ne conserve qu'une seule géométrie pour chaque entité qui se chevauchent. J'ai fait le test avec un TIN converti en 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)

Pour comprendre correctement les index spatiaux, voici deux requêtes pour convertir l'index spatial en polygones.

    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 cas de succès, récupérez la colonne de géométrie pour pouvoir visualiser dans votre visionneuse préférée:

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