Я перевіряв найкращий спосіб вирізати рядки на очки.
Сценарій такий: багато вулиць, потрібні сегменти, розрізані точками перетину, такий:
я зрозумів, я отримав
рядок рядків (повна без очок)
таблиця точок перетину st_intersection
Мені потрібно отримати відрізки незалежних рядків рядків за таблицею точок перетину.
Я використовую функції PostGIS і знайшов кілька підходів, але кожен з них задає мені певну проблему.
Ось що я вже перевірив:
1
Таблиця рядків: 1 ряд, стільниця 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
);
Але це також дуже довгі години для отримання результатів. А також я спробував з довшими таблицями (10 к. Рядків, 14 к. Пунктів), і я просто отримую проблеми з пам'яттю.
Я також спробував ArcGIS Esri з поганими результатами ...
Отже, який найкращий спосіб зробити це за допомогою функцій geom PostGIS?
Я маю на увазі, не вступаючи в топологію.
Або яка ваша найкраща рекомендація?