Hapus duplikat dari Spatialite

9

Saya memiliki basis data Spatialite dengan poin. Dari waktu ke waktu sekarang poin ditambahkan. Apa cara termudah untuk menghapus duplikat berdasarkan koordinat?

johannes
sumber

Jawaban:

7

Bergabung secara otomatis dengan tabel akan memungkinkan Anda menemukan duplikat baris. Sesuatu seperti itu seharusnya bekerja:

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

jika poin:

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

(tidak diuji .....)

simo
sumber
2
Terima kasih yang membuat saya ke arah yang benar, saya menyelesaikannya dengan: DELETE FROM mytable2 WHERE geom IN (SELECT geom FROM mytable1);
johannes
8

Saya pikir yang termudah adalah tidak pernah membiarkan duplikat masuk. Tambahkan kendala unik pada bidang geometri. Saya tidak tahu bagaimana itu akan bekerja dalam spatiallite tetapi dalam postgis konstrint akan membandingkan kotak pembatas yang akan menyelam efek yang diinginkan dalam kasus poin.

jika tidak masalah yang mana dari duplikat untuk menghapus Anda bisa membangun kueri yang menghapus semua baris dengan id yang tidak ditemukan dalam subquery yang memilih geometri yang berbeda. sama di sini, aman dengan poin tetapi bukan tipe lain karena hanya bbox yang akan dibandingkan bukan geometri yang sebenarnya (jika bekerja dengan cara yang sama dengan postgis).

/ Nicklas

Nicklas Avén
sumber
Terima kasih atas jawaban Anda, saya suka ide dengan kendala.
johannes
0

Dalam kasus saya, cara yang paling efisien adalah dengan menggunakan indeks spasial dari layer. Dengan kueri ini, saya hanya menyimpan 1 geometri untuk setiap fitur yang tumpang tindih. Saya telah melakukan tes dengan TIN yang diubah menjadi 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)

Untuk memahami indeks spasial dengan benar, berikut ini dua kueri untuk mengubah indeks spasial menjadi poligon.

    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;

Jika berhasil, pulihkan kolom geometri untuk dapat divisualisasikan ke pemirsa favorit Anda:

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