Я проверял лучший способ разрезать линии по точкам.
Сценарий таков: много улиц, отрезки которых необходимо отрезать по точкам пересечения, например:
я получил
таблица линейных линий
таблица точек 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)
);
источник этого пути / подхода: разделение линий в точках пересечения
3
Я также нашел эту функцию: https://github.com/Remi-C/PPPP_utilities/blob/master/postgis/rc_Split_Line_By_Points.sql
у него есть хорошая вещь, что он не оставляет беспорядок, что тогда мне нужно очистить его. Но вам нужен 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
);
Но это также очень долгие часы для получения результатов. И я также попробовал с более длинными таблицами (10k строк, 14k точек), и у меня просто проблемы с памятью.
Я также попробовал ArcGIS от Esri с плохими результатами ...
Итак, как лучше всего это сделать с помощью функций Geom PostGIS?
Я имею в виду, не входя в топологию.
Или какова ваша лучшая рекомендация?
источник
Ответы:
Это способ!
Хорошо, я получил отличный отзыв от Remi-C, и теперь это работает как шарм:
Лучшее решение, не относящееся к топологии ... оно ДЕЙСТВИТЕЛЬНО работает быстро и легко (поверьте мне, я протестировал множество способов сделать это):
Это оно!.
источник
Кроме того, я добавляю свой собственный метод без использования st_split ():
Для каждой линии я проверяю, есть ли какие-нибудь пересекающиеся точки.
Если да, мой соблазнительный будет выглядеть так:
Таблица, которая содержит идентификатор линии и долю длины линии, где точка пересекает линию.
Затем я объединяю дробь по паре, чтобы создать новые линии разреза
Recquirement:
Запрос:
источник