Eu estava verificando a melhor maneira de cortar linhas de linhas por pontos.
O cenário é: muitas ruas, precisam dos segmentos cortados por pontos de interseção, mais ou menos assim:
Eu tenho
Tabela de cadeias de linhas (sem cortes por pontos)
tabela de pontos st_intersection
Preciso cortar os segmentos independentes da cadeia de linhas pela tabela de pontos de interseção.
Estou usando as funções do PostGIS e encontrei várias abordagens, mas cada uma delas está me dando algum tipo de problema.
Aqui está o que eu já testei:
1
Tabela de linhas: 1 linha, st_memunion de 1200 linhas Tabela de pontos: 1700 linhas (pontos)
O que é ruim: realmente leva muito tempo e descarga de memória. Não é possível criar várias tabelas ao mesmo tempo, porque a memória não pode lidar com isso. E o resultado é sujo e confuso. Em vez de me fornecer o número de linha correto, e preciso limpá-lo mais tarde (bem explicado aqui Dividir linhas nos pontos de interseção )
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 desta maneira / abordagem: /programming/25753348/how-do-i-divide-city-streets-by-intersection-using-postgis
2
Mesmas linhas / tabela de pontos. Resultados ainda confusos e precisam ser limpos. Ainda há muito tempo para concluir a consulta.
--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 desta maneira / abordagem: Dividir linhas nos pontos de interseção
3
Encontrei também esta função: https://github.com/Remi-C/PPPP_utilities/blob/master/postgis/rc_Split_Line_By_Points.sql
que tem o lado bom de não deixar um resultado bagunçado que eu preciso limpar. Mas você precisa de st_memunion dos dois lados (tabela de linhas e tabela de pontos)
É um tipo de:
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
);
Mas também são horas super longas para obter os resultados. E também tentei com tabelas mais longas (10 mil linhas, 14 mil pontos) e acabei obtendo problemas de falta de memória.
Eu também tentei o ArcGIS da Esri com também resultados ruins ...
Então, qual é a melhor maneira de fazer isso com as funções geom do PostGIS?
Quero dizer, sem entrar na topologia.
Ou qual é a sua melhor recomendação?
fonte
Respostas:
Este é o caminho!
Ok, recebi um ótimo feedback do Remi-C e agora funciona como charme:
A melhor solução não-topológica de todos os tempos. REALMENTE funciona rápido e fácil (acredite, eu testei várias maneiras de fazer isso):
É isso aí!.
fonte
Também adiciono, além disso, meu próprio método, sem usar st_split ():
Para cada linha, verifico se existem alguns pontos de interseção.
Se sim, minha tentação ficará assim:
Uma tabela que contém o ID da linha e a fração do comprimento da linha em que um ponto cruza a linha.
Então eu combino a fração por par para criar as novas linhas cortadas
Recrutamento:
A pergunta:
fonte