Geolocalización y mapas en Go (Golang): revisión de bibliotecas y ejemplos de código
Go (Golang) es un lenguaje compilado moderno que está ganando popularidad en el desarrollo backend gracias a su rendimiento, simplicidad y soporte integrado para concurrencia. Al crear servicios web educativos, logísticos, turísticos y otros, a menudo surge la necesidad de trabajar con datos geográficos: calcular distancias entre puntos, verificar si las coordenadas caen en zonas, construir rutas y mostrar mapas. En este artículo, revisaremos las principales bibliotecas de Go para trabajar con geolocalización y mapas, y proporcionaremos ejemplos prácticos de código.
Bibliotecas principales para trabajar con geolocalización
1. github.com/paulmach/orb — biblioteca universal para trabajar con objetos geométricos
La biblioteca orb proporciona tipos y funciones para trabajar con puntos, líneas, polígonos y otros primitivos geométricos. Soporta GeoJSON, operaciones de geometría booleana, proyecciones y transformaciones de coordenadas. Es una biblioteca base sobre la que se construyen muchas otras soluciones.
package main
import ( "fmt" "github.com/paulmach/orb" "github.com/paulmach/orb/geo")
func main() { // Definimos dos puntos (latitud, longitud) moscow := orb.Point{37.6173, 55.7558} spb := orb.Point{30.3351, 60.0000}
// Calculamos la distancia en kilómetros (fórmula del haverseno) distance := geo.Distance(moscow, spb) fmt.Printf("Distancia de Moscú a San Petersburgo: %.2f km", distance)}2. github.com/twpayne/go-geom — potente biblioteca para operaciones geométricas
Esta biblioteca ofrece un acceso de más bajo nivel a la geometría y soporta muchos estándares OGC (Open Geospatial Consortium). Es ideal para cálculos complejos: intersecciones de polígonos, bufferización, transformación de proyecciones.
import ( "github.com/twpayne/go-geom" "github.com/twpayne/go-geom/encoding/geojson")
// Ejemplo: creación de un punto y serialización a GeoJSONpoint := geom.NewPoint(geom.XY).SetCoords(geom.Coord{37.6173, 55.7558})data, _ := geojson.Marshal(point)fmt.Println(string(data))// Salida: {"type":"Point","coordinates":[37.6173,55.7558]}3. github.com/kellydunn/golang-geo — biblioteca simple para calcular distancias y geocodificación
La biblioteca golang-geo proporciona una API simple para trabajar con puntos, calcular distancias (en millas y kilómetros), así como para geocodificación a través de Google Maps API u OpenStreetMap (Nominatim).
import "github.com/kellydunn/golang-geo"
func main() { p1 := geo.NewPoint(55.7558, 37.6173) p2 := geo.NewPoint(60.0000, 30.3351) dist := p1.GreatCircleDistance(p2) // en kilómetros fmt.Printf("Distancia: %.2f km", dist)}Bibliotecas para trabajar con mapas y visualización
4. github.com/umahmood/leaflet-go — integración con Leaflet.js para Go
Leaflet es una de las bibliotecas JavaScript más populares para mapas interactivos. leaflet-go permite generar código HTML con mapas directamente desde una aplicación Go. Esto es útil para sitios educativos y servicios web simples.
import "github.com/umahmood/leaflet-go"
func main() { // Creamos un mapa centrado en Moscú m := leaflet.NewMap( leaflet.Center(55.7558, 37.6173), leaflet.Zoom(10), leaflet.TileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"), )
// Añadimos un marcador m.AddMarker(leaflet.Marker( leaflet.LatLng(55.7558, 37.6173), leaflet.Popup("Moscú, Kremlin"), ))
// Mostramos el código HTML del mapa html, _ := m.Render() fmt.Println(html)}5. github.com/ringsaturn/leaflet — envoltorio alternativo para Leaflet
Esta biblioteca