2017-09-27 28 views
6

我在gis.stackexchange上问过这个问题(但是因为我的实际问题似乎比GIS更多的数据库问题,所以我在这里尝试我的运气)。这里是关于gis.stackexchange的问题:https://gis.stackexchange.com/questions/256535/postgis-2-3-splitting-multiline-by-pointsPostGIS 2.3通过点划分线

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

这里谈到的触发功能的代码:

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; 
+0

在你的例子中'compte'的初始值是什么? – MiguelKVidal

+0

@MiguelKVidal它可以是任何的,但总是至少为2.举个例子,假设它是3,换句话说,就是我应该在第一行的两行中分割结尾的情况。 –

+0

尝试在插入新值之前输出'compte'(在'while'之前)和'SELECT'的值。这将有助于更好地理解发生的事情。 – MiguelKVidal

回答

0

这是一个比较复杂的查询,有很多的运动部件。 我对调试查询建议,涉及到多个想法:

  1. 考虑分拆功能成更小的功能,更易于测试,然后从一组零件你肯定知道工作作为构成功能你需要他们。

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

  3. 是可能是你正在使用没有创建几何ST_的功能组合,你认为他们创造,一个排除这种方法是通过可视化地理功能组合的结果,就像st_dump(st_split (...)))或st_dump(st_split(...))。可以通过检查“靠近点”而不是“确切点”来做出,也许这些点非常接近,或者可以通过检查“点附近”而不是“确切点”如在厘米附近,使它们基本上是“相同的点”,但实际上并不是确切的点。这只是一个假设。

  4. 考虑与StackOverflow共享更多数据!像一个小的数据集或例子,所以我们其实可以运行的代码! :)