Rust में भू-स्थान और मानचित्र: लाइब्रेरी का अवलोकन और व्यावहारिक उदाहरण
Rust एक सिस्टम प्रोग्रामिंग भाषा है जो उच्च प्रदर्शन और सुरक्षा की आवश्यकता वाले क्षेत्रों में लोकप्रियता प्राप्त कर रही है। भू-डेटा के साथ काम करना कोई अपवाद नहीं है। यदि आप परिवहन ट्रैकिंग सेवा, भौगोलिक सूचना प्रणाली विकसित कर रहे हैं या बस अपनी साइट पर एक इंटरैक्टिव मानचित्र जोड़ना चाहते हैं, तो Rust का इकोसिस्टम कई परिपक्व समाधान प्रदान करता है। इस लेख में, हम भू-स्थान और मानचित्र प्रदर्शन के लिए प्रमुख लाइब्रेरी का विश्लेषण करेंगे, साथ ही व्यावहारिक कोड उदाहरण भी देंगे।
1. लाइब्रेरी geo — ज्यामितीय गणनाओं का आधार
लाइब्रेरी geo (crate geo-types और geo) बुनियादी डेटा प्रकार प्रदान करती है: बिंदु, रेखाएँ, बहुभुज, साथ ही उनके साथ काम करने के लिए एल्गोरिदम। यह कई अन्य भू-क्रेट्स की नींव है।
// cargo add geo-types geouse geo_types::{Point, LineString, Polygon};use geo::algorithm::haversine_distance;
fn main() { let moscow = Point::new(37.6173, 55.7558); let spb = Point::new(30.3351, 60.0);
// हैवरसाइन दूरी (मीटर में) let dist = haversine_distance(&moscow, &spb); println!("मॉस्को — सेंट पीटर्सबर्ग की दूरी: {:.0} किमी", dist / 1000.0);
// बहुभुज बनाना let coords = vec![ (37.0, 55.0), (38.0, 55.0), (38.0, 56.0), (37.0, 56.0), (37.0, 55.0), ]; let polygon = Polygon::new( LineString::from(coords), vec![], ); println!("बहुभुज का क्षेत्रफल: {:?}", polygon.unsigned_area());}क्षमताएँ:
- प्रकार: Point, Line, LineString, Polygon, MultiPoint, GeometryCollection
- एल्गोरिदम: हैवरसाइन दूरी, विंसेंटी दूरी, क्षेत्रफल, केंद्रक, बफरिंग, प्रतिच्छेदन
- serde के माध्यम से क्रमांकन (GeoJSON के साथ संगतता)
2. geoutils — GPS और डेटा प्रारूपों के साथ काम करना
क्रेट geoutils GPS डेटा के पार्सिंग और सत्यापन में विशेषज्ञता रखता है। यह NMEA स्ट्रिंग्स (GPS रिसीवर्स का मानक प्रोटोकॉल) पढ़ सकता है और निर्देशांक को परिवर्तित कर सकता है।
// cargo add geoutilsuse geoutils::{Location, Distance};
fn main() { // अक्षांश/देशांतर से बिंदु बनाना let point_a = Location::new(55.7558, 37.6173).unwrap(); let point_b = Location::new(59.9343, 30.3351).unwrap();
// हैवरसाइन दूरी let dist = point_a.distance_to(&point_b).unwrap(); println!("दूरी: {} किमी", dist.as_kilometers());
// NMEA स्ट्रिंग पार्सिंग (उदाहरण) let nmea = "$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47"; if let Ok(loc) = Location::from_nmea(nmea) { println!("NMEA पार्सिंग: {:?}", loc); }}विशेषताएँ:
- NMEA-0183 पार्सिंग (GPGGA, GPRMC)
- प्रारूपों का समर्थन: DMS (डिग्री/मिनट/सेकंड), दशमलव डिग्री
- निर्देशांक प्रणालियों के बीच रूपांतरण (WGS84, UTM)
3. mapbox-gl-native-rs — Rust में मानचित्र रेंडरिंग
डेस्कटॉप या एम्बेडेड अनुप्रयोगों में मानचित्र प्रदर्शित करने के लिए, आप Mapbox GL Native पर Rust रैपर का उपयोग कर सकते हैं। लाइब्रेरी वेक्टर टाइल्स को रेंडर करने, मार्कर और बहुभुज जोड़ने और शैलियों को प्रबंधित करने की अनुमति देती है।
// उदाहरण सरलीकृत है — पर्यावरण सेटअप की आवश्यकता है// cargo add mapbox-gl-native-rsuse mapbox_gl_native_rs::{Map, MapOptions, Style};
fn main() { let opts = MapOptions::new() .size(800, 600) .center(37.6173, 55.7558) .zoom(10.0);
let mut map = Map::new(opts); map.load_style(Style::from_url("https://demotiles.mapbox.com/style.json"));
// मार्कर जोड़ना map.add_marker(37.6173, 55.7558, "मॉस्को");
// बफर में रेंडरिंग (उदाहरण के लिए, PNG में) let img = map.render_to_image(); img.save("map.png").unwrap();}नोट: काम करने के लिए स्थापना की आवश्यकता है