Generar una rejilla hexagonal georreferenciada con Excel

Generar una rejilla hexagonal georreferenciada con Excel

mario.hernandez 15 April 2019

El presente post tiene la finalidad de construir una rejilla hexagonal en el mapa y las dificultades que esto conlleva, como el corrimiento que se presenta y el cual es directamente proporcional a la distancias seleccionadas, para realizar una rejilla alineada lo realizaremos en el siguiente post con un software especializado llamado Qgis.

No obstante lo anterior, este método que haremos en excel es bueno para distancias relativamente cortas.

Utilizaremos la misma estructura de este post "Realiza cualquier forma en el mapa con Excel" por lo que recomiendo leerlo.

Red hexagonal

Para construir la red hexagonal tomaremos como ancla el primer hexágono con la etiqueta (0, 0) y a partir de él construiremos hexágonos ancla en cada renglón, es decir (1, 0), (2, 0), etc.

Hexagonos grid

Figura 1. Rejilla hexagonal.

Como se puede observar en la Figura 1, para generar el hexágono (1, 0) tenemos que obtener el punto que se encuentra a una distancia de 2*r*cos(30°) hacia una dirección de 210° a partir del punto (0, 0), el punto obtenido será el centro para realizar el hexágono (1, 0). Ahora, para comenzar a generar el hexágono (2, 0), a partir del (1, 0) obtenemos el punto que se encuentra a una distancia de 2*r*cos(30°) en la dirección de 150°. Si deseasemos generar otra fila de hexágonos, es decir, la correspondiente al hexágono ancla (3, 0), se obtendrá a partir del (2, 0) en la dirección de 210° y así lo realizaremos sucesivamente para filas extras.

Código de implementación Macro Excel

Puedes descargar la macro en excel aqui excel icon.

    ' Genera los puntos ancla (1, 0), (2, 0), (3, 0), etc.
    
    ' Para alternar 210 --> 150 --> 210 --> 150
    angulos_niveles(0) = 210
    angulos_niveles(1) = 150
    
    n_filas = 10  ' Numero de filas de hexagonos a realizar

    alterna = 0
    For i = 1 To n_filas
        
        ' Obtiene la lat y lon del centro del hexagono (X, 0) al (X + 1, 0) hacia 210 0 150, segun sea el caso
        puntos = puntos_rejilla(CDbl(lat1dec), CDbl(lon1dec), CDbl(d), CDbl(angulos_niveles(alterna)))
       
        puntos_ancla(i, 0) = puntos(0)
        puntos_ancla(i, 1) = puntos(1)
        puntos_ancla(i, 2) = i
        
        lat1dec = puntos(0)
        lon1dec = puntos(1)
        
        ' Para alternar 210 --> 150 --> 210 --> 150 ...
        If alterna = 0 Then
            alterna = 1
        Else
            alterna = 0
        End If
        
    Next i

Una vez que tenemos los hexágonos ancla, procedemos a generar las columnas, es decir, los hexágonos (0, 1), (0, 2), (1, 1), (1, 2), etc. Así por ejemplo, para generar el hexágono (0, 1) lo tendremos que generar a partir del (0, 0) hacia la dirección de 90°, el (0, 2) a partir del (0, 1) en la dirección de 90° y así sucesivamente.

    n_columnas = 20  ' Numero de columnas de hexagonos
    k = 0
    For i = 0 To n_filas
        lat1dec = puntos_ancla(i, 0)
        lon1dec = puntos_ancla(i, 1)
        
        ' rejilla es la matriz que contendra todos los centros (lat, lon) de los hexagonos de nuestra rejilla
        rejilla(k, 0) = lat1dec
        rejilla(k, 1) = lon1dec
        rejilla(k, 2) = "(" & puntos_ancla(i, 2) & ", " & 0 & ")"
        
        k = k + 1
        For j = 0 To n_columnas
            
            ' Obtiene la lat y lon del centro del hexagono (X, Y) al (X, Y +1) hacia 90
            puntos = puntos_rejilla(CDbl(lat1dec), CDbl(lon1dec), CDbl(d), CDbl(90))
            
            rejilla(k, 0) = puntos(0)
            rejilla(k, 1) = puntos(1)
            rejilla(k, 2) = "(" & puntos_ancla(i, 2) & ", " & j + 1 & ")"
            
            lat1dec = puntos(0)
            lon1dec = puntos(1)
            k = k + 1
        Next j
    Next i

Cabe señalar que la función puntos_rejilla nos entrega la latitud y longitud de los puntos a una distancia de 2*r*cos(30°), pero este proceso lo realizamos en 10 pasos, con la finalidad de aumentar el ajuste en la rejilla de los hexágonos, esta corrección solo se realiza en un eje, lo cual genera que nuestros hexágonos vayan presentando un corrimiento en el eje de las columnas a medida que aumenta la distancia seleccionada, como lo veremos más adelante.

Function puntos_rejilla(lat1dec As Double, lon1dec As Double, d As Double, ang12 As Double) As Variant
        
    Dim returnVal(1) As Variant
    
    n = 10
    
    w = (2 * Cos(WorksheetFunction.Radians(30#)) * d) / n ' Distancia entre hexagonos horizontales
    
    ' Amuenta el ajuste de la rejilla si se avanza en pasos de 10 para obtener el punto
    For i = 0 To (n - 1)
    
        coords = obtiene_p2(CDbl(lat1dec), CDbl(lon1dec), CDbl(w), CDbl(ang12))
        lat1dec = coords(0)
        lon1dec = coords(1)
        
    Next i
    
    returnVal(0) = coords(0)
    returnVal(1) = coords(1)
    
    puntos_rejilla = returnVal

End Function

Ya con nuestra matriz de pares coordenados de latitudes y longitudes, procedemos a generar el polígono como lo realizamos en el post "Realiza cualquier forma en el mapa con Excel".

La hoja de excel queda de la siguiente manera:

Rejilla hexagonal en el mapa excel

Figura 2. Configuración para generar red hexagonal en Excel.

Donde las columnas:

  • "A" a "F", es el punto del hexágono ancla (0, 0)
  • "G", El radio del hexágono.
  • "H", es el número de filas y columnas que tendrá nuestra rejilla. (Las filas y columnas se toman en cuenta a partir del hexágono (0, 0), ver Figura 1).
  • "I", Botón para ejecutar la macro y generar el archivo KML.
  • "J" a "N", Forma hexagonal que tendrá nuestra rejilla.

Salida después de ejecutar el botón "¡Generar KML!", el archivo KML se generará en el mismo directorio donde se encuentra nuestro archivo de excel.

Salida rejilla hexagonal

Figura 3. Salida de la macro en KML visualizada en google maps.

Si bien la Figura 3 muestra una rejilla que parece estar alineada, basta con acercarnos para observar que las intersecciones no coinciden (corrimiento de 9 metros aproximadamente).

Desalineado de los hexágonos

Figura 4. Acercamiento a la intersección de los hexágonos (1, 2), (1,3) y (2, 2).

El corrimiento de los hexágonos que se observa en la Figura 4 aumentará a medida que nos alejamos de nuestros hexágonos ancla y del radio de los hexágonos, Figura 5.

Distorsión en la rejilla

Figura 5. Corrimiento de los hexágonos con radio=150 km y 15 columnas.

La figura 5, presenta un corrimiento de 33 kilometros entre los hexágonos en la última columna.

Siguientes puntos a realizar:

  1. Mejorar el ajuste de la rejilla independientemente de las distancias seleccionadas.
  2. Tomar los puntos comunes de los hexágonos adyacentes.