3.4 Procesa datos. Ubica los puntos en gráfica 2D o 3D

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