Spatialiteから重複を削除する


9

ポイント付きのSpatialiteデータベースがあります。時々ポイントが追加されます。座標に基づいて重複を削除する最も簡単な方法は何ですか?

回答:


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
正しい方向に導いてくれたおかげで、私はそれを次のようにして解決しました。DELETEFROM mytable2 WHERE geom IN(SELECT geom FROM mytable1);
ヨハネス

8

最も簡単なのは、複製を入れないことです。ジオメトリフィールドに一意の制約を追加します。それがスペーシャルライトでどのように機能するかはわかりませんが、PostGISでは、ポイントの場合に必要な効果をダイビングするバウンディングボックスを比較します。

削除する重複のどれが問題ではない場合は、異なるジオメトリを選択するサブクエリで見つからないIDを持つすべての行を削除するクエリを作成できます。ここでも同じです。ポイントは安全ですが、実際のジオメトリではなくbboxのみが比較されるため(postgisと同じように機能する場合)、他のタイプは安全です。

/ニクラス


あなたの答えをありがとう、私は制約付きのアイデアが好きです。
ヨハネス

0
DELETE FROM foo
   WHERE pkuid NOT IN (SELECT min(pkuid) --or max(pkuid)
                    FROM foo
                    GROUP BY geometry)

(ここのデニス・ヴァレエフの答えから:https : //stackoverflow.com/questions/3777633/delete-duplicate-rows-dont-delete-all-duplicate


0

私の場合、最も効率的な方法は、レイヤーの空間インデックスを使用することです。このクエリでは、重複するフィーチャごとに1つのジオメトリのみを保持します。TINをラインストリングに変換してテストを行いました。

   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)

空間インデックスを正しく理解するために、空間インデックスをポリゴンに変換する2つのクエリを次に示します。

    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 )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.