{"id":3857,"date":"2021-10-25T06:03:21","date_gmt":"2021-10-25T11:03:21","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3857"},"modified":"2022-07-25T06:38:01","modified_gmt":"2022-07-25T11:38:01","slug":"coordenadas-gps-a-utm-y-distancias-a-gateway","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/coordenadas-gps-a-utm-y-distancias-a-gateway\/","title":{"rendered":"3. Coordenadas - GPS a utm y distancias a gateway"},"content":{"rendered":"<p>Las coordenadas de cada punto donde se ubica un dispositivo se obtienen usando un GPS.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/GranjaFCV01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3946 aligncenter\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/GranjaFCV01.png\" alt=\"\" width=\"686\" height=\"658\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/GranjaFCV01.png 686w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/GranjaFCV01-300x288.png 300w\" sizes=\"auto, (max-width: 686px) 100vw, 686px\" \/><\/a><\/p>\n<p>Cada nodo se identifica con tres letras y dos d\u00edgitos por ejemplo usando cultivo y numeraci\u00f3n ascendente al alejarse del gateway. Por ejemplo, para el cultivo de <strong>C<\/strong>acao , radial \"<strong>A<\/strong>\" desde el gateway y punto en ubicaci\u00f3n <strong>04<\/strong>\u00a0 el identificador de ubicaci\u00f3n ser\u00e1 <strong>CA04<\/strong>.<\/p>\n<p>Las coordenadas se registran obteniendo el archivo kml del equipo GPS y contienen los valores de <strong>Latitud<\/strong> y <strong>Longitud<\/strong>. Por facilidad de uso y ubicaci\u00f3n las coordenadas se usan en formato <strong>utm<\/strong> (<strong>U<\/strong>niversal <strong>T<\/strong>ransverse <strong>M<\/strong>ercator).<\/p>\n<p>El archivo KML contiene los datos de los puntos, b\u00e1sicamente en el siguiente formato:<\/p>\n<pre>&lt;Placemark&gt;\r\n        &lt;name&gt;CA04\r\n        &lt;styleUrl&gt;#msn_pink-diamond&lt;\/styleUrl&gt;\r\n        &lt;Point&gt;\r\n                &lt;coordinates&gt;-79.96257337394334,\r\n                             -2.139534989113919,\r\n                             65.76000000000001&lt;\/coordinates&gt;\r\n        &lt;\/Point&gt;\r\n&lt;\/Placemark&gt;\r\n<\/pre>\n<p>Se adjunta un ejemplo del archivo para pruebas.<\/p>\n<p style=\"text-align: center\"><a href=\"https:\/\/www.dropbox.com\/s\/xe1fk78dwldexp3\/Granja2021_LOS.kml?dl=0\">Granja2021_LOS.kml<\/a><\/p>\n<p>El objetivo es generar un archivo con distancias al gateway y alturas del perfil del terreno semejante al ejemplo mostrado:<\/p>\n<pre>       altitud  altitud_gps  dist_Gw03   latitud   longitud  utm_este  utm_norte utm_zLetra utm_zNum\r\npunto                                                                                               \r\nGw03      65.0        68.30       0.00 -2.140439 -79.962474  615377.0  9763377.0          M       17\r\nLOS01     64.0        66.16      24.74 -2.140222 -79.962528  615371.0  9763401.0          M       17\r\nLOS02     59.0        66.16      75.93 -2.139770 -79.962627  615360.0  9763451.0          M       17\r\nLOS03     58.0        66.16      99.64 -2.139553 -79.962636  615359.0  9763475.0          M       17\r\nLOS04     58.0        66.06     126.44 -2.139309 -79.962645  615358.0  9763502.0          M       17\r\n...\r\n<\/pre>\n<p>En cada punto, la altitud_gps se puede mejorar usando el perfil del terreno desde google earth. Las instrucciones se muestran m\u00e1s adelante en \"Perfil de alturas de terreno\".<\/p>\n<h2>Coordenadas en utm<\/h2>\n<p>Para la conversi\u00f3n a utm, se usa la librer\u00eda en Python con el mismo nombre. En caso de no disponer de la librer\u00eda, puede ser instalada con la instrucci\u00f3n <code>pip<\/code> desde una ventana de comandos:<\/p>\n<pre>pip install utm<\/pre>\n<p>con lo que es posible hacer las conversiones a UTM desde latitud y longitud y viceversa.<\/p>\n<p>Las coordenadas en formato UTM para el ejemplo dado, se encuentran ubicadas en la zona \u00ab17 M\u00bb. Revisar para cada caso la zona<\/p>\n<h3>Perfil de alturas de terreno<\/h3>\n<p>Los datos de alturas del gps usado presentan variaciones irregulares de altura, por lo que para mejores valores se usa el perfil desde google earth usando las marcas de las coordenadas del archivo.kml<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/PerfilTerrenoGranja2021LOS.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3858 aligncenter\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/PerfilTerrenoGranja2021LOS.png\" alt=\"\" width=\"1161\" height=\"487\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/PerfilTerrenoGranja2021LOS.png 1161w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/PerfilTerrenoGranja2021LOS-300x126.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/PerfilTerrenoGranja2021LOS-768x322.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/PerfilTerrenoGranja2021LOS-1024x430.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Para visualizar el perfil se agrega una l\u00ednea como una \"ruta\" entre el punto del Gateway (Gw3) y el \u00faltimo punto de observaci\u00f3n. Los datos del perfil se pueden observar al seleccionar la ruta y usar la opci\u00f3n de \"mostrar perfil de elevaci\u00f3n\". La opci\u00f3n se obtiene con \"click derecho\" del mouse. Se tiene adicionalmente como referencia, las distancias desde el gateway obtenidas en el proceso de conversi\u00f3n a utm. Los valores leidos de alturas para cada punto se guardan en un archivo .csv<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/Perfil_MostrarElevacion01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3860 aligncenter\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/Perfil_MostrarElevacion01.png\" alt=\"\" width=\"372\" height=\"297\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/Perfil_MostrarElevacion01.png 372w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/Perfil_MostrarElevacion01-300x240.png 300w\" sizes=\"auto, (max-width: 372px) 100vw, 372px\" \/><\/a><\/p>\n<p>El archivo obtenido en el ejemplo de alturas se muestra en:<\/p>\n<p style=\"text-align: center\"><a href=\"https:\/\/www.dropbox.com\/s\/oynlrat9loa9gz8\/Granja2021_alturas.csv?dl=0\">Granja2021_alturas.csv<\/a><\/p>\n<hr \/>\n<h2>Instrucciones en Python<\/h2>\n<p>El algoritmo integra los resultados de la conversi\u00f3n de coordenadas a utm, incluye las distancias al gateway e integra las alturas obtenidas de forma externa para tener como resultado el archivo.csv.<\/p>\n<p style=\"text-align: center\"><a href=\"https:\/\/www.dropbox.com\/s\/oynlrat9loa9gz8\/Granja2021_alturas.csv?dl=0\">Granja2021_LOS.csv<\/a><\/p>\n<p>Una revisi\u00f3n para generar el archivo es evitar sobreescribir un archivo anterior. Por lo que si se requiere procesar nuevamente los datos se pide borrar el archivo anterior antes de ejecutar el algoritmo.<\/p>\n<p>El algoritmo se divide en procesos identificados por un n\u00famero ascendente. La variable '<strong>procesoCompletado<\/strong>' permite dar indicaciones de avances en el algoritmo en caso que se produzcan errores como haber escrito el nombre del archivo de datos con errores, que el nombre del gateway debe empezar con \"Gw\", etc.<\/p>\n<pre><span style=\"color: #ff0000\"># Procesa puntos de coordenadas, a utm<\/span>\r\n<span style=\"color: #ff0000\"># girni-fiec-espol Revision:20220724<\/span>\r\n<span style=\"color: #ff0000\"># http:\/\/blog.espol.edu.ec\/girni\/ <\/span>\r\n\r\n<span style=\"color: #d35400\">import<\/span> geopandas <span style=\"color: #d35400\">as<\/span> gpd\r\n<span style=\"color: #d35400\">import<\/span> fiona\r\n<span style=\"color: #d35400\">import<\/span> utm\r\n<span style=\"color: #d35400\">import<\/span> numpy <span style=\"color: #d35400\">as<\/span> np\r\n<span style=\"color: #d35400\">import<\/span> pandas <span style=\"color: #d35400\">as<\/span> pd\r\n<span style=\"color: #d35400\">import<\/span> os\r\n\r\n<span style=\"color: #ff0000\"># INGRESO<\/span>\r\narchivokml  = <span style=\"color: #008000\">'Granja2021_LOS.kml'<\/span> \r\ncarp_coord  = <span style=\"color: #008000\">'Coordenadas'<\/span>\r\n\r\n<span style=\"color: #ff0000\"># archivo de alturas tomadas de google<\/span>\r\narch_altura = <span style=\"color: #008000\">'Granja2021_alturas.csv'<\/span>\r\n\r\n<span style=\"color: #ff0000\"># zona UTM<\/span>\r\nzonaNum   = 17\r\nzonaLetra = <span style=\"color: #008000\">'M'<\/span>\r\n\r\nprecision = 2\r\n\r\n<span style=\"color: #ff0000\"># PROCEDIMIENTO<\/span>\r\nprocesoCompleto = 0\r\n\r\n<span style=\"color: #ff0000\"># Lectura de archivo .KML<\/span>\r\n<span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(carp_coord)&gt;0:\r\n    carp_coord = carp_coord+<span style=\"color: #008000\">'\/'<\/span>\r\narchivo_ruta = carp_coord+archivokml\r\n<span style=\"color: #d35400\">if<\/span> os.path.exists(archivo_ruta):\r\n    gpd.io.file.fiona.drvsupport.supported_drivers[<span style=\"color: #008000\">'KML'<\/span>] = <span style=\"color: #008000\">'rw'<\/span>\r\n    puntos = gpd.read_file(archivo_ruta, driver=<span style=\"color: #008000\">'KML'<\/span>)\r\n    puntos = puntos.sort_values(by=[<span style=\"color: #008000\">'Name'<\/span>])\r\n    \r\n    procesoCompleto = 1\r\n\r\n<span style=\"color: #d35400\">if<\/span> procesoCompleto == 1:\r\n    <span style=\"color: #ff0000\"># tabla en UTM<\/span>\r\n    tabla = pd.DataFrame()\r\n    n_Gw = <span style=\"color: #008000\">''<\/span>;\r\n    <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> puntos.index:\r\n        <span style=\"color: #ff0000\"># en latitud, longitud y altura<\/span>\r\n        punto_nombre = puntos.loc[i][<span style=\"color: #008000\">'Name'<\/span>]\r\n        longitud = puntos.loc[i][<span style=\"color: #008000\">'geometry'<\/span>].x\r\n        latitud  = puntos.loc[i][<span style=\"color: #008000\">'geometry'<\/span>].y\r\n        altitud  = puntos.loc[i][<span style=\"color: #008000\">'geometry'<\/span>].z\r\n        altitud  = np.round(altitud,precision)\r\n        <span style=\"color: #ff0000\">#convierte lat_lon en UTM<\/span>\r\n        coord_utm = utm.from_latlon(latitud,longitud,\r\n                                    zonaNum,zonaLetra)\r\n        utm_este  = np.round(coord_utm[0],precision)\r\n        utm_norte = np.round(coord_utm[1],precision)\r\n        <span style=\"color: #d35400\">if<\/span> punto_nombre.startswith(<span style=\"color: #008000\">'Gw'<\/span>):\r\n            n_Gw = punto_nombre\r\n            x1 = utm_este\r\n            y1 = utm_norte\r\n                <span style=\"color: #ff0000\"># a\u00f1ade coordenadas UTM a tabla<\/span>\r\n        tabla.at[i,<span style=\"color: #008000\">'punto'<\/span>]      = punto_nombre\r\n        tabla.at[i,<span style=\"color: #008000\">'utm_este'<\/span>]   = utm_este\r\n        tabla.at[i,<span style=\"color: #008000\">'utm_norte'<\/span>]  = utm_norte\r\n        tabla.at[i,<span style=\"color: #008000\">'utm_zNum'<\/span>]   = <span style=\"color: #ff00ff\">str<\/span>(zonaNum)\r\n        tabla.at[i,<span style=\"color: #008000\">'utm_zLetra'<\/span>] = zonaLetra\r\n        tabla.at[i,<span style=\"color: #008000\">'altitud'<\/span>]    = 0\r\n        tabla.at[i,<span style=\"color: #008000\">'altitud_gps'<\/span>]= altitud\r\n        tabla.at[i,<span style=\"color: #008000\">'latitud'<\/span>]    = latitud\r\n        tabla.at[i,<span style=\"color: #008000\">'longitud'<\/span>]   = longitud\r\n    procesoCompleto = 2\r\n\r\n<span style=\"color: #d35400\">if<\/span> procesoCompleto==2:\r\n    <span style=\"color: #ff0000\"># gateway encontrado<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(n_Gw)&gt;0:\r\n        procesoCompleto = 3\r\n\r\n<span style=\"color: #d35400\">if<\/span> procesoCompleto == 3:\r\n    <span style=\"color: #ff0000\"># distancias a Gateways<\/span>\r\n    <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> puntos.index:\r\n        dist = 0.0\r\n        x2 = tabla.at[i,<span style=\"color: #008000\">'utm_este'<\/span>]\r\n        y2 = tabla.at[i,<span style=\"color: #008000\">'utm_norte'<\/span>]\r\n        dist = np.sqrt((x2-x1)**2 + (y2-y1)**2)\r\n        dist = np.round(dist,precision)\r\n        tabla.at[i,<span style=\"color: #008000\">'dist_'<\/span>+n_Gw] = dist\r\n\r\n    <span style=\"color: #ff0000\"># indice por nombre de punto<\/span>\r\n    tabla = tabla.set_index(<span style=\"color: #008000\">'punto'<\/span>)\r\n    <span style=\"color: #ff0000\"># ordena por indice<\/span>\r\n    tabla = tabla.sort_index(axis=1)\r\n\r\n    procesoCompleto = 4\r\n\r\n<span style=\"color: #d35400\">if<\/span> procesoCompleto == 4:\r\n    <span style=\"color: #ff0000\"># a\u00f1ade alturas desde archivo<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(arch_altura)&gt;0:\r\n        arch_rutaA = carp_coord + arch_altura\r\n        <span style=\"color: #d35400\">if<\/span> os.path.exists(arch_rutaA):\r\n            tablaAltura = pd.read_csv(arch_rutaA)\r\n            tablaAltura = tablaAltura.set_index(<span style=\"color: #008000\">'punto'<\/span>)\r\n            <span style=\"color: #d35400\">for<\/span> cadapunto <span style=\"color: #d35400\">in<\/span> tabla.index:\r\n                <span style=\"color: #d35400\">if<\/span> cadapunto <span style=\"color: #d35400\">in<\/span> tablaAltura.index:\r\n                    encontrada = tablaAltura.loc[cadapunto][<span style=\"color: #008000\">'altitud'<\/span>]\r\n                    tabla.at[cadapunto,<span style=\"color: #008000\">'altitud'<\/span>] = encontrada\r\n\r\n            procesoCompleto = 5\r\n        \r\n<span style=\"color: #ff0000\"># Para escritura de archivo<\/span>\r\narchivocsv   = archivokml.split(<span style=\"color: #008000\">'.'<\/span>)[0] + <span style=\"color: #008000\">'.csv'<\/span>\r\narchivo_ruta = carp_coord+archivocsv\r\n\r\n<span style=\"color: #ff0000\"># SALIDA<\/span>\r\n<span style=\"color: #d35400\">if<\/span> procesoCompleto == 5:\r\n    <span style=\"color: #ff00ff\">print<\/span>(tabla)\r\n    <span style=\"color: #ff0000\"># Escribe archivo: tabla de resultados<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> os.path.exists(archivo_ruta):\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'El archivo existe: '<\/span>,archivo_ruta)\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'Esta acci\u00f3n borrar\u00eda el archivo \u00faltimo actualizado'<\/span>)\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'Puede borrarlo manualmente antes de reintentar'<\/span>)\r\n    <span style=\"color: #d35400\">else<\/span>:\r\n        tabla.to_csv(archivo_ruta)\r\n<span style=\"color: #d35400\">else<\/span>:\r\n    <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'proceso completado hasta:'<\/span>, procesoCompleto)\r\n    <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'Revisar errores en proceso:'<\/span>, procesoCompleto+1)\r\n    <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'   Procesos:'<\/span>)\r\n    <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'1: abrir archivo .KML'<\/span>,archivokml)\r\n    <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'2: crear tabla de datos'<\/span>)\r\n    <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'3: encontrar gateway:'<\/span>, n_Gw)\r\n    <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'4: calcula distancia cada punto a gateway'<\/span>)\r\n    <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'5: a\u00f1adir alturas desde archivo: '<\/span>, arch_rutaA)\r\n<\/pre>\n<p><em><strong>Referencia<\/strong><\/em>: Bidirectional UTM-WGS84 converter for python. <a href=\"https:\/\/pypi.org\/project\/utm\/0.4.2\/\">https:\/\/pypi.org\/project\/utm\/0.4.2\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las coordenadas de cada punto donde se ubica un dispositivo se obtienen usando un GPS. Cada nodo se identifica con tres letras y dos d\u00edgitos por ejemplo usando cultivo y numeraci\u00f3n ascendente al alejarse del gateway. Por ejemplo, para el cultivo de Cacao , radial \"A\" desde el gateway y punto en ubicaci\u00f3n 04\u00a0 el &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/coordenadas-gps-a-utm-y-distancias-a-gateway\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"3. Coordenadas - GPS a utm y distancias a gateway\"<\/span><\/a><\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1466681],"tags":[],"class_list":["post-3857","post","type-post","status-publish","format-standard","hentry","category-lorawan-registro-de-estados"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3857","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/comments?post=3857"}],"version-history":[{"count":13,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3857\/revisions"}],"predecessor-version":[{"id":4002,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3857\/revisions\/4002"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3857"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3857"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3857"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}