Trazando campos de golf en R con Google Earth |  de Adam Beaudet |  mayo, 2024

Una vez que hayamos terminado de mapear nuestro hoyo o campo, es hora de exportar todo ese arduo trabajo a un archivo KML. Esto se puede hacer haciendo clic en los tres puntos verticales en el lado izquierdo de la pantalla donde reside su proyecto. Este proyecto funciona mejor con datos geoJSON, a los que podemos convertir fácilmente nuestro archivo KML en los siguientes pasos. Ahora estamos listos para dirigirnos a R.

Los paquetes que necesitaremos para prepararnos para el trazado son: sf (para trabajar con datos geoespaciales), ordenadoverso (para limpieza y trazado de datos), cuerda (para coincidencia de cadenas), y geojsonsf (para convertir de KML a geoJSON). Nuestro primer paso es leer el archivo KML, lo cual se puede hacer con el st_read() función de sf.

# load libraries
library(sf)
library(tidyverse)
library(stringr)
library(geojsonsf)

kml_df <- st_read("/Users/adambeaudet/Downloads/erin_hills.kml")

¡Excelente! Ahora deberíamos tener los datos KML de nuestro campo de golf en R. El marco de datos debería tener 2 columnas: Nombre (nombre del proyecto, o nombre del curso en nuestro caso), y geometría (una lista de todos los puntos individuales que componen los polígonos que trazamos). Como se mencionó brevemente anteriormente, conviertamos nuestros datos KML a geoJSON y también extraigamos el nombre del campo y los números de los hoyos.

# convert from KML to geoJSON
geojson_df <- st_as_sf(kml_df, "POLYGON")

# extracting course name and hole number from polygon name
# assuming "course_hole_element" naming convention is used for polygons
geojson_df$course_name <- str_match(geojson_df$Name, “^(.+)_hole”)[,2]
geojson_df$hole_num <- gsub(“.*_hole_(\\d+)_.*”, “\\1”, geojson_df$Name)

Para que nuestros mapas apunten hacia el norte, debemos proyectarlos de manera que conserven la dirección. Podemos hacer esto con el st_transform() función.

# define a CRS for so map always points due north
crs <- "+proj=lcc +lat_1=33 +lat_2=45 +lat_0=39 +lon_0=-96 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs"

# transform data to CRS
geojson_df <- st_transform(geojson_df, crs)

Estamos casi listos para trazar, pero primero debemos decirle a ggplot2 cómo se debe colorear cada polígono. A continuación se muestra la paleta de colores que utiliza mi proyecto, pero siéntase libre de personalizarla como desee.

Opcional: en este paso también podemos calcular los centroides de nuestros polígonos con el st_centroide() función para que podamos superponer el número del hoyo en cada green.

Imagen del autor
geojson_df <- geojson_df %>%
mutate(color = case_when(
grepl(“_tee$”, Name) ~ “#57B740”,
grepl(“_bunker$”, Name) ~ “#EDE6D3”,
grepl(“_water$”, Name) ~ “#2243b6”,
grepl(“_fairway$”, Name) ~ “#57B740”,
grepl(“_green$”, Name) ~ “#86D14A”,
grepl(“_hazard$”, Name) ~ “#094d1d”
)) %>%
mutate(centroid = st_centroid(geometry))

Estamos oficialmente listos para conspirar. Podemos utilizar una combinación de geom_sf(), geom_text()e incluso punto_geom() si queremos ponernos elegantes y trazar tomas encima de nuestro mapa. Normalmente elimino las líneas de cuadrícula, las etiquetas de los ejes y la leyenda para una apariencia más limpia.

ggplot() +
geom_sf(data = geojson_df, aes(fill = color), color = "black") +
geom_text(data = filter(geojson_df, grepl("_green", Name)),
aes(x = st_coordinates(centroid)[, 1],
y = st_coordinates(centroid)[, 2],
label = hole_num),
size = 3, color = "black", fontface = "bold", hjust = 0.5, vjust = 0.5) +
scale_fill_identity() +
theme_minimal() +
theme(axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
plot.title = element_text(size = 16),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
theme(legend.position = "none") +
labs(title = 'Erin Hills | Hartford, WI')

Y ahí lo tienes: un campo de golf trazado en R, ¡qué concepto!

Para ver otros cursos que he trazado al momento de escribir este artículo, puedes visitar mi aplicación Shiny: https://abodesy14.shinyapps.io/golfMapsR/

Si lo siguió, se divirtió haciéndolo o está intrigado, no dude en intentar mapear sus cursos favoritos y crear una solicitud de extracción para el golfMapasR repositorio que mantengo: https://github.com/abodesy14/golfMapsR
¡Con un poco de esfuerzo combinado, podemos crear una pequeña base de datos de campos de golf trazables en todo el mundo!