Stavo controllando il modo migliore per tagliare i linestring per punti.
Lo scenario è: molte strade, hanno bisogno dei segmenti tagliati da punti di intersezione, questo è il seguente:
ho ottenuto
tabella di stringhe di linea (interamente non suturata da punti)
tabella dei punti st_intersection
Devo tagliare i segmenti di stringa indipendenti dalla tabella dei punti di intersezione.
Sto usando le funzioni di PostGIS e ho trovato diversi approcci, ma ognuno di loro mi sta dando qualche tipo di problema.
Ecco cosa ho già testato:
1
Tabella delle linee: 1 riga, st_memunion di 1200 linee Tabella dei punti: 1700 righe (punti)
Cosa c'è di male: richiede davvero molto tempo e memoria. Impossibile creare più tabelle contemporaneamente perché la memoria non è in grado di gestirla. E il risultato è sporco e disordinato. Invece di darmi il numero di riga corretto, e ho bisogno di ripulirlo in seguito (ben spiegato qui Dividi linee ai punti di intersezione )
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
);
fonte di questo modo / approccio: /programming/25753348/how-do-i-divide-city-streets-by-intersection-using-postgis
2
Stessa tabella di linee / punti. Risultati ancora disordinati e necessità di ripulire. Ancora molto tempo per terminare la query.
--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)
);
fonte di questo modo / approccio: linee di divisione in punti di intersezione
3
Ho trovato anche questa funzione: https://github.com/Remi-C/PPPP_utilities/blob/master/postgis/rc_Split_Line_By_Points.sql
che ha il bello che non lascia un messy_result che poi ho bisogno di ripulire. Ma hai bisogno di st_memunion da entrambi i lati (tabella delle linee e tabella dei punti)
È una specie di:
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
);
Ma sono anche ore lunghissime per ottenere i risultati. E ho anche provato con tabelle più lunghe (10k righe, 14k punti) e ho solo problemi di memoria.
Ho anche provato ArcGIS di Esri con risultati anche cattivi ...
Allora, qual è il modo migliore per farlo con le funzioni geom di PostGIS?
Voglio dire, senza entrare nella topologia.
O qual è la tua migliore raccomandazione?