The trick is to create a function that access QGIS graphical interface, and that is piped to the query of the select by expression.
- Open a function editor (from anywhere, including from field calculator) and create a new function that reads the canvas extent and returns it as a geometry.
from qgis.core import *
from qgis.gui import *
from qgis.utils import iface
@qgsfunction(args='auto', group='Custom')
def currentExtent(feature, parent):
return QgsGeometry.fromRect(iface.mapCanvas().extent())
- Open the
select by expression and use intersects($geometry,currentExtent()) (or within(..) for entirely contained polygons)
The same function can be used in a virtual layer as shown here, that you could eventually modify to compute the buffer.
within ($geometry, @map_extent), but unfortunately, it does not work. But the answer by @JGH should solve your problem. – Babel Sep 09 '21 at 15:47