Quiero búfer de ríos y quebradas para un mapa topográfico. Estoy usando un PostgreSQL/PostGIS base de datos. Por lo general, puedo crear buffer con ST_Buffer con un ancho constante.
Por ejemplo, el ancho de un río buffer debe ser el aumento de la primavera de la ría con un valor distinto.
Es allí una manera de crear búfer con un aumento o disminución de la anchura a partir de un distinto punto y termina en otro punto?
ACTUALIZACIÓN
Con la ayuda de simplexico traté de crear algunas geometrías que podría ayudar a crear un adelgazamiento de amortiguamiento alrededor de una cadena de línea:
Primero creo el búfer de líneas paralelas al río geom e insertarlos en una tabla denominada offsetcurve
:
WITH geometries AS (
SELECT
gid,
(ST_Dump(geom)).geom AS geom
FROM waterways
WHERE name='river_name')
SELECT
gid,
ST_OffsetCurve(geom, 10, 'quad_segs=4 join=mitre') AS pos_curve,
ST_Reverse(ST_OffsetCurve(geom,-10, 'quad_segs=4 join=mitre')) AS neg_curve
FROM geometries;
Tengo que usar la función de inversión de un paso más.
El siguiente paso es el volcado de los puntos desde el búfer de líneas y el río geom e insertarlos en una tabla denominada offsetpoints
:
SELECT
offsetcurve.gid,
(ST_DumpPoints(offsetcurve.pos_curve)).geom AS pos_curve_dump,
(ST_DumpPoints(offsetcurve.neg_curve)).geom AS neg_curve_dump,
ST_SetSRID((ST_DumpPoints(geometries.geom)).geom, 31468) AS river_dump
FROM offsetcurve, geometries
Después de que me la creación de líneas entre el búfer de puntos de la línea y el río geom puntos y almacenarlos en una tabla denominada offsetazimuth
:
SELECT
offsetpoints.gid,
ST_Azimuth(offsetpoints.pos_curve_dump, river_dump) AS pos_curve_azimuth,
ST_MakeLine(offsetpoints.pos_curve_dump, river_dump) AS pos_azimuth_line,
ST_Azimuth(offsetpoints.neg_curve_dump, river_dump) AS neg_curve_azimuth,
ST_MakeLine(offsetpoints.neg_curve_dump, river_dump) AS neg_azimuth_line
FROM offsetpoints
La visualización de todas las nuevas geometrías, tengo la siguiente imagen:
El rojo y el azul puntos son volcados a partir de la línea de búfer. Los puntos verdes son el río geom vertederos.
El azul y el rojo los puntos están conectados a los puntos verdes con el offsetazimuth línea.
Puedo cambiar la posición de los puntos de zona de influencia (por ejemplo, para una línea de búfer) a lo largo del acimut de la línea con:
SELECT
ST_MakePoint(
ST_X(st_endpoint(pos_azimuth_line)) - (ST_X(st_endpoint(pos_azimuth_line))-st_x(st_startpoint(pos_azimuth_line)))/6,
st_y(st_endpoint(pos_azimuth_line)) - (st_y(st_endpoint(pos_azimuth_line))-st_y(st_startpoint(pos_azimuth_line)))/6
) as geom
FROM offsetazimuth
Los resultados son los nuevos puntos con una distancia constante desde el río geom:
El primer paso de una solución final tiene que ser el primer punto de la distancia, como (buffer_width(B)-buffer_width(A))/count(river_dump_points)
(ver primera foto) desde el río de la geometría en la offsetazimuth línea (ver el último, pero una consulta).
Por ejemplo:
El primer punto tiene una distancia de (200m-100m)/100=1m
desde el río de la geometría, el segundo, ((200m-100m)/100)*2=2m
y así sucesivamente. 200m
es el ancho máximo,100m
es el ancho mínimo de la querían búfer. 100
es el número de vertidos puntos desde el río de la geom.
La pregunta es si este (el aumento o la disminución de valor de la distancia para cada línea de búfer punto) es posible con PostGIS!?
La siguiente idea que podría ser una función: los parámetros de configuración como el gradiente o la longitud donde el buffer tiene que tomar su lugar.