Algunos algoritmos de QGIS, aunque funcionan, no producen los resultados esperados en cuanto a los índices espaciales. Es lo que se desprende de la utilización del algoritmo qgis:distancematrix de la Processing ToolBox en una pregunta de gis.stackexchange.com. Los azimuths determinados para el vecino más próximo no se encuentran asociados a los respectivos índices espaciales. Para resolver ese problema se propuso el script siguiente:
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 | import numpy as np layer = iface.activeLayer() feats = [ feat for feat in layer.getFeatures() ] n = len(feats) distances = [ [] for i in range(n) ] indices = [ [] for i in range(n) ] ##determining distances and indices for each pair of points ##itertools python module (for avoiding repeated distances values) produces wrong results for i in range(n): for j in range(n): if i != j: distances[i].append(feats[i].geometry().distance(feats[j].geometry())) indices[i].append([i,j]) min_distance = [] #determining min distance for each pair of points for i, item in enumerate(distances): min_distance.append((np.min(item))) index_dist = [] #determining index for min distance in distances list for i, item in enumerate(distances): for j, element in enumerate(item): if min_distance[i] == element: index_dist.append(j) index_closest_pairs = [] #determining indices for min distance (closest pairs) in indices list for i, index in enumerate(indices): index_closest_pairs.append(index[index_dist[i]]) #determining azimuth for closest_pairs for item in index_closest_pairs: print(feats[item[0]].geometry().asPoint().azimuth(feats[item[1]].geometry().asPoint())) |
El script anterior determina en el orden siguiente:
- distancias, índices y distancia mínima para cada par de puntos
- índice para la distancia mínima en la lista de puntos
- índices para la distancia mínima (closest pairs) en la lista de índices
- azimuth para los pares más próximos
Éste se probó con la capa de puntos (sólo 20 puntos) de la imagen siguiente:
Cada "closest pair" fue manualmente corroborado con la lista index_closest_pairs:
y cada par obtenido estuvo de acuerdo con lo esperado.
Después de ejecutado el script anterior los valores de azimuths imprimidos en la Python console, en el orden correcto, fueron:
-15.17811103645111 151.15349295781988 52.82637775713254 158.15282481491224 14.954150539186188 -12.955243712564535 17.40354742643329 74.83217815029472 98.89967179370501 -162.59645257356672 106.2360708587406 -105.16782184970529 172.15558560326318 -165.04584946081383 167.04475628743546 -155.89332967752063 -73.76392914125941 -81.100328206295 164.8218889635489 -178.84549335216983
No hay comentarios:
Publicar un comentario