الجغرافيا المكانية والخرائط في Go: نظرة عامة على المكتبات وأمثلة الكود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

الجغرافيا المكانية والخرائط في Go (Golang): المكتبات والأدوات وأمثلة الكود



أصبح تطوير التطبيقات التي تتعامل مع البيانات الجغرافية أمرًا مطلوبًا بشكل متزايد. تقدم لغة Go (Golang) إمكانيات ممتازة لإنشاء خدمات جغرافيا مكانية عالية الأداء - بدءًا من متتبعات GPS البسيطة وصولاً إلى خدمات الخرائط المعقدة. في هذه المقالة، سنستعرض المكتبات والأدوات الرئيسية للعمل مع الخرائط والإحداثيات والبيانات الجغرافية في Go.



الاتجاهات الرئيسية للعمل مع البيانات الجغرافية في Go



قبل الانتقال إلى مكتبات محددة، من المهم فهم المهام التي يحلها المطورون عادةً في Go في مجال الجغرافيا المكانية:



  • الترميز الجغرافي والترميز الجغرافي العكسي — تحويل العنوان إلى إحداثيات والعكس.
  • حساب المسافات والمساحات — صيغ الجيب التمام (haversine)، Vincenty، العمل مع الشكل الإهليلجي.
  • العمل مع بيانات GPS — تحليل سلاسل NMEA، والعمل مع المسارات.
  • تصور الخرائط — إنشاء خرائط ثابتة وتفاعلية (غالبًا من خلال التكامل مع JavaScript).
  • تخزين وفهرسة البيانات الجغرافية — العمل مع PostGIS، MongoDB GeoJSON، Tile38.


مكتبات الترميز الجغرافي والحسابات الجغرافية



1. go-geo — الهندسة الأساسية والحسابات



واحدة من أبسط وأشهر المكتبات للعمل مع النقاط والخطوط الجغرافية. تسمح بحساب المسافة بين نقطتين باستخدام صيغة الجيب التمام (haversine).



package main

import ( "fmt" "github.com/paulmach/go.geo")

func main() { // إنشاء نقطتين (خط العرض، خط الطول) point1 := geo.NewPoint(55.751244, 37.618423) // موسكو point2 := geo.NewPoint(59.934280, 30.335099) // سانت بطرسبرغ

// حساب المسافة بالكيلومترات distance := point1.GeoDistance(point2) fmt.Printf("المسافة بين موسكو وسانت بطرسبرغ: %.2f كم", distance)}


تدعم المكتبة أيضًا العمل مع الخطوط المتعددة والمضلعات وتبسيط الهندسة (خوارزمية دوغلاس-بيكر).



2. geocoding — التكامل مع واجهات برمجة تطبيقات الخرائط



توفر المكتبة github.com/kelvins/geocoding واجهة بسيطة للعمل مع Google Maps Geocoding API و OpenStreetMap Nominatim والخدمات الأخرى.



package main

import ( "fmt" "github.com/kelvins/geocoding" "github.com/kelvins/geocoding/places")

func main() { // استخدام Nominatim (OpenStreetMap) geocoder := geocoding.NewNominatimGeocoder("MyApp/1.0") // الترميز الجغرافي: عنوان -> إحداثيات results, err := geocoder.Geocode("Moscow, Red Square", 1) if err != nil { panic(err) } if len(results) > 0 { fmt.Printf("الإحداثيات: %.4f, %.4f", results[0].Latitude, results[0].Longitude) }

// الترميز الجغرافي العكسي: إحداثيات -> عنوان addr, err := geocoder.ReverseGeocode(55.751244, 37.618423) if err == nil { fmt.Printf("العنوان: %s", addr.FormattedAddress) }}


3. go-proj — تحويل أنظمة الإحداثيات



للعمل الاحترافي مع الخرائط، غالبًا ما يكون من الضروري إعادة الإسقاط من نظام إحداثيات إلى آخر (على سبيل المثال، من WGS84 إلى Web Mercator). المكتبة github.com/pebbe/go-proj هي غلاف لـ PROJ - مكتبة قوية للعمل مع الإسقاطات الجيوديسية.



العمل مع مسارات GPS و NMEA



مكتبة gpsd وتحليل NMEA



لقراءة البيانات من أجهزة استقبال GPS في Go، توجد عدة حلول. أحد أشهرها هو github.com/stratoberry/go-gpsd، والذي يتصل بخدمة GPSd. لتحليل سلاسل NMEA مباشرة، استخدم github.com/adrianmo/go-nmea.



package main

import ( "fmt" "github.com/adrianmo/go-nmea")

توصيات