Remova duplicatas do Spatialite

9

Eu tenho um banco de dados espacial com pontos. De tempos em tempos, agora os pontos são adicionados. Qual seria a maneira mais fácil de remover duplicatas com base nas coordenadas?

johannes
fonte

Respostas:

7

A união automática da tabela permitiria encontrar linhas duplicadas. Algo assim deve funcionar:

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

se pontos:

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

(não testado .....)

simo
fonte
2
Graças a um que me levou na direção certa, resolvi-o com: DELETE FROM mytable2 WHERE geom IN (SELECT geom FROM mytable1);
precisa
8

Eu acho que o mais fácil é nunca permitir que a duplicata entre. Adicione uma restrição exclusiva no campo de geometria. Não sei como isso funcionará no espaço espacial, mas no postgis o constrint compararia as caixas delimitadoras que mergulhariam o efeito desejado no caso de pontos.

se não importa qual das duplicatas remover, você poderá criar uma consulta que exclua todas as linhas com o ID não encontrado em uma subconsulta que seleciona as geometrias distintas. o mesmo aqui, seguro com pontos, mas não com outros tipos, pois somente a bbox será comparada e não a geometria real (se estiver funcionando da mesma maneira que o postgis).

/ Nicklas

Nicklas Avén
fonte
Obrigado pela sua resposta, gosto da ideia com restrições.
johannes 27/03
0

No meu caso, a maneira mais eficiente é usar o índice espacial da camada. Com esta consulta, mantenho apenas 1 geometria para cada recurso sobreposto. Eu fiz o teste com um TIN convertido em 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)

Para entender corretamente os índices espaciais, aqui estão duas consultas para converter o índice espacial em polígonos.

    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;

Com sucesso, recupere a coluna de geometria para poder visualizar em seu visualizador favorito:

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