تحديد المواقع والخرائط في Go (Golang): مراجعة شاملة للأدوات
Go (Golang) هي لغة حديثة ومترجمة تتميز بأداء ممتاز وسهولة البرمجة المتوازية. عند تطوير تطبيقات الخادم، وأنظمة المراقبة، ومنصات الخدمات اللوجستية، أو خدمات المعلومات الجغرافية، غالبًا ما تنشأ الحاجة للعمل مع البيانات الجغرافية: تحديد موقع المستخدم، بناء المسارات، عرض الكائنات على الخريطة. في هذه المقالة، سنستعرض المكتبات والمناهج الرئيسية للعمل مع تحديد المواقع والخرائط في Go.
1. المكتبات الأساسية للعمل مع البيانات الجغرافية في Go
تقدم بيئة Go العديد من المكتبات القوية للحسابات الجغرافية المكانية. دعنا نستعرض الأكثر شيوعًا:
go-geo— مكتبة للعمل مع الأنواع الهندسية (النقاط، الخطوط، المضلعات). تدعم خطوط الطول والعرض، المسافة، المساحة، المناطق العازلة.go-spatial/geom— تطبيق لمعيار OGC (الاتحاد الجغرافي المكاني المفتوح). يسمح بالعمل مع الهندسة وتنفيذ الاستعلامات المكانية.paulmach/orb— مكتبة سريعة ونظيفة للعمليات الجغرافية المكانية. تتضمن النقاط، الخطوط، المضلعات، بالإضافة إلى خوارزميات للعمل مع GeoJSON وMVT (بلاطات متجهات Mapbox).golang-geo— مكتبة بسيطة لحساب المسافات باستخدام صيغة هافرسين، وتحديد أقرب النقاط.
2. تحديد الموقع (تحديد المواقع) في Go
للحصول على إحداثيات الجهاز (عنوان IP، GPS) في Go، تُستخدم المناهج التالية:
- التحديد عبر IP — مكتبة
ip2location-goأو خدمات مثلipapi.co،ipstack. مثال على طلب إلى API خارجي:
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("الإحداثيات: %.4f, %.4f", geo.Lat, geo.Lon)}- إحداثيات GPS من جهاز محمول — عادةً ما تُرسل عبر REST API أو WebSocket. يستقبل خادم Go JSON بحقول
latوlon. - استخدام مكتبة
golang-geoلحساب المسافة:
package main
import ( "fmt" "github.com/kellydunn/golang-geo")
func main() { p1 := geo.NewPoint(55.7558, 37.6173) // موسكو p2 := geo.NewPoint(59.9343, 30.3351) // سانت بطرسبرغ dist := p1.GreatCircleDistance(p2) // بالكيلومترات fmt.Printf("المسافة: %.2f كم", dist)}3. العمل مع الخرائط: OpenStreetMap وLeaflet
لعرض الخرائط على صفحة ويب تم إنشاؤها بواسطة خادم Go، يُستخدم غالبًا مزيج Go + Leaflet.js. Leaflet هي مكتبة JavaScript خفيفة الوزن للخرائط التفاعلية. Go مسؤولة عن إنشاء قالب HTML بالإحداثيات.
3.1. خريطة أساسية مع Leaflet وGo
لنقم بإنشاء خادم HTTP بسيط يعيد صفحة تحتوي على خريطة:
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}},