6 votos

¿Crear un buffer de extremo plano utilizando el generador de geometría en QGIS?

Soy nuevo en el mundo del software GIS y he conocido QGIS 2.18 como parte de mis prácticas.

Me han encargado la creación de nuevos estilos para los mapas de la empresa, pero he encontrado un problema con uno de los estilos solicitados.

Debía crear un estilo para una línea que creara un buffer para una línea y luego aplicara un gradiente dependiendo del ángulo de la línea (Esta parte la consigo usando el generador de geometría). Sin embargo, me devuelve el buffer de la línea como un óvalo y me gustaría que fuera de terminación plana (tomar una forma como un rectángulo).

Soy consciente de que v.buffer.distance permite crear extremos planos, pero espero obtener el mismo resultado pero utilizando el generador de geometría para poder guardarlo como estilo.

Buffer, and bounds(Buffer example

La imagen de arriba muestra lo que he conseguido al crear el buffer($geometry,0.05) frente al método bounds en ¿Utilizar el generador de geometría de QGIS para obtener un rectángulo a partir de un punto?

Para especificar de nuevo, quiero rectangular (?) el resultado que obtuve del buffer($geometry, 0.05)

0 votos

Tal vez este post pueda ayudar: ¿Utilizar el generador de geometría de QGIS para obtener un rectángulo a partir de un punto? El bounds puede ser útil dependiendo de cómo hayas creado tus geometrías :)

0 votos

He echado un vistazo al post. Aunque no conseguí que funcionaran todos (probablemente porque son para puntos), el de los límites funcionó y generó un polígono que tiene extremos planos pero que va de esquina a esquina. Editaré la pregunta e insertaré una imagen de los ejemplos.

6voto

Mue Puntos 2469

En QGIS 3.2 Hay funciones adicionales del buffer que puedes usar para estilizar tus líneas. Cada función tiene un conjunto de propiedades que puedes establecer, como el número de segmentos y, lo que es más importante en tu caso, establecer el estilo de unión (es decir, redondo, inglete (plano) o bisel). Estas opciones no están disponibles en QGIS 2.x, pero si puede acceder a la última versión de QGIS, podría seguir los pasos que se indican a continuación:


  1. Por el momento, sólo existe el single_sided_buffer que utiliza la propiedad de estilo de unión. Esto crea un búfer a cada lado de la línea, pero podemos utilizar dos de ellos y dividir la diferencia de ancho para que mira como un solo búfer. Podemos utilizar una expresión como:

    single_sided_buffer( geometry, distance, segments, join)

    donde:

    • geometry - Geometría actual
    • distance - Distancia del buffer (valores positivos = a la izquierda de la línea; valores negativos = a la derecha de la línea)
    • segments - Número de segmentos utilizados para representar círculos. Se trata de supuestamente para ser opcional, pero por alguna razón, necesito incluirlo, de lo contrario no funcionará.
    • join - Propiedad de unión (1 = redondo, 2 = inglete y 3 = bisel)

  1. Añadiremos una capa de símbolos para el generador de geometría y crearemos un lado del buffer con una expresión como

    single_sided_buffer( $geometry, 0.05, 0, 2)

    Symbology


  1. Añade otro y utiliza valores negativos:

    single_sided_buffer( $geometry, -0.05, 0, 2)

  1. Esto debería dar la apariencia de un rectangular buffer (las líneas rojas son las características de la línea original):

    Buffer

1 votos

Iba a sugerir esto. Pero con las líneas curvas no queda muy bien, los extremos no se alinean.

1 votos

Muchas gracias por compartir esto. ¿Supongo que si creara un estilo en la 3.2 no funcionaría en la 2.18? Si no es así, lo tendré en cuenta para el futuro.

0 votos

@HeikkiVesanto - Tienes razón, se ve "en bloque". Me pregunto si hay propiedades adicionales que podrían suavizar esto.

4voto

Braiam Puntos 120

Puede crear una capa virtual que transforme su línea en un polígono. A continuación, se puede aplicar un estilo a esta nueva capa.

Ir a layer / add layer / add - edit virtual layer y escriba la siguiente consulta. Renombrar a por su capa de líneas, y añada los campos que sean necesarios. 0.01 es el tamaño del búfer 1/2 (aquí en grados) y el final 0 / 1 es para el lado derecho o izquierdo.

Al mismo tiempo, puede calcular el acimut de la línea (ángulo entre la horizontal y el primer/último punto de la línea, expresado en radianes)

select id, 
 st_union(ST_SingleSidedBuffer(geometry,0.01,0) ,  ST_SingleSidedBuffer(geometry,0.01,1)),
 st_azimuth(st_startpoint(geometry),st_endpoint(geometry)) azim 
from a

enter image description here

0 votos

Este método funciona perfectamente, pero parece que me trastoca un poco el relleno, mi relleno era un degradado que dependía de cómo se dibujara la línea. ¿Sabe usted de una manera de mantener esa información para que el relleno gradiente seguiría ese ángulo? (Actualmente parece seguir la línea, pero lo que el punto es más alto en el eje y parecen ser clasificados como el punto cero, así que si dibujo punto superior primero y luego la parte inferior que se traduciría en el mismo gradiente que cuando dibujo punto inferior primero y luego la parte superior)

0 votos

@MateuszDabkowski ver edición. Puedes calcular el azimut de la línea al mismo tiempo.

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