선 문자열을 포인트로 자르는 가장 좋은 방법을 확인하고있었습니다.
시나리오는 다음과 같습니다. 거리가 많고 교차점으로 잘라진 세그먼트가 필요합니다.
알았어
선 스트링 (점으로 전체 자르지 않은 표) 테이블
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
);
이 방법 / 접근 출처 : /programming/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)
);
이 방법 / 접근 원 : 교차점에서 분할 선
삼
나는 또한이 기능을 발견했다 : https://github.com/Remi-C/PPPP_utilities/blob/master/postgis/rc_Split_Line_By_Points.sql
그것은 messy_result를 남기지 않고 그것을 정리해야한다는 좋은 점이 있습니다. 그러나 양쪽에서 st_memunion이 필요합니다 (lines table 및 points table)
그것은 종류입니다 :
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
);
그러나 결과를 얻는 데 오랜 시간이 걸립니다. 그리고 더 긴 테이블 (10k 라인, 14k 포인트)로 시도했는데 메모리 부족 문제가 발생했습니다.
나는 또한 나쁜 결과로 Esri의 ArcGIS를 시도했습니다 ...
PostGIS 기하 함수를 사용하여이를 수행하는 가장 좋은 방법은 무엇입니까?
토폴로지에 들어 가지 않고 의미합니다.
또는 가장 권장되는 사항은 무엇입니까?