In QGIS, I'm trying to select all the feature that are visible in my map extent. But I can't find a solution with "select by expression" or something else.

I will use your tips inside model builder to make a buffer of 5 meters around my polygons, but only on those which are visible in my map extent.

  • I tried within ($geometry, @map_extent), but unfortunately, it does not work. But the answer by @JGH should solve your problem.
    – Babel
    Sep 9 at 15:47

The trick is to create a function that access QGIS graphical interface, and that is piped to the query of the select by expression.

  1. 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())
  1. Open the select by expression and use intersects($geometry,currentExtent()) (or within(..) for entirely contained polygons)

PS: the same function can be used in a virtual layer as shown here, that you could eventually modify to compute the buffer.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.