Sql 如何识别2个相同的几何图形并在postgis中修改它们?

Sql 如何识别2个相同的几何图形并在postgis中修改它们?,sql,postgresql,postgis,Sql,Postgresql,Postgis,我试图找到一种方法来识别所有具有相同几何结构的表条目,并且在找到时为其中一个添加额外的长度以区分它们 基本上,在表support\u fh中,表示有关导线的所有信息。 有些导线具有相同的几何图形。 这意味着两条导线具有相同的几何图形,但仍具有不同的id 我在想一个函数,可以检查每个几何体是否已经存在,但我有太多的数据,这似乎不是一个好主意 有关tha表的以下约束信息: ALTER TABLE public.support_fh ADD CONSTRAINT enforce_geotype

我试图找到一种方法来识别所有具有相同几何结构的表条目,并且在找到时为其中一个添加额外的长度以区分它们

基本上,在表
support\u fh
中,表示有关导线的所有信息。 有些导线具有相同的几何图形。 这意味着两条导线具有相同的几何图形,但仍具有不同的
id

我在想一个函数,可以检查每个几何体是否已经存在,但我有太多的数据,这似乎不是一个好主意

有关tha表的以下约束信息:

ALTER TABLE public.support_fh
    ADD CONSTRAINT enforce_geotype_geom CHECK (geometrytype(geom) = 'MULTILINESTRING'::text OR geometrytype(geom) = 'LINESTRING'::text OR geom IS NULL);
是否有任何postgis功能已经做到了这一点(我一直在寻找一些东西,但没有找到任何东西)


我想从中吸取教训,因此,如果可能的话,请向我解释我在这里做错了什么,或者我的方法是否缺乏洞察力。

您可能想看看。这可能会进一步帮助您:

测试数据

CREATE TABLE support_fh (id INT, geom GEOMETRY);
INSERT INTO support_fh VALUES (1,'LINESTRING(0 0, 10 10)'),-- identical to 4
                              (2,'LINESTRING(1 0, 10 10)'),
                              (3,'LINESTRING(2 0, 10 10)'),
                              (4,'LINESTRING(0 0, 10 10)'); --identical to 1
质疑

WITH j AS (
  SELECT array_agg(b.id) AS ids,ST_AsText(b.geom) FROM support_fh a, support_fh b
  WHERE a.id <> b.id AND ST_Equals(a.geom,b.geom)   
  GROUP BY b.geom
)
UPDATE support_fh i SET geom = ST_AddPoint(i.geom,ST_MakePoint(3,3))
FROM j WHERE j.ids[1] = i.id;
db=# SELECT id, ST_AsText(geom) 
FROM support_fh ORDER BY id;
 id |         st_astext         
----+---------------------------
  1 | LINESTRING(0 0,10 10)
  2 | LINESTRING(1 0,10 10)
  3 | LINESTRING(2 0,10 10)
  4 | LINESTRING(0 0,10 10,3 3)
(4 Zeilen)