1 votos

Punto de búfer/expansión contenido dentro de otro polígono

Tengo un punto en una esquina de un cuadrado. Quiero hacer un buffer en ese punto con un tamaño especificado, pero no quiero que el buffer se extienda más allá del límite del polígono que tiene detrás. El buffer debe cumplir con el marco sin perder su 'área. Es mejor si el buffer es cuadrado.

El rosa en la imagen es el buffer que quiero. Supongo que tengo que hacer alguna consulta SQL, pero no sé cómo hacerlo.

Esto muestra lo que quiero

Los polígonos no son todos rectángulos, algunos son más como este:

introducir descripción de la imagen aquí

introducir descripción de la imagen aquí

introducir descripción de la imagen aquí

6voto

Nick Puntos 68

Puedes utilizar la herramienta Geometry by Expression en la capa de puntos con esta expresión:

-- crear un buffer cuadrado (cambiar el tamaño según sea necesario)
with_variable('buf', bounds(buffer($geometry, 500)),
-- obtener el polígono en el que se encuentra el punto actual (cambiar 'polígonos' por el nombre de tu capa)
with_variable('poly', overlay_within('polígonos', @geometry, limit:=1)[0],

    caso 
        -- borde izquierdo y inferior fuera
        when x_min(@buf) < x_min(@poly) and y_min(@buf) < y_min(@poly)
        then translate(@buf, abs(x_min(@buf) - x_min(@poly)), abs(y_min(@buf) - y_min(@poly)))

        -- borde derecho e inferior fuera
        when x_max(@buf) > x_max(@poly) and y_min(@buf) < y_min(@poly)
        then translate(@buf, -abs(x_max(@buf) - x_max(@poly)), abs(y_min(@buf) - y_min(@poly)))

        -- borde izquierdo y superior fuera
        when x_min(@buf) < x_min(@poly) and y_max(@buf) > y_max(@poly)
        then translate(@buf, abs(x_min(@buf) - x_min(@poly)), -abs(y_max(@buf) - y_max(@poly)))

        -- borde derecho y superior fuera
        when x_max(@buf) > x_max(@poly) and y_max(@buf) > y_max(@poly)
        then translate(@buf, -abs(x_max(@buf) - x_max(@poly)), -abs(y_max(@buf) - y_max(@poly)))

        -- borde inferior fuera
        when y_min(@buf) < y_min(@poly)
        then translate(@buf, 0, abs(y_min(@buf) - y_min(@poly)))

        -- borde superior fuera
        when y_max(@buf) > y_max(@poly)
        then translate(@buf, 0, -abs(y_max(@buf) - y_max(@poly)))

        -- borde izquierdo fuera
        when x_min(@buf) < x_min(@poly)
        then translate(@buf, abs(x_min(@buf) - x_min(@poly)), 0)

        -- borde derecho fuera
        when x_max(@buf) > x_max(@poly)
        then translate(@buf, -abs(x_max(@buf) - x_max(@poly)), 0)

        -- ningún borde fuera
        else @buf
    end
))

Asegúrate de que el tipo de geometría de salida sea Polígono.

introducir descripción de la imagen aquí

Resultado

Las líneas azules representan el buffer cuadrado original. El rojo es ese buffer desplazado si su geometría excede el límite del polígono.

introducir descripción de la imagen aquí

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