Usuń duplikaty ze Spatialite

9

Mam bazę danych Spatialite z punktami. Od czasu do czasu dodawane są teraz punkty. Jaki byłby najłatwiejszy sposób na usunięcie duplikatów na podstawie współrzędnych?

Johnnes
źródło

Odpowiedzi:

7

Automatyczne dołączanie do tabeli pozwoli ci znaleźć duplikaty wierszy. Coś takiego powinno działać:

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

jeśli punkty:

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

(nie testowany .....)

simo
źródło
2
Dzięki, że poprowadziłem mnie we właściwym kierunku, rozwiązałem go za pomocą: DELETE FROM mytable2 WHERE Geom IN (SELECT geom FROM mytable1);
Johannes
8

Myślę, że najłatwiej jest nigdy nie dopuścić do duplikowania. Dodanie unikalnego ograniczenia w polu geometrii. Nie wiem, jak to będzie działać w spatiallicie, ale w postgisie constint porównałby ramki ograniczające, które zanikają pożądany efekt w przypadku punktów.

jeśli nie ma znaczenia, który z duplikatów do usunięcia, możesz zbudować zapytanie, które usuwa wszystkie wiersze o identyfikatorze, którego nie ma w podzapytaniu, które wybiera odrębne geometrie. to samo tutaj, bezpieczne z punktami, ale nie z innymi typami, ponieważ tylko bbox będzie porównywany, a nie faktyczna geometria (jeśli działa tak samo jak postgis).

/ Nicklas

Nicklas Avén
źródło
Dzięki za odpowiedź, podoba mi się ten pomysł z ograniczeniami.
Johannes
0

W moim przypadku najbardziej efektywnym sposobem jest użycie indeksu przestrzennego z warstwy. Dzięki temu zapytaniu zachowuję tylko 1 geometrię dla każdej nakładającej się funkcji. Zrobiłem test z TIN przekonwertowanym na 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)

Aby poprawnie zrozumieć indeksy przestrzenne, tutaj dwa zapytania do konwersji indeksu przestrzennego na wielokąty.

    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;

Po sukcesie odzyskaj kolumnę geometrii, aby móc wizualizować w swojej ulubionej przeglądarce:

    select RecoverGeometryColumn( 'tin_line_sp_representation','geometry', 25832 , 'POLYGON', 2 )
PEL
źródło