Linestrings'i noktalarla kesmenin en iyi yolunu kontrol ediyordum.
Senaryo: birçok sokak, kesişme noktaları ile kesilen segmentlere ihtiyaç var, şöyle:
Bende var
linestrings (noktalarla kesilmemiş) tablo
st_intersection puan tablosu
Kesişme noktaları tablosuyla kesilen bağımsız linestring segmentlerini almam gerekiyor.
PostGIS işlevlerini kullanıyorum ve çeşitli yaklaşımlar buldum, ancak her biri bana bir tür sorun veriyor.
İşte zaten test ettiklerim:
1
Çizgi tablosu: 1 satır, 1200 satır st_memunion Nokta tablosu: 1700 satır (puan)
Kötü olan: Gerçekten çok zaman ve bellek boşalması gerekiyor. Aynı anda birden fazla tablo oluşturulamıyor, çünkü bellek sadece işleyemiyor. Ve sonuç kirli ve dağınık. Bana doğru satır numarasını vermek yerine, daha sonra temizlemem gerekiyor (burada iyi açıklanmıştır Kavşak noktalarındaki çizgileri ayırın )
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
);
Bu yolun / yaklaşımın kaynağı: /programming/25753348/how-do-i-divide-city-streets-by-intersection-using-postgis
2
Aynı çizgiler / noktalar tablosu. Hala dağınık sonuçlar ve bunu temizlemek gerekiyor. Sorguyu bitirmek için hala çok zaman var.
--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)
);
Bu yolun / yaklaşımın kaynağı: Kavşak noktalarındaki çizgileri ayırın
3
Ayrıca bu işlevi buldum: https://github.com/Remi-C/PPPP_utilities/blob/master/postgis/rc_Split_Line_By_Points.sql
hangi bir messy_result bırakmaz iyi bir şey var o zaman onu temizlemek gerekir. Ancak her iki taraftan da st_memunion'a ihtiyacınız var (çizgiler tablosu ve puan tablosu)
Birazcık:
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
);
Ama aynı zamanda sonuçları almak için çok uzun saatler. Ve ayrıca daha uzun tablolarla (10k satır, 14k puan) denedim ve sadece bellek çıkışı sorunları alıyorum.
Ayrıca Esri'nin ArcGIS'ini de kötü sonuçlarla denedim ...
Peki, bunu PostGIS geom fonksiyonları ile yapmanın en iyi yolu nedir?
Yani, topolojiye adım atmadan.
Ya da en iyi tavsiyen nedir?