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.