{"id":3867,"date":"2021-11-05T09:43:02","date_gmt":"2021-11-05T14:43:02","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3867"},"modified":"2026-08-04T10:42:12","modified_gmt":"2026-08-04T15:42:12","slug":"coordenadas-perfil-zona-fresnel","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/coordenadas-perfil-zona-fresnel\/","title":{"rendered":"3.1 Coordenadas - Perfil y zona Fresnel"},"content":{"rendered":"\n<p>Observar el perfil del terreno en una ruta, y estimar la primera zona de Fresnel permite revisar algunas situaciones donde se presente bloqueo, dispersi\u00f3n, difracci\u00f3n de la se\u00f1al en el enlace.<\/p>\n\n\n\n<p>Los datos del perfil se obtienen del proceso anterior desde el siguiente archivo:<\/p>\n\n\n\n<p class=\"has-text-align-center\"><a href=\"https:\/\/www.dropbox.com\/scl\/fi\/ue6zhoc9olpm4zsd0b3hr\/Granja2021_LOS.kml?rlkey=059ye2ykcmsv3k5phnx2prt3j&amp;st=77ixk0cl&amp;dl=0\">Granja2021_LOS.csv<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/perfil_LOS_01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"568\" height=\"443\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/perfil_LOS_01.png\" alt=\"\" class=\"wp-image-3871\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/perfil_LOS_01.png 568w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/11\/perfil_LOS_01-300x234.png 300w\" sizes=\"auto, (max-width: 568px) 100vw, 568px\" \/><\/a><\/figure>\n\n\n\n<p>En el proceso se a\u00f1ade al perfil la altura de las antenas en los dispositivos, la altura de la vegetaci\u00f3n promedio y se genera la gr\u00e1fica mostrada.<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>punto,altitud,altitud_gps,dist_Gw03,latitud,longitud,utm_este,utm_norte,utm_zLetra,utm_zNum,vegetacion,alt_antena\nGw03,65.0,68.3,0.0,-2.140439491218423,-79.96247385948875,615377.0,9763377.0,M,17,65.0,73.0\nLOS01,64.0,66.16,24.74,-2.140222431275481,-79.96252795441376,615371.0,9763401.0,M,17,64.0,65.0\nLOS02,59.0,66.16,75.93,-2.139770213855424,-79.96262716484223,615360.0,9763451.0,M,17,59.0,60.0\nLOS03,58.0,66.16,99.64,-2.139553123308579,-79.96263630222327,615359.0,9763475.0,M,17,59.5,59.0\n...\n<\/code><\/pre>\n\n\n\n<p>El resultado se guarda en un archivo.csv y en la gr\u00e1fica.png<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instrucciones en Python<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Procesa perfiles y Zona Fresnel\n# girni-fiec-espol Revisi\u00f3n: 20220724\n# http:\/\/blog.espol.edu.ec\/girni\/\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport os\n\n# INGRESO\narchivocsv  = 'Granja2021_LOS.csv'\ncarp_coord  = 'coordenadas'\ncarpeta_rsm = 'resultado_LOS'\nLineaObs  = 'LOS'\nsegmentos = &#x5B;'Gw03','LOS']\n# Fresnel, selecciona dispositivo\nanaliza_punto = 'LOS09'\n\n# vegetacion\nplantas_entre  = &#x5B;0, 0] #&#x5B;90,250]\nplantas_altura = 1.6\n\n# antenas\nalturaGw    = 8\nalturapunto = 1\n\n# parametros Fresnel\nnFres = 1\nfreq  = 915 # 915MHz\n\n# Gr\u00e1ficas\nmuestras = 41 # resoluci\u00f3n\nguarda = True\n\n# PROCEDIMIENTO\nprocesoCompleto = 0\n\n# ruta de archivo\nif len(carp_coord)&gt;0:\n    carp_coord = carp_coord+'\/'\narchivo_ruta = carp_coord + archivocsv\nif os.path.exists(archivo_ruta):\n    puntostodos  = pd.read_csv(archivo_ruta,\n                               index_col='punto')\n    procesoCompleto = 1\n\nif procesoCompleto == 1:\n    # busca gateway\n    Gw_nombre = '';\n    for unpunto in puntostodos.index:\n        if unpunto.startswith('Gw'):\n            Gw_nombre = unpunto\n    if len(Gw_nombre)&gt;0:\n        procesoCompleto = 2\n\nif procesoCompleto == 2:\n    #ordena por distancia\n    puntostodos = puntostodos.sort_values(by=&#x5B;'dist_'+Gw_nombre])\n    puntostodos&#x5B;'enruta']=0\n    for unpunto in puntostodos.index:\n        for elemento in segmentos:\n            if unpunto.startswith(elemento):\n                puntostodos.loc&#x5B;&#x5B;unpunto],&#x5B;'enruta']] = 1\n\n    puntos = puntostodos&#x5B;puntostodos&#x5B;'enruta']==1].copy()\n    procesoCompleto = 3\n\nif procesoCompleto == 3:\n    # busca gateway y ubicaci\u00f3n de punto observado\n    i_punto = -1 ; i_Gw=-1\n    i=0\n    for unpunto in puntos.index:\n        if unpunto.startswith('Gw'):\n            i_Gw = i\n        if unpunto==analiza_punto:\n            i_punto = i\n        i = i+1\n    if i_punto&gt;=0 and i_Gw&gt;=0:\n        procesoCompleto = 4\n    \nif procesoCompleto ==4:\n    # plantaci\u00f3n sector\n    puntos&#x5B;'vegetacion'] = puntos&#x5B;'altitud']\n    for unpunto in puntos.index:\n        dist_punto = puntos&#x5B;'dist_'+Gw_nombre]&#x5B;unpunto]\n        envegetacion = (dist_punto&gt;=np.min(plantas_entre))\n        envegetacion = envegetacion and (dist_punto&lt;=np.max(plantas_entre))\n        if envegetacion:\n            puntos.at&#x5B;unpunto,'vegetacion'] = puntos&#x5B;'altitud']&#x5B;unpunto] + plantas_altura\n\n    # a\u00f1ade alturas de antenas\n    puntos&#x5B;'alt_antena'] = puntos&#x5B;'altitud'] + alturapunto\n    puntos.at&#x5B;Gw_nombre,'alt_antena'] = puntos&#x5B;'altitud']&#x5B;Gw_nombre] + alturaGw\n\n    procesoCompleto = 5\n\nif procesoCompleto == 5:\n    # lambda Fresnel\n    lamb = 300\/freq #300e6(m\/s)\/(freq*1e6)\n\n    # Zona de Fresnel\n    xi = puntos&#x5B;'dist_'+Gw_nombre]\n    yi_ant = puntos&#x5B;'alt_antena']\n    if i_punto&gt;0:\n        \n        # linea directa\n        dy = yi_ant&#x5B;i_punto]-yi_ant&#x5B;i_Gw]\n        dx = xi&#x5B;i_punto]-xi&#x5B;i_Gw]\n        m = dy\/dx\n        alpha = np.arctan(m)\n        yi_f = lambda x: m*x + yi_ant&#x5B;i_Gw]\n\n        xi_D = np.linspace(xi&#x5B;i_Gw],xi&#x5B;i_punto],\n                           muestras)\n        yi_D = yi_f(xi_D)\n        dist_D = np.sqrt(dx**2+dy**2)\n\n        # zona Fresnel 1\n        F1_up = np.zeros(len(xi_D))\n        F1_down = np.zeros(len(xi_D))\n        for i in range(0,len(xi_D),1):\n            d1 = xi_D&#x5B;i]\/np.cos(alpha)\n            d2 = dist_D-d1\n            F1 = np.sqrt(np.abs(nFres*lamb*d1*d2)\/(d1+d2))\n\n            xiu = xi_D&#x5B;i]-F1*np.sin(np.abs(alpha))\n            d1_u = xiu\n            d2_u = dist_D-d1_u\n\n            xid = xi_D&#x5B;i]+F1*np.sin(np.abs(alpha))\n            d1_d = xid\n            d2_d = dist_D-d1_d\n            # Fresnel, formula\n            Fup = np.sqrt(np.abs(nFres*lamb*d1_u*d2_u)\/(d1_u+d2_u))\n            Fdown = np.sqrt(np.abs(nFres*lamb*d1_d*d2_d)\/(d1_d+d2_d))\n            \n            # Linea directa +\/- Fresnel\n            F1_up&#x5B;i]   = yi_D&#x5B;i] + Fup*np.cos(alpha)\n            F1_down&#x5B;i] = yi_D&#x5B;i] - Fdown*np.cos(alpha)    \n\n    procesoCompleto = 6\n\n\n# SALIDA\nif procesoCompleto == 6:\n    print(puntos)\n    # guarda el reporte en csv\n    unreporte = carpeta_rsm+'\/perfil_'+LineaObs+'.csv'\n    if os.path.exists(carpeta_rsm):\n        puntos.to_csv(unreporte)\n    else:\n        print('no existe carpeta:',carpeta_rsm)\nelse:\n    print('proceso completado hasta:', procesoCompleto)\n    print('Revisar errores en proceso:', procesoCompleto+1)\n    print('   Procesos:')\n    print('1: abrir archivo de datos ',archivocsv )\n    print('2: encontrar gateway con nombre Gw##')\n    print('3: ordenar tabla por distancias al gateway')\n    print('4: encontrar punto a analizar:',analiza_punto)\n    print('5: a\u00f1adir altura de antenas y plantas')\n    print('6: calcular zona de fresnel')\n\nif procesoCompleto == 6:\n    # GRAFICA\n    figura,(grafica1,grafica2) = plt.subplots(2,1)\n\n    # vegetacion\n    con_veget = np.array(puntos&#x5B;'vegetacion']-puntos&#x5B;'altitud'])\n    xiv = np.array(puntos&#x5B;'dist_'+Gw_nombre])&#x5B;con_veget&gt;0]\n    perfil = np.array(puntos&#x5B;'altitud'])&#x5B;con_veget&gt;0]\n    vegetacion = np.array(puntos&#x5B;'vegetacion'])&#x5B;con_veget&gt;0]\n\n    grafica1.fill_between(xiv,perfil,vegetacion,\n                          color='lightgreen')\n    # perfil\n    grafica1.plot(puntos&#x5B;'dist_'+Gw_nombre],\n                  puntos&#x5B;'altitud'],label='Perfil',\n                  color='brown')\n        \n    # antenas\n    grafica1.scatter(puntos&#x5B;'dist_'+Gw_nombre],\n                     puntos&#x5B;'alt_antena'],\n                     color='blue')\n    # etiquetas y lineas enlace\n    xigw = puntos&#x5B;'dist_'+Gw_nombre]&#x5B;Gw_nombre]\n    yigw = puntos&#x5B;'alt_antena']&#x5B;Gw_nombre]\n    for unpunto in puntos.index:\n        xip = puntos&#x5B;'dist_'+Gw_nombre]&#x5B;unpunto]\n        yip = puntos&#x5B;'alt_antena']&#x5B;unpunto]\n        grafica1.annotate(unpunto,(xip,yip),\n                          rotation=45)\n        grafica1.plot((xigw,xip),(yigw,yip),\n                      color = 'green',\n                      linestyle='dotted')\n    untitulo = 'Ruta: '+LineaObs\n    untitulo = untitulo + ', Antena: Gw '+str(alturaGw)\n    untitulo = untitulo + 'm Dispositivo '+str(alturapunto)\n    untitulo = untitulo + 'm'\n    grafica1.set_title(untitulo)\n    grafica1.set_ylabel('altura')\n    grafica1.legend()\n    grafica1.grid(True,linestyle='dotted',\n                  axis='x',which='both')\n    # plt.axis('equal')\n\n    grafica2.fill_between(xiv,perfil,vegetacion,\n                          color='lightgreen')\n    # perfil\n    grafica2.plot(puntos&#x5B;'dist_'+Gw_nombre],\n                  puntos&#x5B;'altitud'],\n                  color='brown')\n        \n    # antenas\n    grafica2.scatter(puntos&#x5B;'dist_'+Gw_nombre],\n                     puntos&#x5B;'alt_antena'],\n                     color='blue')\n    # etiquetas y lineas enlace\n    xigw = puntos&#x5B;'dist_'+Gw_nombre]&#x5B;Gw_nombre]\n    yigw = puntos&#x5B;'alt_antena']&#x5B;Gw_nombre]\n    for unpunto in puntos.index:\n        if unpunto in &#x5B;Gw_nombre, analiza_punto]:\n            xip = puntos&#x5B;'dist_'+Gw_nombre]&#x5B;unpunto]\n            yip = puntos&#x5B;'alt_antena']&#x5B;unpunto]\n            grafica2.annotate(unpunto,(xip,yip),\n                              rotation=45)\n\n    if i_punto&gt;0:\n        # Fresnel\n        grafica2.plot(xi_D,yi_D,\n                      label='linea enlace',\n                      color='orange',\n                      linestyle = 'dashed')\n        grafica2.plot(xi_D,F1_down,\n                      label='Fresnel1',color='orange')\n        grafica2.plot(xi_D,F1_up,\n                      color='orange')\n\n    grafica2.set_xlabel('distancia')\n    grafica2.set_ylabel('altura')\n    grafica2.legend()\n    grafica2.grid(True,linestyle='dotted',\n                  axis='x',which='both')\n    # plt.axis('equal')\n\n    unarchivo = carpeta_rsm+'\/perfil_'+LineaObs+'.png'\n    if (guarda==True) and os.path.exists(carpeta_rsm):\n        plt.savefig(unarchivo)\n\n    plt.show()\n<\/pre><\/div>\n\n\n<p><em><strong>Referencia<\/strong><\/em>: <a href=\"https:\/\/es.wikipedia.org\/wiki\/Zona_de_Fresnel\">https:\/\/es.wikipedia.org\/wiki\/Zona_de_Fresnel<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Observar el perfil del terreno en una ruta, y estimar la primera zona de Fresnel permite revisar algunas situaciones donde se presente bloqueo, dispersi\u00f3n, difracci\u00f3n de la se\u00f1al en el enlace. Los datos del perfil se obtienen del proceso anterior desde el siguiente archivo: Granja2021_LOS.csv En el proceso se a\u00f1ade al perfil la altura de [&hellip;]<\/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-3867","post","type-post","status-publish","format-standard","hentry","category-lorawan-propagacion"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3867","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=3867"}],"version-history":[{"count":14,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3867\/revisions"}],"predecessor-version":[{"id":4779,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3867\/revisions\/4779"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3867"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3867"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3867"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}