Удалить дубликаты из Spatialite

9

У меня есть база данных Spatialite с точками. Время от времени теперь очки начисляются. Какой самый простой способ удалить дубликаты на основе координат?

Johannes
источник

Ответы:

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 ГДЕ geom IN (ВЫБЕРИТЕ geom ИЗ mytable1);
Йоханнес
8

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

если не имеет значения, какой из дубликатов удалить, вы можете создать запрос, удаляющий все строки с идентификатором, который не найден в подзапросе, который выбирает различные геометрии. то же самое здесь, безопасно с точками, но не с другими типами, так как будет сравниваться только bbox, а не фактическая геометрия (если работает так же, как postgis).

/ Никлас

Никлас Авен
источник
Спасибо за ваш ответ, мне нравится идея с ограничениями.
Йоханнес
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 )
PEL
источник