本文整理汇总了Python中qgis.core.QgsSpatialIndex.nearestNeighbor方法的典型用法代码示例。如果您正苦于以下问题:Python QgsSpatialIndex.nearestNeighbor方法的具体用法?Python QgsSpatialIndex.nearestNeighbor怎么用?Python QgsSpatialIndex.nearestNeighbor使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类qgis.core.QgsSpatialIndex
的用法示例。
在下文中一共展示了QgsSpatialIndex.nearestNeighbor方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: processAlgorithm
# 需要导入模块: from qgis.core import QgsSpatialIndex [as 别名]
# 或者: from qgis.core.QgsSpatialIndex import nearestNeighbor [as 别名]
def processAlgorithm(self, parameters, context, feedback):
if parameters[self.INPUT] == parameters[self.HUBS]:
raise QgsProcessingException(
self.tr('Same layer given for both hubs and spokes'))
point_source = self.parameterAsSource(parameters, self.INPUT, context)
hub_source = self.parameterAsSource(parameters, self.HUBS, context)
fieldName = self.parameterAsString(parameters, self.FIELD, context)
units = self.UNITS[self.parameterAsEnum(parameters, self.UNIT, context)]
fields = point_source.fields()
fields.append(QgsField('HubName', QVariant.String))
fields.append(QgsField('HubDist', QVariant.Double))
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Point, point_source.sourceCrs())
index = QgsSpatialIndex(hub_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setDestinationCrs(point_source.sourceCrs(), context.transformContext())))
distance = QgsDistanceArea()
distance.setSourceCrs(point_source.sourceCrs(), context.transformContext())
distance.setEllipsoid(context.project().ellipsoid())
# Scan source points, find nearest hub, and write to output file
features = point_source.getFeatures()
total = 100.0 / point_source.featureCount() if point_source.featureCount() else 0
for current, f in enumerate(features):
if feedback.isCanceled():
break
if not f.hasGeometry():
sink.addFeature(f, QgsFeatureSink.FastInsert)
continue
src = f.geometry().boundingBox().center()
neighbors = index.nearestNeighbor(src, 1)
ft = next(hub_source.getFeatures(QgsFeatureRequest().setFilterFid(neighbors[0]).setSubsetOfAttributes([fieldName], hub_source.fields()).setDestinationCrs(point_source.sourceCrs(), context.transformContext())))
closest = ft.geometry().boundingBox().center()
hubDist = distance.measureLine(src, closest)
if units != self.LAYER_UNITS:
hub_dist_in_desired_units = distance.convertLengthMeasurement(hubDist, units)
else:
hub_dist_in_desired_units = hubDist
attributes = f.attributes()
attributes.append(ft[fieldName])
attributes.append(hub_dist_in_desired_units)
feat = QgsFeature()
feat.setAttributes(attributes)
feat.setGeometry(QgsGeometry.fromPointXY(src))
sink.addFeature(feat, QgsFeatureSink.FastInsert)
feedback.setProgress(int(current * total))
return {self.OUTPUT: dest_id}
示例2: processAlgorithm
# 需要导入模块: from qgis.core import QgsSpatialIndex [as 别名]
# 或者: from qgis.core.QgsSpatialIndex import nearestNeighbor [as 别名]
def processAlgorithm(self, parameters, context, feedback):
source = self.parameterAsSource(parameters, self.INPUT, context)
if source is None:
raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))
output_file = self.parameterAsFileOutput(parameters, self.OUTPUT_HTML_FILE, context)
spatialIndex = QgsSpatialIndex(source, feedback)
distance = QgsDistanceArea()
distance.setSourceCrs(source.sourceCrs(), context.transformContext())
distance.setEllipsoid(context.project().ellipsoid())
sumDist = 0.00
A = source.sourceExtent()
A = float(A.width() * A.height())
features = source.getFeatures()
count = source.featureCount()
total = 100.0 / count if count else 1
for current, feat in enumerate(features):
if feedback.isCanceled():
break
neighbourID = spatialIndex.nearestNeighbor(
feat.geometry().asPoint(), 2)[1]
request = QgsFeatureRequest().setFilterFid(neighbourID).setSubsetOfAttributes([])
neighbour = next(source.getFeatures(request))
sumDist += distance.measureLine(neighbour.geometry().asPoint(),
feat.geometry().asPoint())
feedback.setProgress(int(current * total))
do = float(sumDist) / count
de = float(0.5 / math.sqrt(count / A))
d = float(do / de)
SE = float(0.26136 / math.sqrt(count ** 2 / A))
zscore = float((do - de) / SE)
results = {}
results[self.OBSERVED_MD] = do
results[self.EXPECTED_MD] = de
results[self.NN_INDEX] = d
results[self.POINT_COUNT] = count
results[self.Z_SCORE] = zscore
if output_file:
data = []
data.append('Observed mean distance: ' + str(do))
data.append('Expected mean distance: ' + str(de))
data.append('Nearest neighbour index: ' + str(d))
data.append('Number of points: ' + str(count))
data.append('Z-Score: ' + str(zscore))
self.createHTML(output_file, data)
results[self.OUTPUT_HTML_FILE] = output_file
return results
示例3: regularMatrix
# 需要导入模块: from qgis.core import QgsSpatialIndex [as 别名]
# 或者: from qgis.core.QgsSpatialIndex import nearestNeighbor [as 别名]
def regularMatrix(self, parameters, context, source, inField, target_source, targetField,
nPoints, feedback):
distArea = QgsDistanceArea()
distArea.setSourceCrs(source.sourceCrs(), context.transformContext())
distArea.setEllipsoid(context.project().ellipsoid())
inIdx = source.fields().lookupField(inField)
targetIdx = target_source.fields().lookupField(targetField)
index = QgsSpatialIndex(target_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setDestinationCrs(source.sourceCrs(), context.transformContext())), feedback)
first = True
sink = None
dest_id = None
features = source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([inIdx]))
total = 100.0 / source.featureCount() if source.featureCount() else 0
for current, inFeat in enumerate(features):
if feedback.isCanceled():
break
inGeom = inFeat.geometry()
if first:
featList = index.nearestNeighbor(inGeom.asPoint(), nPoints)
first = False
fields = QgsFields()
input_id_field = source.fields()[inIdx]
input_id_field.setName('ID')
fields.append(input_id_field)
for f in target_source.getFeatures(QgsFeatureRequest().setFilterFids(featList).setSubsetOfAttributes([targetIdx]).setDestinationCrs(source.sourceCrs(), context.transformContext())):
fields.append(QgsField(str(f[targetField]), QVariant.Double))
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, source.wkbType(), source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))
data = [inFeat[inField]]
for target in target_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setFilterFids(featList).setDestinationCrs(source.sourceCrs(), context.transformContext())):
if feedback.isCanceled():
break
outGeom = target.geometry()
dist = distArea.measureLine(inGeom.asPoint(),
outGeom.asPoint())
data.append(dist)
out_feature = QgsFeature()
out_feature.setGeometry(inGeom)
out_feature.setAttributes(data)
sink.addFeature(out_feature, QgsFeatureSink.FastInsert)
feedback.setProgress(int(current * total))
return {self.OUTPUT: dest_id}
示例4: linearMatrix
# 需要导入模块: from qgis.core import QgsSpatialIndex [as 别名]
# 或者: from qgis.core.QgsSpatialIndex import nearestNeighbor [as 别名]
def linearMatrix(self, parameters, context, source, inField, target_source, targetField, same_source_and_target,
matType, nPoints, feedback):
if same_source_and_target:
# need to fetch an extra point from the index, since the closest match will always be the same
# as the input feature
nPoints += 1
inIdx = source.fields().lookupField(inField)
outIdx = target_source.fields().lookupField(targetField)
fields = QgsFields()
input_id_field = source.fields()[inIdx]
input_id_field.setName('InputID')
fields.append(input_id_field)
if matType == 0:
target_id_field = target_source.fields()[outIdx]
target_id_field.setName('TargetID')
fields.append(target_id_field)
fields.append(QgsField('Distance', QVariant.Double))
else:
fields.append(QgsField('MEAN', QVariant.Double))
fields.append(QgsField('STDDEV', QVariant.Double))
fields.append(QgsField('MIN', QVariant.Double))
fields.append(QgsField('MAX', QVariant.Double))
out_wkb = QgsWkbTypes.multiType(source.wkbType()) if matType == 0 else source.wkbType()
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, out_wkb, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))
index = QgsSpatialIndex(target_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setDestinationCrs(source.sourceCrs(), context.transformContext())), feedback)
distArea = QgsDistanceArea()
distArea.setSourceCrs(source.sourceCrs(), context.transformContext())
distArea.setEllipsoid(context.project().ellipsoid())
features = source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([inIdx]))
total = 100.0 / source.featureCount() if source.featureCount() else 0
for current, inFeat in enumerate(features):
if feedback.isCanceled():
break
inGeom = inFeat.geometry()
inID = str(inFeat.attributes()[inIdx])
featList = index.nearestNeighbor(inGeom.asPoint(), nPoints)
distList = []
vari = 0.0
request = QgsFeatureRequest().setFilterFids(featList).setSubsetOfAttributes([outIdx]).setDestinationCrs(source.sourceCrs(), context.transformContext())
for outFeat in target_source.getFeatures(request):
if feedback.isCanceled():
break
if same_source_and_target and inFeat.id() == outFeat.id():
continue
outID = outFeat.attributes()[outIdx]
outGeom = outFeat.geometry()
dist = distArea.measureLine(inGeom.asPoint(),
outGeom.asPoint())
if matType == 0:
out_feature = QgsFeature()
out_geom = QgsGeometry.unaryUnion([inFeat.geometry(), outFeat.geometry()])
out_feature.setGeometry(out_geom)
out_feature.setAttributes([inID, outID, dist])
sink.addFeature(out_feature, QgsFeatureSink.FastInsert)
else:
distList.append(float(dist))
if matType != 0:
mean = sum(distList) / len(distList)
for i in distList:
vari += (i - mean) * (i - mean)
vari = math.sqrt(vari / len(distList))
out_feature = QgsFeature()
out_feature.setGeometry(inFeat.geometry())
out_feature.setAttributes([inID, mean, vari, min(distList), max(distList)])
sink.addFeature(out_feature, QgsFeatureSink.FastInsert)
feedback.setProgress(int(current * total))
return {self.OUTPUT: dest_id}
示例5: PolygonsParallelToLineAlgorithm
# 需要导入模块: from qgis.core import QgsSpatialIndex [as 别名]
# 或者: from qgis.core.QgsSpatialIndex import nearestNeighbor [as 别名]
#.........这里部分代码省略.........
self._rotateAndWritePolygon(polygon, writer)
def _rotateAndWriteSeleced(self, writer):
if self._isWriteSelected:
for polygon in self._polygonLayer.selectedFeatures():
self._rotateAndWritePolygon(polygon, writer)
else:
selectedPolygonsIds = self._polygonLayer.selectedFeaturesIds()
for p in self._polygonLayer.getFeatures():
if p.id() in selectedPolygonsIds:
self._rotateAndWritePolygon(p, writer)
else:
writer.addFeature(p)
def _rotateAndWritePolygon(self, polygon, writer):
self._progressBar()
self._p = polygon
self._initiateRotation()
writer.addFeature(self._p)
def _progressBar(self):
self._operationCounter += 1
currentPercentage = self._operationCounter / self._totalNumber * 100
self._progress.setPercentage(round(currentPercentage))
def _initiateRotation(self):
self._getNearestLine()
dist = self._nearLine.geometry().distance(self._p.geometry())
if not self._distance or dist <= self._distance:
self._simpleOrMultiGeometry()
def _getNearestLine(self):
self._center = self._p.geometry().centroid()
nearId = self._index.nearestNeighbor(self._center.asPoint(), 1)
self._nearLine = self._linesDict.get(nearId[0])
def _simpleOrMultiGeometry(self):
isMulti = self._p.geometry().isMultipart()
if isMulti and not self._multi:
dct = {}
mPolygonVertexes = self._p.geometry().asMultiPolygon()
for i, part in enumerate(mPolygonVertexes):
minDistance, vertexIndex = self._getNearestVertex(part[0])
dct[(i, vertexIndex)] = minDistance
i, vertexIndex = min(dct, key=dct.get)
self._nearestEdges(mPolygonVertexes[i][0], vertexIndex)
elif not isMulti:
polygonVertexes = self._p.geometry().asPolygon()[0][:-1]
vertexIndex = self._getNearestVertex(polygonVertexes)[1]
self._nearestEdges(polygonVertexes, vertexIndex)
def _getNearestVertex(self, polygonVertexes):
vertexToSegmentDict = {}
for vertex in polygonVertexes:
vertexGeom = QgsGeometry.fromPoint(vertex)
vertexToSegment = vertexGeom.distance(self._nearLine.geometry())
vertexToSegmentDict[vertexToSegment] = vertex
minDistance = min(vertexToSegmentDict.keys())
self._nearestVertex = vertexToSegmentDict[minDistance]
vertexIndex = polygonVertexes.index(self._nearestVertex)
return minDistance, vertexIndex
def _nearestEdges(self, polygonVertexes, vertexIndex):
# if vertex is first
if vertexIndex == 0:
示例6: spaced
# 需要导入模块: from qgis.core import QgsSpatialIndex [as 别名]
# 或者: from qgis.core.QgsSpatialIndex import nearestNeighbor [as 别名]
#.........这里部分代码省略.........
output = processing.run("qgis:polygonstolines", {'INPUT': output['OUTPUT'],
'OUTPUT': 'memory:'})
bar.setValue(50)
# this processing alg has as output['output'] the layer path...
poly_to_lines = output['OUTPUT']
output = processing.run("qgis:pointsalonglines", {'INPUT': poly_to_lines,
'DISTANCE': spaced_pts_distance,
'START_OFFSET': 0,
'END_OFFSET': 0,
'OUTPUT': 'memory:'})
bar.setValue(75)
receiver_points_memory_layer = output['OUTPUT']
del output
## Delete pts in buildings
# creates SpatialIndex
buildings_feat_all = buildings_layer.dataProvider().getFeatures()
buildings_spIndex = QgsSpatialIndex()
buildings_feat_all_dict = {}
for buildings_feat in buildings_feat_all:
buildings_spIndex.insertFeature(buildings_feat)
buildings_feat_all_dict[buildings_feat.id()] = buildings_feat
receiver_points_memory_layer_all = receiver_points_memory_layer.dataProvider().getFeatures()
receiver_points_layer_fields = QgsFields()
receiver_points_layer_fields.append(QgsField("id_pt", QVariant.Int))
receiver_points_layer_fields.append(QgsField("id_bui", QVariant.Int))
receiver_points_layer_writer = QgsVectorFileWriter(receiver_points_layer_path, "System",
receiver_points_layer_fields, QgsWkbTypes.Point,
buildings_layer.crs(), "ESRI Shapefile")
receiver_points_feat_id = 0
receiver_memory_feat_total = receiver_points_memory_layer.dataProvider().featureCount()
receiver_memory_feat_number = 0
for receiver_memory_feat in receiver_points_memory_layer_all:
receiver_memory_feat_number = receiver_memory_feat_number + 1
barValue = receiver_memory_feat_number/float(receiver_memory_feat_total)*25 + 75
bar.setValue(barValue)
rect = QgsRectangle()
rect.setXMinimum(receiver_memory_feat.geometry().asPoint().x() - distance_from_facades)
rect.setXMaximum(receiver_memory_feat.geometry().asPoint().x() + distance_from_facades)
rect.setYMinimum(receiver_memory_feat.geometry().asPoint().y() - distance_from_facades)
rect.setYMaximum(receiver_memory_feat.geometry().asPoint().y() + distance_from_facades)
buildings_selection = buildings_spIndex.intersects(rect)
to_add = True
receiver_geom = receiver_memory_feat.geometry()
building_id_correct = None
for buildings_id in buildings_selection:
building_geom = buildings_feat_all_dict[buildings_id].geometry()
intersectBuilding = QgsGeometry.intersects(receiver_geom, building_geom)
building_id_correct = buildings_id
if intersectBuilding:
to_add = False
building_id_correct = None
break
# picking the nearest building to the receiver point analysed
nearestIds = buildings_spIndex.nearestNeighbor(receiver_geom.asPoint(), 1)
building_fid = []
for featureId in nearestIds:
request = QgsFeatureRequest().setFilterFid(featureId)
for feature in buildings_layer.getFeatures(request):
dist = receiver_geom.distance(feature.geometry())
building_fid.append((dist, feature.id()))
building_fid_correct = min(building_fid, key=lambda x: x[0])[-1]
if to_add:
attributes = [receiver_points_feat_id, building_fid_correct]
fet = QgsFeature()
fet.setGeometry(receiver_memory_feat.geometry())
fet.setAttributes(attributes)
receiver_points_layer_writer.addFeature(fet)
receiver_points_feat_id = receiver_points_feat_id + 1
del receiver_points_layer_writer
receiver_points_layer_name = os.path.splitext(os.path.basename(receiver_points_layer_path))[0]
receiver_points_layer = QgsVectorLayer(receiver_points_layer_path, str(receiver_points_layer_name), "ogr")
QgsProject.instance().addMapLayers([receiver_points_layer])
QgsProject.instance().reloadAllLayers()
示例7: processAlgorithm
# 需要导入模块: from qgis.core import QgsSpatialIndex [as 别名]
# 或者: from qgis.core.QgsSpatialIndex import nearestNeighbor [as 别名]
def processAlgorithm(self, parameters, context, feedback):
"""
Here is where the processing itself takes place.
"""
# Retrieve the feature source and sink. The 'dest_id' variable is used
# to uniquely identify the feature sink, and must be included in the
# dictionary returned by the processAlgorithm function.
arrets = self.parameterAsSource(parameters, self.STOPS, context)
stop_id=self.parameterAsFields(parameters,self.STOP_ID,context)[0]
noeuds = self.parameterAsSource(parameters, self.NOEUDS, context)
node_id=self.parameterAsFields(parameters,self.NODE_ID,context)[0]
mode_i=self.parameterAsString(parameters,self.MODE_ORI,context)
mode_j=self.parameterAsString(parameters,self.MODE_DES,context)
texte_i=self.parameterAsString(parameters,self.TEXTE_ORI,context)
texte_j=self.parameterAsString(parameters,self.TEXTE_DES,context)
rayon=self.parameterAsDouble(parameters,self.RAYON,context)
vitesse=self.parameterAsDouble(parameters,self.VITESSE,context)
nb_max=self.parameterAsInt(parameters,self.MAX_NB,context)
# Compute the number of steps to display within the progress bar and
# get features from source
##a=fenetre.split(",")
##fenetre2=QgsRectangle(float(a[0]),float(a[2]),float(a[1]),float(a[3]))
arr=[a for a in arrets.getFeatures()]
nb=len(arr)
index=QgsSpatialIndex(noeuds.getFeatures())
champs=QgsFields()
champs.append(QgsField('i',QVariant.String,len=15))
champs.append(QgsField('j',QVariant.String,len=15))
champs.append(QgsField(self.tr('length'),QVariant.Double))
champs.append(QgsField(self.tr('time'),QVariant.Double))
champs.append(QgsField(self.tr('mode'),QVariant.String,len=10))
(table_connecteurs,dest_id) = self.parameterAsSink(parameters, self.CONNECTEURS,context,champs, QgsWkbTypes.LineString, noeuds.sourceCrs())
nom_fichier=dest_id
fichier_connecteurs=os.path.splitext(nom_fichier)[0]+".txt"
sortie=codecs.open(fichier_connecteurs,"w",encoding="utf-8")
nbc=0
for i,n in enumerate(arr):
near=index.nearestNeighbor(n.geometry().centroid().asPoint(),nb_max)
feedback.setProgress(i*100/nb)
if len(near)>0:
for k,nearest in enumerate(near):
if k<nb_max:
f=noeuds.getFeatures(request=QgsFeatureRequest(nearest))
for j, g in enumerate(f):
if j==0:
l=n.geometry().distance(g.geometry())
id_node=unicode(g.attribute(node_id))
id_stop=unicode(n.attribute(stop_id))
if l<rayon:
nbc+=1
gline=QgsGeometry.fromPolylineXY([QgsPointXY(n.geometry().centroid().asPoint()),QgsPointXY(g.geometry().centroid().asPoint())])
hline=QgsGeometry.fromPolylineXY([QgsPointXY(g.geometry().centroid().asPoint()),QgsPointXY(n.geometry().centroid().asPoint())])
fline=QgsFeature()
fline.setGeometry(gline)
ll=gline.length()
moda=unicode(mode_i)+unicode(mode_j)
if vitesse<=0:
fline.setAttributes([id_stop,id_node, ll/1000,0.0,moda])
else:
fline.setAttributes([id_stop,id_node, ll/1000,ll*60/(vitesse*1000),moda])
fline2=QgsFeature()
fline2.setGeometry(hline)
modb=unicode(mode_j)+unicode(mode_i)
if vitesse<=0:
fline2.setAttributes([id_node,id_stop, ll/1000,0,modb])
else:
fline2.setAttributes([id_node,id_stop, ll/1000,ll*60/(vitesse*1000),modb])
table_connecteurs.addFeature(fline)
table_connecteurs.addFeature(fline2)
if vitesse>0:
sortie.write(id_node+';'+id_stop+';'+str((60/vitesse)*(ll/1000.0))+';'+str(ll/1000.0)+';-1;-1;-1;-1;-1;'+modb+';'+modb+'\n')
sortie.write(id_stop+';'+id_node+';'+str((60/vitesse)*(ll/1000.0))+';'+str(ll/1000.0)+';-1;-1;-1;-1;-1;'+moda+';'+moda+'\n')
else:
sortie.write(id_node+';'+id_stop+';'+str(0.0)+';'+str(ll/1000.0)+';-1;-1;-1;-1;-1;'+modb +';'+modb+'\n')
sortie.write(id_stop+';'+id_node+';'+str(0.0)+';'+str(ll/1000.0)+';-1;-1;-1;-1;-1;'+moda+';'+moda+'\n')
feedback.setProgressText(unicode(nbc)+"/"+unicode(nb)+self.tr(" connected nodes"))
sortie.close()
return {self.OUTPUT: dest_id}
示例8: Worker
# 需要导入模块: from qgis.core import QgsSpatialIndex [as 别名]
# 或者: from qgis.core.QgsSpatialIndex import nearestNeighbor [as 别名]
#.........这里部分代码省略.........
# self.inpvl.crs(), self.joinvl.crs(), transcontext))
inputgeom.transform(QgsCoordinateTransform(
self.inpvl.crs(), self.joinvl.crs(),
QgsProject.instance()))
except:
import traceback
self.error.emit(self.tr('CRS Transformation error!') +
' - ' + traceback.format_exc())
self.abort = True
return
# Find the closest feature!
nnfeature = None
minfound = False
mindist = float("inf")
# If the input layer's geometry type is point, or has been
# approximated to point (centroid), then a join index will
# be used.
# if ((QgsWkbTypes.geometryType(self.inpWkbType) == QgsWkbTypes.PointGeometry and
# not QgsWkbTypes.isMultiType(self.inpWkbType)) or self.approximateinputgeom):
if (self.approximateinputgeom or
self.inpWkbType == QgsWkbTypes.Point or
self.inpWkbType == QgsWkbTypes.Point25D):
# Are there points on the join side?
# Then the index nearest neighbour function is sufficient
# if ((QgsWkbTypes.geometryType(self.joinWkbType) == QgsWkbTypes.PointGeometry and
# not QgsWkbTypes.isMultiType(self.joinWkbType)) or self.usejoinlayerapprox):
if (self.usejoinlayerapprox or
self.joinWkbType == QgsWkbTypes.Point or
self.joinWkbType == QgsWkbTypes.Point25D):
# Is it a self join?
if self.selfjoin:
# Have to consider the two nearest neighbours
nearestids = self.joinlind.nearestNeighbor(
inputgeom.asPoint(), 2)
fch = 0 # Which of the two features to choose
if (nearestids[0] == infeatureid and
len(nearestids) > 1):
# The first feature is the same as the input
# feature, so choose the second one
fch = 1
# Get the feature!
if False:
#if self.selectedjoonly:
# This caused problems (wrong results) in QGIS 3.0.1
nnfeature = next(
self.joinvl.getSelectedFeatures(
QgsFeatureRequest(nearestids[fch])))
else:
nnfeature = next(self.joinvl.getFeatures(
QgsFeatureRequest(nearestids[fch])))
# Not a self join
else:
# Not a self join, so we search for only the
# nearest neighbour (1)
nearestids = self.joinlind.nearestNeighbor(
inputgeom.asPoint(), 1)
# Get the feature!
if len(nearestids) > 0:
nearestid = nearestids[0]
nnfeature = next(self.joinvl.getFeatures(
QgsFeatureRequest(nearestid)))
#else:
#if self.selectedjoonly:
# nnfeature = next(self.joinvl.getSelectedFeatures(
# QgsFeatureRequest(nearestid)))