【问题标题】:How to identify 2 identical geometry and modify them in postgis?如何识别 2 个相同的几何图形并在 postgis 中修改它们?
【发布时间】:2019-11-19 11:24:28
【问题描述】:

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

基本上,在表support_fh 中表示有关电线的所有信息。 一些电线具有相同的几何形状。 这意味着 2 根线具有相同的几何形状但仍然具有不同的id

我正在考虑一个函数来检查每个几何是否已经存在,但我有太多数据,这似乎不是一个好主意。

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

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 函数可以执行此操作(我一直在寻找东西但没有找到任何东西)。

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

【问题讨论】:

    标签: sql postgresql postgis


    【解决方案1】:

    您可能想看看ST_Equals。这个CTE 可能会进一步帮助你:

    测试数据

    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;
    

    在这个查询中,我只是使用ST_AddPoint 为线串添加了一个额外的点,但你可以做任何你想做的事情。正如您在问题中所述,它还假设几何只能有一个重复项。如果允许多个重复,我们需要稍微调整更新语句;)

    结果

    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)
    

    【讨论】:

      猜你喜欢
      • 2021-05-04
      • 1970-01-01
      • 2022-01-20
      • 2019-07-17
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 2014-02-14
      相关资源
      最近更新 更多