Géolocalisation et cartes en Go (Golang) : aperçu complet des outils
Go (Golang) est un langage compilé moderne offrant d'excellentes performances et une simplicité de programmation parallèle. Lors du développement d'applications serveur, de systèmes de surveillance, de plateformes logistiques ou de services d'information géographique, il est souvent nécessaire de travailler avec des données géospatiales : détermination de la localisation de l'utilisateur, calcul d'itinéraires, affichage d'objets sur une carte. Dans cet article, nous examinerons les bibliothèques et approches clés pour travailler avec la géolocalisation et les cartes en Go.
1. Bibliothèques principales pour travailler avec les données géospatiales en Go
L'écosystème Go propose plusieurs bibliothèques puissantes pour les calculs géospatiaux. Voici les plus populaires :
go-geo— bibliothèque pour travailler avec les types géométriques (points, lignes, polygones). Prend en charge la latitude/longitude, la distance, la surface, les zones tampons.go-spatial/geom— implémentation de la norme OGC (Open Geospatial Consortium). Permet de travailler avec la géométrie et d'effectuer des requêtes spatiales.paulmach/orb— bibliothèque rapide et propre pour les opérations géospatiales. Inclut les points, lignes, polygones, ainsi que des algorithmes pour travailler avec GeoJSON et MVT (Mapbox Vector Tiles).golang-geo— bibliothèque simple pour calculer les distances avec la formule des haversines et déterminer les points les plus proches.
2. Détermination de la localisation (géolocalisation) en Go
Pour obtenir les coordonnées d'un appareil (adresse IP, GPS) en Go, les approches suivantes sont utilisées :
- Détermination par IP — bibliothèque
ip2location-goou services commeipapi.co,ipstack. Exemple de requête vers une API externe :
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("Coordonnées : %.4f, %.4f", geo.Lat, geo.Lon)}- Coordonnées GPS depuis un appareil mobile — généralement transmises via une API REST ou WebSocket. Le serveur Go reçoit un JSON avec les champs
latetlon. - Utilisation de la bibliothèque
golang-geopour calculer la distance :
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) // Saint-Pétersbourg dist := p1.GreatCircleDistance(p2) // en kilomètres fmt.Printf("Distance : %.2f km", dist)}3. Travail avec les cartes : OpenStreetMap et Leaflet
Pour afficher des cartes sur une page web générée par un backend Go, la combinaison Go + Leaflet.js est la plus couramment utilisée. Leaflet est une bibliothèque JavaScript légère pour les cartes interactives. Go se charge de générer le modèle HTML avec les coordonnées.
3.1. Carte de base avec Leaflet et Go
Créons un serveur HTTP simple qui renvoie une page avec une carte :
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}}, Aussi dans la bibliothèque
Planificateur de tâches en TypeScript : guide détaillé de la bibliothèque node-schedule
vcpkg C++ : guide complet avec exemples concrets
Rate Limiting dans Node.js : Guide complet pour protéger les API et gérer la charge
Range-v3 C++ : guide complet avec exemples pratiques
Planificateur de tâches en Node.js : node-cron, node-schedule et Bull