Geolocalização e Mapas em Go (Golang): visão geral completa das ferramentas
Go (Golang) é uma linguagem compilada moderna com excelente desempenho e simplicidade de programação concorrente. Ao desenvolver aplicações de servidor, sistemas de monitoramento, plataformas logísticas ou serviços de informação geográfica, surge frequentemente a necessidade de trabalhar com dados geoespaciais: determinar a localização do usuário, traçar rotas, exibir objetos em um mapa. Neste artigo, exploraremos as principais bibliotecas e abordagens para trabalhar com geolocalização e mapas em Go.
1. Principais bibliotecas para trabalhar com dados geoespaciais em Go
O ecossistema Go oferece várias bibliotecas poderosas para computação geoespacial. Vamos analisar as mais populares:
go-geo— biblioteca para trabalhar com tipos geométricos (pontos, linhas, polígonos). Suporta latitude/longitude, distância, área, zonas de buffer.go-spatial/geom— implementação do padrão OGC (Open Geospatial Consortium). Permite trabalhar com geometria e realizar consultas espaciais.paulmach/orb— biblioteca rápida e limpa para operações geoespaciais. Inclui pontos, linhas, polígonos, além de algoritmos para trabalhar com GeoJSON e MVT (Mapbox Vector Tiles).golang-geo— biblioteca simples para calcular distâncias usando a fórmula de haversine e determinar pontos mais próximos.
2. Determinação de localização (geolocalização) em Go
Para obter as coordenadas de um dispositivo (endereço IP, GPS) em Go, são utilizadas as seguintes abordagens:
- Determinação por IP — biblioteca
ip2location-goou serviços comoipapi.co,ipstack. Exemplo de requisição a uma 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 de dispositivo móvel — geralmente transmitidas via REST API ou WebSocket. O servidor Go recebe JSON com os campos
latelon. - Uso da biblioteca
golang-geopara calcular distância:
package main
import ( "fmt" "github.com/kellydunn/golang-geo")
func main() { p1 := geo.NewPoint(55.7558, 37.6173) // Moscou p2 := geo.NewPoint(59.9343, 30.3351) // São Petersburgo dist := p1.GreatCircleDistance(p2) // em quilômetros fmt.Printf("Distância: %.2f km", dist)}3. Trabalhando com mapas: OpenStreetMap e Leaflet
Para exibir mapas em uma página web gerada pelo backend Go, a combinação mais comum é Go + Leaflet.js. Leaflet é uma biblioteca JavaScript leve para mapas interativos. Go é responsável por gerar o template HTML com as coordenadas.
3.1. Mapa básico com Leaflet e Go
Vamos criar um servidor HTTP simples que retorna uma página com um 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}}, Também na biblioteca
GraphQL em Go: Guia Completo da Biblioteca gqlgen
Migrações de banco de dados em Swift: ferramentas e abordagens para iOS/macOS
GraphQL em PHP: biblioteca webonyx/graphql-php para criação de APIs