Відповіді:
Автоматичне приєднання до таблиці дозволить вам знайти рядки-дублікати. Щось подібне повинно працювати:
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
(не перевірено .....)
Я думаю, що найпростіше - ніколи не пускати дублікат. Додати унікальне обмеження на поле геометрії. Я не знаю, як це буде працювати в spatiallite, але в постгізі обмеження порівнюватиме обмежувальні поля, які занурюють бажаний ефект у випадку очок.
якщо не має значення, який із дублікатів для видалення, ви можете створити запит, який видаляє всі рядки з id, які не знайдені в підзапиті, який вибирає окремі геометрії. те саме тут, безпечно з очками, але не з іншими типами, оскільки тільки bbox буде порівнюватися не з фактичною геометрією (якщо це працює так само, як постгіги).
/ Ніклас
DELETE FROM foo
WHERE pkuid NOT IN (SELECT min(pkuid) --or max(pkuid)
FROM foo
GROUP BY geometry)
(взято з відповіді Дениса Валєєва тут: /programming/3777633/delete-duplicate-rows-dont-delete-all-duplicate )
У моєму випадку найбільш ефективним способом є використання просторового індексу від шару. За допомогою цього запиту я зберігаю лише 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 )