Generar una rejilla hexagonal georreferenciada con Excel
mario.hernandez 15 April 2019El 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.
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 .
' 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:
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.
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).
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.
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:
- Mejorar el ajuste de la rejilla independientemente de las distancias seleccionadas.
- Tomar los puntos comunes de los hexágonos adyacentes.