Source code for stompy.spatial.qgis_spatialindex

from __future__ import print_function

# A wrapper around QGIS's builtin spatialindex class (which used to conflict with
# the python rtree / spatialindex implementation), to make it look like
# the rtree api.

import qgis.core as qc

#index = qc.QgsSpatialIndex()

#feat = qc.QgsFeature()
#gPnt = qc.QgsGeometry.fromPoint(qc.QgsPoint(1,1))
#feat.setGeometry(gPnt)

# qc.QgsPoint(25.4, 12.7)
# index.insertFeature(feat)

# currently, trigrid passes interleaved=False to Rtree().
#   the stream is ordered xxyy
#   all calls use xxyy.

[docs]class RtreeQgis(object): """ wrap qgis internal spatial index to look as much like Rtree class as possible """ def __init__(self,stream,interleaved=False): """ stream: an iterable, returning tuples of the form (id,[xmin,xmax,ymin,ymax],object) for now, requires that xmin==xmax, and ymin==ymax For now, only interleaved=False is supported. """ it = iter(stream) self.qsi = qc.QgsSpatialIndex() if interleaved: raise Exception("No support for interleaved index. You must use xxyy ordering") for feat_id,rect_xxyy,obj in it: self.insert(feat_id,rect=rect_xxyy)
[docs] def nearest(self, rect, count): results = self.qsi.nearestNeighbor(qc.QgsPointXY(rect[0],rect[2]), count) return results
[docs] def intersects(self,xxyy): """ This should be made compatible with the regular RTree call... """ rect = qc.QgsRectangle(xxyy[0],xxyy[2],xxyy[1],xxyy[3]) results = self.qsi.intersects(rect) return results
[docs] def make_feature(self,feat_id,rect): feat = qc.QgsFeature(feat_id) # feat.setFeatureId(feat_id) if rect[0] != rect[1] or rect[2]!=rect[3]: print( "WARNING: can only deal with point geometries right now" ) gPnt = qc.QgsGeometry.fromPointXY(qc.QgsPointXY(rect[0],rect[2])) feat.setGeometry(gPnt) return feat
[docs] def insert(self, feat_id, rect=None ): feat = self.make_feature(feat_id,rect=rect) self.qsi.insertFeature(feat)
[docs] def delete(self, feat_id, rect ): feat = self.make_feature(feat_id,rect = rect) self.qsi.deleteFeature(feat)