He creado una consulta que crea una línea perpendicular a mi línea original utilizando ST_OffsetCurve
para dibujar una línea a la izquierda y a la derecha de mi geometría original, la cual luego selecciono el centro de la línea usando ST_Interpolate
y conecto a través de ST_MakeLine
. Si uso una distancia pequeña (100m de desplazamiento en una línea de 1km), se conecta como se espera y no se devuelven errores de topología. Sin embargo, si incremento la distancia se vuelve muy propenso a errores de topología, los cuales son arrojados por GEOS. Siempre son errores de "1er argumento no es una línea" o "incompatibilidad de profundidad". Debo señalar que las líneas son muy 'cuadradas', es decir, tienen muchos giros de 90 grados, ya que provienen de datos satelitales.
No estoy completamente seguro de qué lo causa, pero ST_OffsetCurve
no duplica mi línea perfectamente, siempre hay algunos artefactos a la izquierda y a la derecha, especialmente cerca del final de la línea, que yo creo que son la fuente de mis errores.
Explicaría el código pero temo que no es realmente fácil de explicar lo que está sucediendo. Hay cinco funciones espaciales combinadas en una para formar la línea (transformar, fusionar líneas, interpolar punto de línea, desplazar curva, eliminar puntos repetidos). Está abajo si deseas echarle un vistazo.
SELECT
ST_MakeLine(
ST_Line_interpolate_point(
ST_Transform(
ST_OffsetCurve(
ST_RemoveRepeatedPoints(
ST_LineMerge(
ST_Transform( cl.geom,3857 )
)
),
{longitud},
'quad_segs=0 join=bevel'
), 4326
), 0.5
),
(ST_Line_interpolate_point(
ST_Transform(
ST_OffsetCurve(
ST_RemoveRepeatedPoints(
ST_LineMerge(
ST_Transform( cl.geom,3857 )
)
),
-{longitud},
'quad_segs=0 join=bevel'
), 4326
), 0.5
)
)
)
¿Qué alternativas a ST_OffsetCurve
tengo aquí, o tal vez hay algo que estoy haciendo mal?
Como alternativa, ¿hay alguna manera de desplazar perfectamente la línea sin ninguna desviación de la línea de entrada?