Geolocalización y mapas en Go (Golang): bibliotecas y ejemplos de código

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Geolocalización y mapas en Go (Golang): revisión completa de herramientas



Go (Golang) es un lenguaje compilado moderno con excelente rendimiento y simplicidad en la programación paralela. Al desarrollar aplicaciones de servidor, sistemas de monitoreo, plataformas logísticas o servicios de información geográfica, a menudo surge la necesidad de trabajar con datos geoespaciales: determinar la ubicación del usuario, trazar rutas, mostrar objetos en un mapa. En este artículo, revisaremos las bibliotecas y enfoques clave para trabajar con geolocalización y mapas en Go.



1. Bibliotecas principales para trabajar con datos geoespaciales en Go



El ecosistema de Go ofrece varias bibliotecas potentes para cálculos geoespaciales. Veamos las más populares:



  • go-geo — biblioteca para trabajar con tipos geométricos (puntos, líneas, polígonos). Soporta latitud/longitud, distancia, área, zonas de influencia.
  • go-spatial/geom — implementación del estándar OGC (Open Geospatial Consortium). Permite trabajar con geometría y realizar consultas espaciales.
  • paulmach/orb — biblioteca rápida y limpia para operaciones geoespaciales. Incluye puntos, líneas, polígonos, así como algoritmos para trabajar con GeoJSON y MVT (Mapbox Vector Tiles).
  • golang-geo — biblioteca simple para calcular distancias mediante la fórmula del haverseno y determinar puntos cercanos.


2. Determinación de ubicación (geolocalización) en Go



Para obtener las coordenadas de un dispositivo (dirección IP, GPS) en Go se utilizan los siguientes enfoques:



  • Determinación por IP — la biblioteca ip2location-go o servicios como ipapi.co, ipstack. Ejemplo de solicitud a una API externa:


package main

import ( "encoding/json" "fmt" "net/http")

type GeoIP struct { Lat float64 `json:"latitude"` Lon float64 `json:"longitude"`}

func main() { resp, err := http.Get("http://ip-api.com/json/") if err != nil { panic(err) } defer resp.Body.Close() var geo GeoIP json.NewDecoder(resp.Body).Decode(&geo) fmt.Printf("Coordenadas: %.4f, %.4f", geo.Lat, geo.Lon)}


  • Coordenadas GPS desde un dispositivo móvil — generalmente se transmiten a través de REST API o WebSocket. El servidor Go recibe un JSON con los campos lat y lon.
  • Uso de la biblioteca golang-geo para calcular la distancia:


package main

import ( "fmt" "github.com/kellydunn/golang-geo")

func main() { p1 := geo.NewPoint(55.7558, 37.6173) // Moscú p2 := geo.NewPoint(59.9343, 30.3351) // San Petersburgo dist := p1.GreatCircleDistance(p2) // en kilómetros fmt.Printf("Distancia: %.2f km", dist)}


3. Trabajo con mapas: OpenStreetMap y Leaflet



Para mostrar mapas en una página web generada por un backend en Go, se utiliza con mayor frecuencia la combinación Go + Leaflet.js. Leaflet es una biblioteca JavaScript ligera para mapas interactivos. Go se encarga de generar la plantilla HTML con las coordenadas.



3.1. Mapa básico con Leaflet y Go



Creemos un servidor HTTP simple que devuelva una página con un mapa:



package main

import ( "html/template" "net/http")

type Location struct { Lat float64 Lon float64}

const tpl = `<!DOCTYPE html><html><head> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" /> <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script></head><body> <div id="map" style="height: 500px;"></div> <script> var map = L.map('map').setView([{{.Lat}},

Recommendations