我正在检查按点切割线串的最佳方法。
场景是:很多街道,需要用相交点切开的线段,例如:
我有
线串(完全未切分)表
st_intersection点表
我需要获取由交点表剪切的独立线串段。
我正在使用PostGIS函数,并发现了几种方法,但是每种方法都给我带来了某种问题。
这是我已经测试过的:
1个
折线表:1行,st_memunion 1200行折点表:1700行(点)
不好的是:确实需要大量时间和内存刷新。无法同时创建多个表,导致内存无法处理。结果是脏乱的。而不是给我正确的行号,我需要稍后进行清理(在这里很好地解释了在相交点处分割线)
CREATE TABLE lines_with_messy_result AS (
SELECT
((ST_DUMP(ST_SPLIT(a.geom,b.ix))).geom) as geom
FROM st_union_lines a
INNER JOIN lots_of_points b
ON ST_INTERSECTS(a.geom, b.ix)
);
--then need to clean this up
create table lines_segments_cleaned as (
SELECT DISTINCT ON (ST_AsBinary(geom))
geom
FROM
lines_with_messy_result
);
这种方式/方法的来源:https : //stackoverflow.com/questions/25753348/how-do-i-divide-city-streets-by-intersection-using-postgis
2
相同的线/点表。仍然凌乱的结果,需要清理。仍然有很多时间来完成查询。
--messy table
Create table messy_lines_segments as
Select
row_number() over() as id,
(st_dump(st_split(input.geom, blade.ix))).geom as geom
from st_union_lines input
inner join lots_of_points blade on st_intersects(input.geom, blade.ix);
--then cleaning the messy table
delete from messy_lines_segments a
where exists
(
select 1 from messy_lines_segments b where a.id != b.id and st_coveredby(b.geom,a.geom)
);
这种方式/方法的来源:在相交点处分割线
3
我也发现了这个功能:https : //github.com/Remi-C/PPPP_utilities/blob/master/postgis/rc_Split_Line_By_Points.sql
这样做的好处是它不会留下messy_result,因此我需要清理它。但是您确实需要两面都使用st_memunion(线表和点表)
有点:
create table osm.calles_cortadas_03segmentos_sanluis as (
SELECT result.geom
FROM
osm.calles_cortadas_01uniones_sanluis AS line,
osm.calles_cortadas_00intersecciones_sanluis AS point,
rc_split_line_by_points(
input_line:=line.geom
,input_points:=point.ix
,tolerance:=4
) AS result
);
但是获得结果也要花费很长时间。而且我还尝试使用更长的表(10,000行,14k点),但我刚遇到内存不足的问题。
我也尝试了Esri的ArcGIS,但结果也很糟糕...
那么,用PostGIS geom函数完成此任务的最佳方法是什么?
我的意思是,无需进入拓扑结构。
或您的最佳建议是什么?