5 votos

Alternativas a ST_OffsetCurve

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?

5voto

hernan43 Puntos 566

Los datos 'blocky' generarán algunos errores extraños con un búfer en mitra, ya que intenta extender cada borde de la línea hacia afuera. Y sí, esta probabilidad de errores topológicos aumenta con tamaños de búfer más grandes.

El mejor enfoque es simplificar la línea antes de realizar el búfer. Por ejemplo, si desea un búfer de 2 km, podría simplificar la línea en un 5% de la distancia del búfer:

ST_OffsetCurve(ST_Simplify(geom, 100.0), 2000.0, 'quad_segs=0 join=bevel')

Pero ajuste la tolerancia de ST_Simplify hasta que se vea adecuada (enfoque de prueba y error). Además, no necesitará ST_RemoveRepeatedPoints, ya que estos puntos repetidos serán eliminados al simplificar las geometrías.

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