6 votos

Cómo crear un tampón en una linestring con variación o aumento/disminución de la anchura

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.

enter image description here

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:

enter image description here

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:

enter image description here

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.

1voto

Michael Barker Puntos 8234

Es una manera de volver a utilizar esta respuesta

esto devuelve punto de inicio y final de línea , uso de desfase negativo para el otro lado

SELECT ST_StartPoint(ST_OffsetCurve(center_geom, startpointoffset) as start, ST_StartPoint(ST_OffsetCurve(center_geom, endpointoffset) as end,  from xx where yyy

esto hace que la línea de

SELECT ST_Makeline(l.start, l.end) FROM (SELECT ST_StartPoint(ST_OffsetCurve(center_geom, startpointoffset) as start, ST_StartPoint(ST_OffsetCurve(center_geom, endpointoffset) as end,  from xx where yyy) as l

solución para toda la zona

Primera toma de línea larga , de dividir a las líneas que contienen sólo 2 puntos (inicio y fin) y, a continuación, utilizar offsetcurve 4 veces, una vez para el lado derecho punto de partida , una vez que el lado derecho extremo y lo mismo para el lado izquierdo, a continuación, crear dos líneas. Después de todas las líneas, dibuja una línea desde el lado derecho extremo izquierdo lado extremo (inicio no necesita si usted usa desplazamiento 0 en el primer punto). Después de que ST_Polygonize puede ser la solución para la creación de polígonos a partir de líneas.

Si esta respuesta es útil me pueden ayudar con final SQL más tarde

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X