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)