jueves, 14 de julio de 2016

Bufer asimétrico y excéntrico

Una aplicación necesaria en proyectos lineales es la de realizar buffer asimétricos. Por ejemplo en líneas de transmisión la franja de tala  de vegetación (azul) está debajo de la línea de transmisión (verde), por lo tanto tiene una excentricidad con respecto al eje de diseño (rojo) que está centrado en la torre.

Solución en arcgis

En arcgis es posible hacer un buffer asimétrico uniendo dos buffer uno de lado izquierdo con un valor  y otro para el lado derecho con un valor diferente esto se puede definir en el campo "Side Type", se requerirían tres operaciones

En la siguiente figura se puede observar el eje en rojo, la flecha señala el sentido de la linea eje del buffer asimétrico. La zona en verde es el buffer que se generó con "Side Type" LEFT, la zona en rojo es el buffer que se generó con "Side Type" RIGHT. Al unir estas dos resultados se tiene una zona de aferencia con una distancia diferente a la izquierda y a la derecha del eje original

Para hacer un buffer excéntrico en arcgis también se requieren tres operaciones, dos buffer hacia el mismo lado de diferente longitud y después la diferencia entre los dos. En la figura se observa un buffer al lado izquierdo de color verde claro y otro hacia el mismo lado de menor longitud en color azul. Al hacer la diferencia (erase en caja de herramientas de arcgis) entre el verde claro y el azul (A-B) se obtiene un buffer excéntrico (en verde oscuro) con respecto al eje original (rojo).

Como se puede observar en la documentación oficial tanto la función de buffer a un solo lado como la de diferencia tienen la limitación de que requieren la licencia completa y más costosa de arcgis.

Solución en postgres

En postgres se puede crear un nueva función que realiza ya sea un buffer asimétrico o excéntrico recibiendo la geometrìa del eje, los valores numéricos de buffer y las opciones de remate:

CREATE OR REPLACE FUNCTION public.stx_buffer_asim(
    geom geometry,
    i double precision,
    d double precision,
    s text)
  RETURNS geometry AS
$BODY$
DECLARE
BEGIN
RETURN b.geom
FROM
(
    SELECT
    st_buffer(
    st_offsetcurve(a.geom, -(0.5*a.d+0.5*a.i)),
    0.5*(a.d-a.i),
    a.s) geom
    FROM
    (
    SELECT
    least(d,i) i, greatest(i,d) d, s, geom
geom, (2) i, (10) d, 'quad_segs=1'::text s
    )a
)b
;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
El menor de los dos valores numéricos se toma como el del borde izquierdo. 
least(d,i) i, greatest(i,d)
El parámetro de texto (s) usa la sintaxis de la función buffer de postgis para definir las opciones de terminación y unión de segmentos por ejemplo 'endcap=flat' genera un buffer de terminación plana (que también requiere la licencia más avanzada en Arcgis). La función utiliza dos operaciones y una aproximación diferente. La función offsetcurve (disponible desde postgis 2.0) genera un nuevo eje centrado en la franja asimétrica que se quiere generar
st_offsetcurve(a.geom, -(0.5*a.d+0.5*a.i))

Centrado en este nuevo eje se genera un buffer simétrico


No hay comentarios:

Publicar un comentario