<div dir="auto">Wonderful, I'm going to try that. Muchas gracias!<div dir="auto"><br></div><div dir="auto">Jo</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jan 19, 2020, 16:36 Jorge Gustavo Rocha <<a href="mailto:jgr@di.uminho.pt">jgr@di.uminho.pt</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Jo,<br>
<br>
You can use setFilterRect (see<br>
<a href="https://docs.qgis.org/3.4/en/docs/pyqgis_developer_cookbook/vector.html" rel="noreferrer noreferrer" target="_blank">https://docs.qgis.org/3.4/en/docs/pyqgis_developer_cookbook/vector.html</a>).<br>
<br>
request = QgsFeatureRequest().setFilterRect(iface.mapCanvas().extent())<br>
for feature in layer.getFeatures(request):<br>
        print(<a href="http://feature.id" rel="noreferrer noreferrer" target="_blank">feature.id</a>)<br>
<br>
This way, you only iterate over the visible features.<br>
<br>
Regards,<br>
<br>
Jorge Gustavo<br>
<br>
On 18/01/20 20:39, Jo wrote:<br>
> Hi,<br>
> <br>
> I created the following code:<br>
> <br>
> class FBSegmentPoiComboBox(FBComboBox):<br>
>     def __init__(self, name, identifier=None, update_method=None, iface=None):<br>
>         super().__init__(name=name, identifier=identifier, update_method=update_method)<br>
>         self.iface = iface<br>
>         self.items_list = []<br>
>         self.find_segments()<br>
>         self.rubber_band = QgsRubberBand(self.iface.mapCanvas(), False)<br>
>         self.rubber_band.setWidth(12)<br>
>         self.rubber_band.setStrokeColor(QColor.fromRgb(90, 0, 20))<br>
>         self.highlighted.connect(self.highlight_segment)<br>
>         self.currentIndexChanged.connect(self.clear_rubberband)<br>
> <br>
>     def find_segments(self):<br>
>         self.clear()<br>
>         self.add_item(REFRESH_SEGMENTS_LIST, None)<br>
>         # put a dummy at position 0<br>
> self.items_list = ['dummy']<br>
>         segment_layer_list = QgsProject.instance().mapLayersByName('segment')<br>
>         if segment_layer_list:<br>
>             segment_layer = segment_layer_list[0]<br>
>             layer = QgsProject.instance().layerTreeRoot().findLayer(segment_layer)<br>
>             if layer:<br>
>                 layer.setItemVisibilityChecked(True)<br>
>             if self.iface:<br>
>                 segments = QgsSpatialIndex()<br>
>                 for segment in segment_layer.getFeatures():<br>
>                     segments.insertFeature(segment)<br>
>                 nearby = segments.nearestNeighbor(self.iface.mapCanvas().center(), neighbors=10) # , maxDistance=1000)<br>
> for featureId in nearby:<br>
>                     fit2 = segment_layer.getFeatures(QgsFeatureRequest().setFilterFid(featureId))<br>
>                     ftr = QgsFeature()<br>
>                     fit2.nextFeature(ftr)<br>
>                     self.add_item(ftr.attribute(0), ftr.attribute(0))<br>
>                     self.items_list.append(ftr)<br>
>         self.changed = False<br>
> <br>
> def highlight_segment(self, index):<br>
>         self.rubber_band.reset()<br>
>         if index == 0:<br>
>             self.find_segments()<br>
>         elif index < len(self.items_list):<br>
>             self.rubber_band.setToGeometry(self.items_list[index].geometry())<br>
> <br>
>     def clear_rubberband(self, index):<br>
>         self.rubber_band.reset()<br>
> <br>
> <br>
> It populates a drop down with all the LineStrings near to the center of the screen.<br>
> <br>
> It's not very efficient though, as I need to first pass all the LineStrings on that particular layer to it.<br>
> <br>
> Is there a way to replace this code:<br>
> <br>
>                 for segment in segment_layer.getFeatures():<br>
>                     segments.insertFeature(segment)<br>
> <br>
> So it only works on a smaller subset of features that are actually visible to on the user's screen?<br>
> <br>
> Jo<br>
> <br>
> <br>
> _______________________________________________<br>
> QGIS-Developer mailing list<br>
> <a href="mailto:QGIS-Developer@lists.osgeo.org" target="_blank" rel="noreferrer">QGIS-Developer@lists.osgeo.org</a><br>
> List info: <a href="https://lists.osgeo.org/mailman/listinfo/qgis-developer" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a><br>
> Unsubscribe: <a href="https://lists.osgeo.org/mailman/listinfo/qgis-developer" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a><br>
> <br>
<br>
J. Gustavo<br>
-- <br>
Jorge Gustavo Rocha<br>
Departamento de Informática<br>
Universidade do Minho<br>
4710-057 Braga<br>
Gabinete 3.29 (Piso 3)<br>
Tel: +351 253604480<br>
Fax: +351 253604471<br>
Móvel: +351 910333888<br>
skype: nabocudnosor<br>
_______________________________________________<br>
QGIS-Developer mailing list<br>
<a href="mailto:QGIS-Developer@lists.osgeo.org" target="_blank" rel="noreferrer">QGIS-Developer@lists.osgeo.org</a><br>
List info: <a href="https://lists.osgeo.org/mailman/listinfo/qgis-developer" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a><br>
Unsubscribe: <a href="https://lists.osgeo.org/mailman/listinfo/qgis-developer" rel="noreferrer noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a></blockquote></div>