【问题标题】:PostGIS 2.3 Split a line by pointsPostGIS 2.3 按点分割线
【发布时间】:2018-03-08 17:19:18
【问题描述】:

我在 gis.stackexchange 上问了这个问题(但由于我的实际问题似乎比 GIS 更像是一个数据库问题,所以我在这里试试运气)。这是关于 gis.stackexchange 的问题:https://gis.stackexchange.com/questions/256535/postgis-2-3-splitting-multiline-by-points

我有一个触发器,当插入新行以插入表中的一组拆分行时,我会循环,但由于某种原因,我没有得到想要的结果,因为在示例中我只得到了两行三。我做错了什么?

下面是触发函数的代码:

CREATE OR REPLACE FUNCTION public.split_cable()
      RETURNS trigger AS
    $BODY$
    DECLARE compte integer;
    DECLARE i integer := 2;
    BEGIN
    compte = (SELECT count(*) FROM boite WHERE st_intersects(boite.geom, new.geom));

    WHILE i < compte LOOP
        WITH brs AS (SELECT row_number() over(), boite.geom FROM boite, cable2
            WHERE st_intersects(boite.geom, new.geom)
    -- here the ORDER BY serve to get the "boite" objects in a specific order
            ORDER BY st_linelocatepoint(st_linemerge(new.geom),boite.geom)),
            brs2 AS (SELECT st_union(geom) AS geom FROM brs),
            cables AS (SELECT (st_dump(st_split(new.geom, brs2.geom))).geom FROM brs2)
        INSERT INTO cable2 (geom) VALUES (
        SELECT st_multi(cables.geom) FROM cables WHERE st_startpoint(geom) = (SELECT geom FROM brs WHERE brs.row_number = i));
        i = i + 1;
    END LOOP;

    new.geom = (WITH brs AS (SELECT row_number() over(), boite.geom FROM boite, cable2
            WHERE st_intersects(boite.geom, new.geom)
            ORDER BY st_linelocatepoint(st_linemerge(new.geom),boite.geom)),
            brs2 AS (SELECT st_union(geom) as geom from brs),
            cables AS (SELECT (st_dump(st_split(new.geom, brs2.geom))).geom FROM brs2)
            SELECT st_multi(cables.geom) FROM cables WHERE st_startpoint(geom) = (SELECT geom FROM brs WHERE brs.row_number = 1));
    RETURN new;
    END
    $BODY$
      LANGUAGE plpgsql;

【问题讨论】:

  • 你的例子中compte的初始值是多少?
  • @MiguelKVidal 它可以是任何值,但始终至少为 2。例如,假设它是 3,换句话说,在这种情况下,我应该以两行拆分结束首行。
  • 在插入新值之前,尝试输出comptewhile 之前)和SELECT 的值。这将有助于更好地了解正在发生的事情。
  • 你能提供一个带有数据集的数据表来试试吗? (如sqlfiddle.com/#!17

标签: sql postgresql loops triggers postgis


【解决方案1】:

这是一个相对复杂的查询,有很多活动部分。 我对调试查询的建议涉及多个想法:

  1. 考虑将函数拆分为更易于测试的更小函数,然后将函数组合成一组您确定可以按需要工作的部分。

  2. 将一组中间结果导出到中间表中,您可以使用图形工具轻松可视化中间结果集,并更好地评估数据出错的地方。

  3. 您使用的 ST_ 函数的组合可能不会创建您认为他们创建的几何,排除这种情况的一种方法是可视化地理函数的结果组合,例如 st_dump(st_split(...))) 或 st_dump(st_split(...))。

  4. 也许这个检查:st_startpoint(geom) = (SELECT geom FROM brs WHERE brs.row_number = i)) 可以通过检查“点附近”而不是“精确点”来进行,也许这些点非常接近,以厘米为单位,使它们本质上是“同一点”,但实际上并不是确切的点。这只是一个假设。

  5. 考虑与 StackOverflow 共享更多数据!就像一个小数据集或示例,这样我们就可以真正运行代码! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多