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:
Publicar un comentario