Sprawdzałem najlepszy sposób na wycięcie pościeli według punktów.
Scenariusz wygląda następująco: wiele ulic potrzebuje segmentów przeciętych przez punkty przecięcia, coś w tym rodzaju:
mam
tabela z liniami liniowymi (pełna nieokreślona punktami)
tabela punktów st_intersection
Potrzebuję wyciąć niezależne segmenty linii przez tabelę punktów przecięcia.
Korzystam z funkcji PostGIS i znalazłem kilka podejść, ale każda z nich daje mi pewien problem.
Oto, co już przetestowałem:
1
Tabela linii: 1 rząd, st_memunion 1200 linii Tabela punktów: 1700 rzędów (punktów)
Co jest złe: naprawdę zajmuje dużo czasu i opróżnia pamięć. Nie można utworzyć wielu tabel jednocześnie, ponieważ pamięć po prostu nie może sobie z tym poradzić. Rezultat jest brudny i niechlujny. Zamiast podawać poprawny numer wiersza i muszę go później wyczyścić (dobrze wyjaśnione tutaj Podziel linie w punktach przecięcia )
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
);
źródło tego sposobu / podejścia: /programming/25753348/how-do-i-divide-city-streets-by-intersection-using-postgis
2)
Ta sama tabela linii / punktów. Nadal niechlujne wyniki i trzeba to wyczyścić. Wciąż dużo czasu na zakończenie zapytania.
--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)
);
źródło tej drogi / podejścia: linie podziału w punktach przecięcia
3)
Znalazłem również tę funkcję: https://github.com/Remi-C/PPPP_utilities/blob/master/postgis/rc_Split_Line_By_Points.sql
co ma tę zaletę, że nie pozostawia niechlujnych wyników, które muszę wyczyścić. Ale potrzebujesz st_memunion z obu stron (tabela linii i tabela punktów)
To rodzaj:
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
);
Ale to także bardzo długie godziny na uzyskanie wyników. Próbowałem też z dłuższymi tabelami (10 000 linii, 14 000 punktów) i po prostu mam problemy z pamięcią.
Próbowałem też ArcGIS Esri z również złymi wynikami ...
Więc jaki jest najlepszy sposób, aby to zrobić za pomocą funkcji geom PostGIS?
Mam na myśli, bez wchodzenia w topologię.
A jaka jest twoja najlepsza rekomendacja?
źródło
Odpowiedzi:
To jest sposób!
Ok, otrzymałem świetną opinię od Remi-C, a teraz działa to jak urok:
Najlepsze jak dotąd rozwiązanie nie topologiczne .. NAPRAWDĘ działa szybko i łatwo (uwierz mi, przetestowałem wiele sposobów, aby to zrobić):
Otóż to!.
źródło
Dodam też dodatkowo własną metodę, bez użycia st_split ():
Dla każdej linii sprawdzam, czy są jakieś przecinające się punkty.
Jeśli tak, moja kusząca będzie wyglądać następująco:
Tabela zawierająca identyfikator linii i ułamek długości linii, w którym punkt przecina linię.
Następnie łączę ułamek parą, aby utworzyć nowe linie cięcia
Odzyskanie:
Zapytanie:
źródło