¿Crear buffers de una cara o líneas paralelas en PostGIS?

19

Estoy buscando una manera de crear los llamados búferes de una cara o líneas paralelas en PostGIS. Ejemplo: 1. búfer, 2. un lado, 3. ambos lados

Heencontradounpocodediscusiónenla lista de correo de 2009 y información que ha sido implementado en GEOS , pero nada sobre el estado actual de PostGIS.

En caso de que la función aún no esté implementada, ¿conoce alguna solución? ¿Es posible cortar un lado de un búfer normal?

    
pregunta underdark 15.08.2010 - 23:22

4 respuestas

13

Se suponía que los búferes de un solo lado adecuados han aterrizado en 1.5 , pero me parece que mientras los estilos aterrizó, el lado no llegó. Sin embargo, hay un parche actual que expone GEOSSingleSidedBuffer y realiza el búfer de una cara como se esperaba, con el nombre ST_OffsetCurve ; vea más antecedentes en ticket # 413 . En uso:

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1,'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)
    
respondido por el scw 16.08.2010 - 08:38
4

Esta muestra crea dos polígonos a cada lado de una serie lineal. Requiere PostGIS 1.5 o superior. No estoy seguro de qué tan bien manejará las líneas que se cruzan entre sí.

SELECT ST_AsText(geom)

FROM ST_Dump ((

SELECT 
  ST_Polygonize(GEOMUNION(ST_Boundary(ST_Buffer(the_geom, 0.5, 'endcap=flat join=round')), the_geom)) AS buffer_sides 
FROM
  (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') AS the_geom) AS table1

));

Da salida:

                        st_astext

------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------
 POLYGON((0.5 5,0.509607359798385 5.09754516100806,0.538060233744357 5.19134171618254,0.584265193848727 5.2777851165098,
0.646446609406726 5.35355339059327,0.722214883490199 5.41573480615127,0.808658283817455 5.46193976625564,0.9024548389919
36 5.49039264020162,1 5.5,5 5.5,5 5,1 5,1 1,0.5 1,0.5 5))
 POLYGON((5 5,5 4.5,1.5 4.5,1.5 1,1 1,1 5,5 5))
(2 rows)

El código funciona de la siguiente manera:

  1. Buffer de la cadena de líneas utilizando ST_Buffer. Aprovechamos la función PostGIS 1.5 que admite las tapas finales personalizadas para no especificar ningún límite final. Vea el ejemplo a continuación.
  2. Divida el polígono con búfer en dos, utilizando la línea original, utilizando el método documentado en el wiki .

Esto podría mejorarse para hacer frente a las líneas de cruce automático en el futuro.

    
respondido por el fmark 16.08.2010 - 04:13
3

Esta modificación crea dos cadenas lineales paralelas. Requiere PostGIS 1.5 o superior.

geometría requerida o wkt, y distancia en el búfer

SELECT astext(
     st_removepoint( 
     st_removepoint(        st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)')))         ,0),
      st_npoints(st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)'))))-2)

    ) as parallel
    FROM ST_Dump ((
    SELECT 
    ST_Polygonize(st_union(ST_Boundary(ST_Buffer(geometria, 0.5, 'endcap=flat join=mitre mitre_limit=5.0')), geometria)) AS buffer_sides 
    FROM
    (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') 
        AS geometria) AS tabla))

-------------- RESULTADOS

"LINESTRING(0.5 1,0.5 5.5,5 5.5)"
"LINESTRING(5 4.5,1.5 4.5,1.5 1)"
respondido por el 2 revs, 2 users 87%Dante Fuster 10.06.2011 - 17:47
0

Como todavía no puedo comentar aquí, agrego esta respuesta

SCW da la mejor respuesta,

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1, 'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

Pero parece que la función cambia
enlace

Ahora el parámetro 'right' no es necesario. El uso de la distancia positiva creará el lado izquierdo y la distancia negativa creará el lado derecho

Tampoco es necesario un parche con mi postgis

SELECT PostGIS_full_version();
"POSTGIS="2.0.3 r11132" GEOS="3.3.8-CAPI-1.7.8" 
PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.9.2, 
released 2012/10/08" LIBXML="2.7.8" LIBJSON="UNKNOWN" RASTER"
    
respondido por el Juan Carlos Oropeza 14.07.2014 - 20:54

Lea otras preguntas en las etiquetas