2017-09-27 53 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共享更多數據!像一個小的數據集或例子,所以我們其實可以運行的代碼! :)