Tôi đã kiểm tra cách tốt nhất để cắt linestrings bằng điểm.
Kịch bản là: rất nhiều đường phố, cần các đoạn được cắt bởi các điểm giao nhau, loại này:
tôi đã nhận
bảng linestrings (đầy đủ không bị cắt bởi điểm)
bảng điểm st_intersection
Tôi cần phải lấy các đoạn linestring độc lập được cắt bởi bảng điểm giao nhau.
Tôi đang sử dụng các chức năng của PostGIS và đã tìm thấy một số cách tiếp cận, nhưng mỗi một trong số chúng đều mang đến cho tôi một số vấn đề.
Đây là những gì tôi đã thử nghiệm:
1
Bảng dòng: 1 hàng, st_memunion gồm 1200 dòng Bảng điểm: 1700 hàng (điểm)
Điều tồi tệ: thực sự tốn rất nhiều thời gian và bộ nhớ. Không thể tạo nhiều bảng cùng một lúc khiến bộ nhớ không thể xử lý được. Và kết quả là bẩn và lộn xộn. Thay vì cho tôi số hàng chính xác và tôi cần dọn sạch nó sau (giải thích rõ ở đây Chia dòng tại các điểm giao nhau )
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
);
nguồn của cách này / cách tiếp cận: /programming/25753348/how-do-i-divide-city-streets-by-intersection-USE-postgis
2
Bảng dòng / điểm giống nhau. Vẫn còn kết quả lộn xộn và cần phải làm sạch này. Vẫn còn nhiều thời gian để hoàn thành truy vấn.
--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)
);
nguồn của cách này / cách tiếp cận: Chia dòng tại các điểm giao nhau
3
Tôi cũng tìm thấy chức năng này: https://github.com/Remi-C/PPPP_utilities/blob/master/postgis/rc_Split_Line_By_Points.sql
có một điều tốt là nó không để lại một mớ hỗn độn mà sau đó tôi cần phải dọn dẹp nó. Nhưng bạn cần st_memunion từ cả hai phía (bảng dòng và bảng điểm)
Đó là loại:
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
);
Nhưng nó cũng siêu giờ để nhận được kết quả. Và tôi cũng đã thử với các bảng dài hơn (10k dòng, 14k điểm) và tôi chỉ nhận được các vấn đề về bộ nhớ.
Tôi cũng đã thử ArcGIS của Esri với kết quả rất tệ ...
Vậy, cách tốt nhất để thực hiện điều này với các hàm geom của PostGIS là gì?
Ý tôi là, không bước vào cấu trúc liên kết.
Hoặc đề nghị tốt nhất của bạn là gì?