提问人:GuiOm Clair 提问时间:9/27/2017 更新时间:10/9/2017 访问量:1510
PostGIS 2.3 按点分割线
PostGIS 2.3 Split a line by points
问:
我在 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;
答:
这是一个相对复杂的查询,并且有很多移动部分。 我对调试查询的建议涉及多个想法:
考虑将函数拆分为更小的函数,以便于测试,然后从一组您知道的部件组合函数,以确保它们根据需要工作。
将一组中间结果导出到中间表,您可以使用图形工具轻松可视化中间结果集,并可以更好地评估数据出错的地方。
您正在使用的ST_函数的组合可能无法创建您认为它们创建的几何图形,排除这种情况的一种方法是通过可视化地理函数组合的结果,例如 st_dump(st_split(...)))或 st_dump(st_split(...)) 例如。
也许这个检查:st_startpoint(geom) = (SELECT geom FROM brs WHERE brs.row_number = i)) 可以通过检查“接近的点”而不是“精确的点”来进行,也许这些点非常接近,就像厘米接近一样,使它们本质上是“同一个点”,但实际上并不是确切的点。不过,这只是一个假设。
考虑与 StackOverflow 共享更多数据!就像一个小数据集或示例一样,这样我们就可以实际运行代码了!:)
评论
compte
compte
while
SELECT