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
.
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.