PostGIS 2.3按点分割

时间:2017-09-27 09:24:03

标签: sql postgresql loops triggers postgis

我在gis.stackexchange上问了这个问题(但是因为我的实际问题似乎比GIS更像是一个DB问题,我在这里试试运气)。这是关于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;

1 个答案:

答案 0 :(得分:0)

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

  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共享更多数据!像一个小数据集或示例,所以我们实际上可以运行代码! :)