|
3 | 3 | from functools import partial
|
4 | 4 | from typing import TYPE_CHECKING
|
5 | 5 |
|
6 |
| -from qgis.core import QgsFeature, QgsFeatureRequest, QgsGeometry, QgsPointXY, QgsSpatialIndex, QgsVectorLayer |
| 6 | +from qgis.core import QgsFeature, QgsFeatureRequest, QgsPointXY, QgsRectangle, QgsSpatialIndex, QgsVectorLayer |
7 | 7 | from qgis.gui import QgsMapCanvas, QgsMapMouseEvent, QgsMapTool, QgsRubberBand
|
8 |
| -from qgis.PyQt.QtCore import QPoint, QTimer, pyqtSignal |
| 8 | +from qgis.PyQt.QtCore import QPoint, Qt, QTimer, pyqtSignal |
9 | 9 | from qgis.PyQt.QtGui import QColor
|
10 | 10 | from qgis.PyQt.QtWidgets import QMenu
|
| 11 | +from qgis.utils import OverrideCursor |
11 | 12 |
|
12 | 13 | if TYPE_CHECKING:
|
13 | 14 | from arho_feature_template.project.layers.plan_layers import PlanFeatureLayer
|
@@ -66,18 +67,20 @@ def canvasReleaseEvent(self, event: QgsMapMouseEvent): # noqa: N802
|
66 | 67 | def query_nearby_features(self, point: QgsPointXY) -> dict[QgsVectorLayer, list[QgsFeature]]:
|
67 | 68 | """Query all feature layers for features near (within `CLICK_POS_TOLERANCE`) the clicked point."""
|
68 | 69 | results = {}
|
69 |
| - for layer in self.layers: |
70 |
| - spatial_index = self.spatial_indexes.get(layer.id()) |
71 |
| - if spatial_index is None: |
72 |
| - continue |
73 |
| - |
74 |
| - # Buffer around the clicked point |
75 |
| - tolerance_geom = QgsGeometry.fromPointXY(point).buffer(self.CLICK_POS_TOLERANCE, 1) |
76 |
| - candidate_ids = spatial_index.intersects(tolerance_geom.boundingBox()) |
77 |
| - request = QgsFeatureRequest().setFilterFids(candidate_ids) |
78 |
| - features = [feat for feat in layer.getFeatures(request) if feat.geometry().intersects(tolerance_geom)] |
79 |
| - if features: |
80 |
| - results[layer] = features |
| 70 | + tolerance_geom = QgsRectangle( |
| 71 | + point.x() - self.CLICK_POS_TOLERANCE, |
| 72 | + point.y() - self.CLICK_POS_TOLERANCE, |
| 73 | + point.x() + self.CLICK_POS_TOLERANCE, |
| 74 | + point.y() + self.CLICK_POS_TOLERANCE, |
| 75 | + ) |
| 76 | + request = QgsFeatureRequest() |
| 77 | + request.setFilterRect(tolerance_geom) |
| 78 | + request.setFlags(QgsFeatureRequest.Flag.ExactIntersect) |
| 79 | + with OverrideCursor(Qt.WaitCursor): |
| 80 | + for layer in self.layers: |
| 81 | + features = list(layer.getFeatures(request)) |
| 82 | + if features: |
| 83 | + results[layer] = features |
81 | 84 |
|
82 | 85 | return results
|
83 | 86 |
|
|
0 commit comments