3.3 Procesa datos. Coordenadas GPS y distancias al archivo.txt

Procesa las coordenadas de cada punto medido, registradas en un archivo de texto usando un GPS Diferencial.

Las coordenadas se encuentran en formato UTM ubicadas en la zona «17 M».

Ejemplo de archivo de coordenadas del GPS Diferencial

item,c_norte,c_este,altitud,etiqueta
6,9762822.08,614817.64,62.213,FIEC101
8,9762828.622,614788.477,82.308,FIEC102
7,9762836.027,614795.73,77.421,FIEC103

A los datos de cada punto se añaden los cálculos de distancia hacia cada «baliza». En el proceso, también se usa el nombre del archivo para separar el grupo y tipo de cada medición.

Para observar los datos en el mapa mediante google Earth, se convierten las coordenadas UTM a latitud y longitud. Los valores de grupo permiten segmentar los puntos en el mapa.

Referencias: https://en.wikipedia.org/wiki/Differential_GPS,
https://es.wikipedia.org/wiki/Sistema_de_coordenadas_universal_transversal_de_Mercator


Parámetros del algoritmo

En el bloque de ingreso del algoritmo se configuran los parámetros que son requeridos para obtener un archivo más completo de coordenadas y distancias.

Las posiciones para los gateways se indican como baliza, asociando el identificador d1, d2 o d3 con los nombres registrados con el GPS.

En la tabla creada se usa la etiqueta de cada punto como índice de fila. las columnas corresponden a cada dato del punto.

Un ejemplo de resultado al ejecutar del algoritmo es:

archivo resumen: resumen_ubica01.txt
una muestra de archivo: 
         grupo   tipo  LOS_d1  LOS_d2  LOS_d3      c_norte  ...  altitud  dist_d1  dist_d2  dist_d3  Longitud Latitud
etiqueta                                                    ...                                                         
FIEC101   FIEC  punto       1       1       1  9762822.080  ...   62.213  423.450   78.492  351.924 79.967500 -2.145463
FIEC102   FIEC  punto       1       1       1  9762828.622  ...   82.308  451.423   67.435  357.220 79.967762 -2.145404
FIEC103   FIEC  punto       1       1       1  9762836.027  ...   77.421  449.414   60.141  364.706 79.967697 -2.145337
FIEC104   FIEC  punto       1       1       1  9762810.917  ...   87.352  399.437   97.611  343.328 79.967307 -2.145563
FIEC105   FIEC  punto       1       1       1  9762792.518  ...   82.708  382.250  117.785  326.571 79.967231 -2.145730

archivo de gps utm: ubicapuntos01.txt

archivo de resumen de coordenadas y distancias : resumen_ubica01.txt


Algoritmo en Python

Para la conversión del sistema de coordenadas se usa la librería utm. En caso de no disponer de la librería, puede ser instalada con la instrucción pip desde una ventana de comandos:

pip install utm

con lo que es posible hacer las conversiones de UTM a latitud y longitud y viceversa.

La fórmula de distancia en UTM es la tradicional para distancia entre dos puntos en el plano.

# Datos desde GPS Diferencial a un archivo.txt
# Incorpora distancias a los vertices (baliza),
# añade grupo por sector, tipo de punto y LOS.
# Girni 2020-10-07 edelros@espol.edu.ec
import numpy as np
import pandas as pd
import utm

# INGRESO
# Archivo de coordenadas
arch_gps    = 'ubicaPuntos01.txt'

# Archivo salida procesado con distancias
arch_gpsrsm = 'resumen_ubica03.txt'
zona ='17 M'

# Referencias
baliza = {'d1':'gtwRECT',
          'd2':'gtwFIEC',
          'd3':'gtwFCNM'}
grupo = ['FIEC','FCNM','RECT','CIRC']
tipo  = ['punto','1m','gtw','dispositivo']

# digitos decimales en distancias
digitos = 3

# PROCEDIMIENTO
# leer coordenadas
ubica = pd.read_csv(arch_gps,index_col='etiqueta')
ubica.drop('item',inplace=True, axis=1)
ubica = pd.DataFrame(ubica)
n = len(ubica)
zonanum = int(zona[0:2])
zonalet = zona[3]

# vertices con balizas
baliza_key = list(baliza.keys())
baliza_val = list(baliza.values())
vertices   = ubica.loc[baliza_val]

# distancias a vertices
for fila in vertices.index:
    x1 = vertices['c_este'][fila]
    y1 = vertices['c_norte'][fila]
    x2 = ubica['c_este']
    y2 = ubica['c_norte']
    dist  = np.sqrt((x2-x1)**2 + (y2-y1)**2)
    dist  = np.round(dist,digitos)
    donde = baliza_val.index(fila)
    cual  = baliza_key[donde]
    etiq_col = 'dist_'+cual
    ubica[etiq_col] = dist

# redondear a dos digitos
ubica['c_este']  = np.round(ubica['c_este'],digitos)
ubica['c_norte'] = np.round(ubica['c_norte'],digitos)
ubica['altitud'] = np.round(ubica['altitud'],digitos)

# añadir coordenadas en latitud y longitud
ubica['longitud'] = 0.0
ubica['latitud']  = 0.0
for fila in ubica.index:
    lon_utm = ubica['c_este'][fila]
    lat_utm = ubica['c_norte'][fila]
    coord_gra = utm.to_latlon(lon_utm,lat_utm,
                              zonanum,zonalet)
    ubica['latitud'][fila]  = coord_gra[0]
    ubica['longitud'][fila] = coord_gra[1]

# grupo y tipo en cada punto
ubica.insert(0,'grupo','')
ubica.insert(1,'tipo','')
for cadauno in ubica.index:
    
    # etiqueta de grupo
    esgrupo = 'CIRC'
    for ungrupo in grupo:
        cond1 = cadauno.startswith(ungrupo)
        cond2 = cadauno.endswith(ungrupo)
        if cond1 or cond2:
            esgrupo = ungrupo
    
    # etiqueta de tipo
    estipo = tipo[0]
    for untipo in tipo:
        cond1 = cadauno.startswith(untipo)
        if cond1:
            estipo = untipo
    if esgrupo == 'CIRC':
        estipo = 'dispositivo'
    
    ubica.loc[cadauno,'grupo'] = esgrupo
    ubica.loc[cadauno,'tipo']  = estipo

# generar columna de Linea de vista LOS
columna = 2
for cadauno in baliza.keys():
    ubica.insert(columna,'LOS_'+cadauno,1)
    columna = columna + 1

# SALIDA
print('archivo resumen:', arch_gpsrsm)
print('una muestra de archivo: ')
print(ubica.head())
print('vertices: \n',vertices)
ubica.to_csv(arch_gpsrsm)