从Spatialite删除重复项


9

我有一个带有点的Spatialite数据库。现在不时添加点。根据坐标删除重复项的最简单方法是什么?

Answers:


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
谢谢a,它使我朝正确的方向发展,我用以下方法解决了它:从mytable2中删除WHERE geom IN(从mytable1中选择geom);
约翰内斯

8

我认为最简单的方法是永远不要让重复项进入。在几何字段上添加唯一约束。我不知道这在spacespacelite中是如何工作的,但是在Postgis中,约束会比较边界框,如果出现点,边界框会释放所需的效果。

如果要删除的重复项中的哪一个都没有关系,则可以构建一个查询,以删除在选择不同几何形状的子查询中找不到的所有ID为ID的行。此处相同,可安全使用点,但不能使用其他类型,因为仅将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 )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.