2 votos

¿Cómo amortiguar una línea con segmentos en PostGIS utilizando el tamaño único de los segmentos?

Quiero amortiguar una línea en PostGIS. Para ello he creado una línea, la he dividido en segmentos fijos (8m) y he ejecutado la función buffer.

--CREATE TABLE line(name char(10), geom geometry);
--INSERT INTO line VALUES('line','SRID=32637;LINESTRING(423458.0 6857171.2,  423439.8 6857244.5, 423501.7 6857327.8)');

WITH 
    segmentvertex AS (
        SELECT ST_Segmentize(geom, 8) AS geom
        FROM line)

SELECT ROW_NUMBER() OVER() AS segment_id, st_buffer(geom, 4, 'endcap=flat join=bevel') AS segment_geom

FROM (
SELECT dmp.path,
        ST_MakeLine(dmp.geom, LEAD(dmp.geom) OVER()) AS geom

FROM segmentvertex AS s, 
LATERAL ST_DumpPoints(s.geom) as dmp
)   t

WHERE  geom IS NOT NULL

De alguna manera no puedo manejar los vértices en las esquinas de la línea que crea zonas de transición de mal aspecto. En la parte izquierda de la imagen he insertado una memoria intermedia por segmentos basada en la salida de la herramienta GRASS v.split en QGIS 3.1 que se parece más a lo esperado.

enter image description here

¿Cómo puedo conseguir el mismo resultado en PostGIS que en QGIS? Estoy usando PostGIS 2.5.1

1voto

Cyril Puntos 141

Así que hay muchas soluciones a tu pregunta y esta es una de ellas :-).

Tu caso es particular y problemático, porque para un objeto lineal dividido en segmentos en los puntos de inflexión, es difícil escribir un algoritmo que resuelva situaciones complejas de comportamiento de los objetos de amortiguación, además, se complican por los valores de longitud y anchura de la amortiguación. Como resultado, para su caso con sus condiciones y geodatos, sugiero posibles soluciones a su pregunta. Crea previamente las funciones personalizadas ST_SnapPolygonToLine() y ST_PointsInStarPolygon(), las encontrarás aquí en GIS Stack Exchange... Ejecute el script SQL:

WITH 
tbla AS (SELECT row_number() over() AS id, ST_LineSubstring( d.geom, substart, CASE WHEN subend > 1 THEN 1 ELSE subend END) geom
FROM (SELECT row_number() over() AS id, geom, ST_Length(geom) len, 8 sublen FROM line) AS d CROSS JOIN LATERAL (
    SELECT i, (sublen * i)/len AS substart, (sublen * (i+1))/len AS subend
        FROM generate_series(0, floor(d.len/sublen)::integer) AS t(i) WHERE (sublen * i)/len <> 1.0) AS d2),
tblb AS (SELECT row_number() over() AS id, ST_Buffer(geom, 4,'join=mitre mitre_limit=5.0') as geom FROM tbla),
tblc AS (SELECT row_number() over() AS id, ST_OffsetCurve(geom, 4) geom FROM tbla),
tbld AS (SELECT row_number() over() AS id, ST_SnapPolygonToLine(a.geom, b.geom) geom FROM tbla a JOIN tblc b ON true AND a.id=b.id),
tble AS (SELECT row_number() over() AS id, ST_OffsetCurve(geom, -4) geom FROM tbla),
tblf AS (SELECT row_number() over() AS id, ST_SnapPolygonToLine(a.geom, b.geom) geom FROM tbla a JOIN tble b ON true AND a.id=b.id),
tblg AS (SELECT row_number() over() AS id, ST_Union(a.geom, b.geom) geom FROM tbld a JOIN tblf b ON true AND a.id=b.id)
SELECT a.id, ST_Intersection(a.geom, b.geom) as geom FROM tblb a, tblg b WHERE ST_Intersects (a.geom, b.geom) AND a.id=b.id ORDER BY a.id

El resultado se muestra en la figura 1. enter image description here

Figura 1.

Si está satisfecho con los contornos suaves de los bordes del buffer, ejecute el siguiente script SQL:

WITH 
tbla AS (SELECT row_number() over() AS id, ST_LineSubstring( d.geom, substart, CASE WHEN subend > 1 THEN 1 ELSE subend END) geom
FROM (SELECT row_number() over() AS id, geom, ST_Length(geom) len, 8 sublen FROM line) AS d CROSS JOIN LATERAL (
    SELECT i, (sublen * i)/len AS substart, (sublen * (i+1))/len AS subend
        FROM generate_series(0, floor(d.len/sublen)::integer) AS t(i) WHERE (sublen * i)/len <> 1.0) AS d2),
tblb AS (SELECT row_number() over() AS id, ST_OffsetCurve(geom, 4) geom FROM tbla),
tblc AS (SELECT row_number() over() AS id, ST_OffsetCurve(geom, -4) geom FROM tbla)
(SELECT row_number() over() AS id, ST_SnapPolygonToLine(a.geom, b.geom) geom FROM tblb a JOIN tblc b ON true AND a.id=b.id)

El resultado se muestra en la imagen 2.

enter image description here

Figura 2.

Soluciones espaciales originales...

Traducido con www.DeepL.com/Translator (versión gratuita)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X