jueves, 22 de junio de 2017

Cómo medir la distancia media entre puntos, para un radio fijo, mediante PyQGIS

El código siguiente permite determinar la distancia media, en un radio de 500 m, para todos los rasgos de un vectorial de puntos. Para evitar repeticiones innecesarias en las determinaciones de distancias se emplea el método 'combinations' del módulo itertools. Para verificar que el código se comporta de la manera esperada se determinan los índices correspondientes a cada grupo de distancias que satifacen el requerimiento.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import itertools
import numpy as np

layer = iface.activeLayer()

feats = [ feat for feat in layer.getFeatures() ]

n = len(feats)

comb = range(n)

distances = [ [] for i in range(n) ]
indexes = [ [] for i in range(n) ]

for i, j in itertools.combinations(comb, 2):

    dist = feats[i].geometry().distance(feats[j].geometry())

    if dist < 500:
        distances[i].append(dist)
        indexes[i].append([i,j])

for i, group in enumerate(distances):
    print i, np.mean(group)

print "Done!"

La ejecución del código anterior para el vectorial siguiente con 250 features:


imprime en la Python Console de QGIS los índices de los rasgos y las medias si corresponde. A continuación se observa un extracto de ellas.

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
0 247.465031352
1 214.562246297
2 nan
3 189.574942919
4 nan
5 217.824344254
6 349.317512486
7 488.048322459
8 361.248613788
9 335.670536721
10 334.301813118
11 331.55702782
12 330.198383101
.
.
.
201 453.074278044
202 363.40960241
203 304.891753463
204 183.635649004
205 nan
206 490.466979717
207 nan
208 280.437793607
209 319.068302497
210 nan
211 137.489027251
212 nan
213 341.566332757
214 433.546874239
215 nan
216 nan
217 466.526203964
218 282.28621432
219 174.092213979
220 342.816797481
221 472.338783981
222 nan
223 nan
224 nan
225 412.331021077
226 nan
227 nan
228 nan
229 397.254280768
230 nan
231 nan
232 nan
233 nan
234 nan
235 nan
236 nan
237 331.414378912
238 nan
239 nan
240 nan
241 nan
242 nan
243 nan
244 nan
245 nan
246 nan
247 nan
248 nan
249 nan

Como el punto con id = 2 refleja la imposibilidad de calcular una media, la imagen siguiente permite corroborar que para el referido rasgo no existe ningún punto a menos de 500 m de el.


Otra corroboración fue hecha con los valores obtenidos para el punto con id = 0, tal como se presentan a continuación, y los resultados fueron tal como se esperaban.

1
2
3
4
>>>distances[0]
[130.83078719752868, 286.9391760435126, 181.1325815019598, 486.55852003895126, 116.50750219654094, 350.03091547175427, 152.08651552382634, 180.24248462812838, 342.85679956243325]
>>>indexes[0]
[[0, 16], [0, 45], [0, 63], [0, 78], [0, 100], [0, 132], [0, 146], [0, 206], [0, 216]] 


No hay comentarios: