26
26
__revision__ = '$Format:%H$'
27
27
28
28
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
30
30
from processing .core .GeoAlgorithm import GeoAlgorithm
31
31
from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
32
32
from processing .core .parameters import ParameterVector
@@ -106,12 +106,7 @@ def processAlgorithm(self, progress):
106
106
writer = self .getOutputFromName (self .OUTPUT ).getVectorWriter (
107
107
fields , geomType , layerPoints .crs ())
108
108
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 )
115
110
116
111
distance = QgsDistanceArea ()
117
112
distance .setSourceCrs (layerPoints .crs ().srsid ())
@@ -123,17 +118,13 @@ def processAlgorithm(self, progress):
123
118
for current , f in enumerate (features ):
124
119
src = f .geometry ().boundingBox ().center ()
125
120
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 )
134
125
135
126
attributes = f .attributes ()
136
- attributes .append (closest . name )
127
+ attributes .append (ft [ fieldName ] )
137
128
if units == 'Feet' :
138
129
attributes .append (hubDist * 3.2808399 )
139
130
elif units == 'Miles' :
@@ -142,8 +133,8 @@ def processAlgorithm(self, progress):
142
133
attributes .append (hubDist / 1000.0 )
143
134
elif units != 'Meters' :
144
135
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 )))
147
138
else :
148
139
attributes .append (hubDist )
149
140
@@ -153,16 +144,9 @@ def processAlgorithm(self, progress):
153
144
if geomType == QGis .WKBPoint :
154
145
feat .setGeometry (QgsGeometry .fromPoint (src ))
155
146
else :
156
- feat .setGeometry (QgsGeometry .fromPolyline ([src , closest . point ]))
147
+ feat .setGeometry (QgsGeometry .fromPolyline ([src , closest ]))
157
148
158
149
writer .addFeature (feat )
159
150
progress .setPercentage (int (current * total ))
160
151
161
152
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