miércoles, 8 de enero de 2020

Matriz de distancia con puntos en el orden correcto

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: