Skip to content

Commit e0c9733

Browse files
committed
[processing] speedup Hub distance algorithm (fix #15012)
1 parent 2d9b2a3 commit e0c9733

File tree

1 file changed

+10
-26
lines changed

1 file changed

+10
-26
lines changed

python/plugins/processing/algs/qgis/HubDistance.py

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
__revision__ = '$Format:%H$'
2727

2828
from qgis.PyQt.QtCore import QVariant
29-
from qgis.core import QGis, QgsField, QgsGeometry, QgsDistanceArea, QgsFeature
29+
from qgis.core import QGis, QgsField, QgsGeometry, QgsDistanceArea, QgsFeature, QgsFeatureRequest
3030
from processing.core.GeoAlgorithm import GeoAlgorithm
3131
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
3232
from processing.core.parameters import ParameterVector
@@ -106,12 +106,7 @@ def processAlgorithm(self, progress):
106106
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(
107107
fields, geomType, layerPoints.crs())
108108

109-
# Create array of hubs in memory
110-
hubs = []
111-
features = vector.features(layerHubs)
112-
for f in features:
113-
hubs.append(Hub(f.geometry().boundingBox().center(),
114-
unicode(f[fieldName])))
109+
index = vector.spatialindex(layerHubs)
115110

116111
distance = QgsDistanceArea()
117112
distance.setSourceCrs(layerPoints.crs().srsid())
@@ -123,17 +118,13 @@ def processAlgorithm(self, progress):
123118
for current, f in enumerate(features):
124119
src = f.geometry().boundingBox().center()
125120

126-
closest = hubs[0]
127-
hubDist = distance.measureLine(src, closest.point)
128-
129-
for hub in hubs:
130-
dist = distance.measureLine(src, hub.point)
131-
if dist < hubDist:
132-
closest = hub
133-
hubDist = dist
121+
neighbors = index.nearestNeighbor(src, 1)
122+
ft = layerHubs.getFeatures(QgsFeatureRequest().setFilterFid(neighbors[0])).next()
123+
closest = ft.geometry().boundingBox().center()
124+
hubDist = distance.measureLine(src, closest)
134125

135126
attributes = f.attributes()
136-
attributes.append(closest.name)
127+
attributes.append(ft[fieldName])
137128
if units == 'Feet':
138129
attributes.append(hubDist * 3.2808399)
139130
elif units == 'Miles':
@@ -142,8 +133,8 @@ def processAlgorithm(self, progress):
142133
attributes.append(hubDist / 1000.0)
143134
elif units != 'Meters':
144135
attributes.append(sqrt(
145-
pow(src.x() - closest.point.x(), 2.0) +
146-
pow(src.y() - closest.point.y(), 2.0)))
136+
pow(src.x() - closest.x(), 2.0) +
137+
pow(src.y() - closest.y(), 2.0)))
147138
else:
148139
attributes.append(hubDist)
149140

@@ -153,16 +144,9 @@ def processAlgorithm(self, progress):
153144
if geomType == QGis.WKBPoint:
154145
feat.setGeometry(QgsGeometry.fromPoint(src))
155146
else:
156-
feat.setGeometry(QgsGeometry.fromPolyline([src, closest.point]))
147+
feat.setGeometry(QgsGeometry.fromPolyline([src, closest]))
157148

158149
writer.addFeature(feat)
159150
progress.setPercentage(int(current * total))
160151

161152
del writer
162-
163-
164-
class Hub:
165-
166-
def __init__(self, point, name):
167-
self.point = point
168-
self.name = name

0 commit comments

Comments
 (0)