postgis – Alternativas a ST_OffsetCurve

Pregunta:

ST_OffsetCurve una consulta que crea una línea que es perpendicular a mi línea original usando ST_OffsetCurve para dibujar una línea a la izquierda y a la derecha de mi geometría original, que luego selecciono el centro de la línea usando ST_Interpolate y me conecto a través de ST_MakeLine . Si utilizo una distancia pequeña (desplazamiento de 100 m en una línea de 1 km), se conecta como se esperaba y no se devuelven errores de topología. Sin embargo, si aumento la distancia, se vuelve muy propenso a errores de topología, que son lanzados por GEOS. Siempre son errores de "primer argumento no es una línea" o "desajuste de profundidad". Debo señalar que las líneas son muy 'bloques', ya que tienen muchos giros de 90 grados, ya que son datos derivados de satélites.

No estoy completamente seguro de qué lo causa, pero ST_OffsetCurve no duplica mi línea a la perfección, siempre hay algunos artefactos a la izquierda y a la derecha, especialmente cerca del final de la línea, que creo que es la fuente de mis errores .

Explicaría el código, pero me temo que no es realmente fácil explicar lo que está sucediendo. Hay cinco funciones espaciales agrupadas en una para formar la línea (transformar, fusionar líneas, interpolar puntos de línea, desviar la curva, eliminar puntos repetidos). Está a continuación, si le interesa echarle un vistazo.

SELECT 
  ST_MakeLine(
    ST_Line_interpolate_point(
      ST_Transform(
        ST_OffsetCurve(  
          ST_RemoveRepeatedPoints( 
            ST_LineMerge( 
              ST_Transform( cl.geom,3857 )
            )
          ),
          {length},
          '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 )
            )
          ),
          -{length},
          'quad_segs=0 join=bevel'
        ), 4326
      ), 0.5
    )
  )
)

¿Qué alternativas a ST_OffsetCurve tengo aquí, o quizás hay algo que estoy haciendo mal?

Alternativamente, ¿hay alguna forma de compensar perfectamente la línea sin ninguna desviación de la línea de entrada?

Respuesta:

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

Su mejor enfoque es simplificar la línea antes de almacenar en búfer. Por ejemplo, si desea un búfer de 2 km, podría simplificar la línea, (por ejemplo) 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 se eliminarán simplificando las geometrías.

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım