Видаліть дублікати з Spatialite


9

У мене є база даних про простори з точками. Час від часу бали додаються. Який був би найпростіший спосіб видалення дублікатів на основі координат?

Відповіді:


7

Автоматичне приєднання до таблиці дозволить вам знайти рядки-дублікати. Щось подібне повинно працювати:

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

якщо бали:

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

(не перевірено .....)


2
Завдяки тому, що перевело мене в правильне русло, я вирішив це за допомогою: ВИДАЛИТИ З mytable2 WHERE geom IN (ВИБІРТЕ геом Із mytable1);
johannes

8

Я думаю, що найпростіше - ніколи не пускати дублікат. Додати унікальне обмеження на поле геометрії. Я не знаю, як це буде працювати в spatiallite, але в постгізі обмеження порівнюватиме обмежувальні поля, які занурюють бажаний ефект у випадку очок.

якщо не має значення, який із дублікатів для видалення, ви можете створити запит, який видаляє всі рядки з id, які не знайдені в підзапиті, який вибирає окремі геометрії. те саме тут, безпечно з очками, але не з іншими типами, оскільки тільки bbox буде порівнюватися не з фактичною геометрією (якщо це працює так само, як постгіги).

/ Ніклас


Дякую за вашу відповідь, мені подобається ідея з обмеженнями.
johannes


0

У моєму випадку найбільш ефективним способом є використання просторового індексу від шару. За допомогою цього запиту я зберігаю лише 1 геометрію для кожної функції, що перекривається. Я зробив тест за допомогою TIN, перетвореного на 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)

Щоб правильно зрозуміти просторові індекси, тут два запити для перетворення просторового індексу в багатокутники.

    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;

Після успіху відновіть стовпчик геометрії, щоб мати змогу візуалізувати улюбленого глядача:

    select RecoverGeometryColumn( 'tin_line_sp_representation','geometry', 25832 , 'POLYGON', 2 )
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.