Para revisar los datos de coordenadas y ubicaciones obtenidos en el proceso anterior, se grafica la ubicación de los puntos usando las coordenadas este, norte y altura registradas con el GPS diferencial.
Las gráficas se pueden realizar en 2D y en 3D, se adjunta los resultados:
Como referencia se usan las etiquetas de los gateways que permiten observar la posición relativa de cada punto.
Los grupos de puntos a mostrar se pueden seleccionar en el bloque de ingreso dentro de los parámetros de la gráfica, permitiendo obervar con mayor detalle la ubicación de cada punto
Una observación en 3D de los puntos permite revisar que lso valores de altura presentan menor precisión que la de posición, principalmente en puntos ubicados entre vegetación.
Se observa que las medidas de alturas tienen valores muy variables, por lo que el uso de los valores de altura se descarta inicialmente de los modelos. Se podría realizar posteriormente un análisis más detallado de lo presentado con los valores de las alturas.
archivo de resumen de coordenadas y distancias : resumen_ubica01.txt
Algoritmo en Python
En el caso de gráficas 3D, para crear el archivo.gif animado es necesario instalar imagemagic. El nombre del archivo animado es ‘rotando3D.gif’ que se guarda en el mismo directorio del algoritmo.py.
# Datos desde GPS Diferencial archivo.txt # Graficas de coordenadas 2D o 3D # Girni 2020-10-07 edelros@espol.edu.ec import numpy as np import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import matplotlib.animation as animation # INGRESO # Archivo procesado con distancias arch_gpsrsm = 'resumen_ubica01.txt' # Parametros de gráfica mostrargrp = ['FIEC','FCNM','RECT'] # ['FIEC','FCNM','RECT','CIRC'] mostrartip = ['punto','1m','dispositivo','gtw'] # ['punto','1m','dispositivo','gtw'] tipograf = '3D' # '2D','3D' arch_rotacion = 'rotando3D.gif' # Referencias baliza = {'d1':'gtwRECT', 'd2':'gtwFIEC', 'd3':'gtwFCNM'} grupo = ['FIEC' ,'FCNM' ,'RECT','CIRC'] colores = ['green','orange','grey','magenta'] tipo = ['punto','1m' ,'gtw','dispositivo'] marcas = [ 'o','D' ,'D' ,'*' ] # PROCEDIMIENTO # leer coordenadas ubica = pd.read_csv(arch_gpsrsm, index_col='etiqueta') ubica = pd.DataFrame(ubica) n = len(ubica) # puntos de vertices vertices = ubica.loc[baliza.values()] # segmento de grupo/tipo ubica['usar'] = False ubica['color'] = 'yellow' ubica['marca'] = 'o' for fila in ubica.index: unaeti = str(fila) ungrupo = ubica['grupo'][fila] untipo = ubica['tipo'][fila] cond1 = ungrupo in mostrargrp cond2 = untipo in mostrartip if cond1: cual = grupo.index(ungrupo) ubica.loc[fila,'color'] = colores[cual] if cond2: cual = tipo.index(untipo) ubica.loc[fila,'marca'] = marcas[cual] if (cond1 and cond2): ubica.loc[fila,'usar'] = True # SALIDA print(ubica.head()) # Grafica 2D -------------------------- if tipograf == '2D': figura, grafica = plt.subplots() for fila in ubica.index: unalon = ubica['c_este'][fila] unalat = ubica['c_norte'][fila] unaalt = ubica['altitud'][fila] usar = ubica['usar'][fila] uncolor = ubica['color'][fila] unamarca = ubica['marca'][fila] untipo = ubica['tipo'][fila] if usar: grafica.scatter(unalon,unalat, color = uncolor, marker = unamarca, label = fila) if usar and untipo=='gtw': grafica.annotate(fila, (unalon,unalat)) plt.xlabel('UTM_este') plt.ylabel('UTM_norte') plt.title('Ubicacion UTM') plt.show() # Grafica 3D -------------------------- if tipograf == '3D': figura = plt.figure() grafica = Axes3D(figura) for fila in ubica.index: unalon = ubica['c_este'][fila] unalat = ubica['c_norte'][fila] unaalt = ubica['altitud'][fila] usar = ubica['usar'][fila] uncolor = ubica['color'][fila] unamarca = ubica['marca'][fila] untipo = ubica['tipo'][fila] if usar: grafica.scatter(unalon,unalat, unaalt, marker = unamarca, color = uncolor, label = fila) if (usar and (untipo=='gtw')): grafica.text(unalon,unalat, unaalt,fila) grafica.set_xlabel('UTM_este') grafica.set_ylabel('UTM_norte') grafica.set_zlabel('altitud') grafica.set_title('Ubicacion UTM') def rotate(angle): grafica.view_init(azim=angle) print("realizando animation") rot_animation = animation.FuncAnimation(figura, rotate, frames = np.arange(45,360+45,10), interval = 200) rot_animation.save(arch_rotacion, dpi=80, writer = animation.PillowWriter(fps=5)) plt.show()
Referencia: Graficas 3D puntos dispersos-scatter en métodos numéricos