
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