Геолокация и карты в Rust: библиотеки для работы с координатами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Геолокация и карты в Rust: обзор библиотек и практические примеры

Rust — язык системного программирования, который набирает популярность в областях, требующих высокой производительности и безопасности. Работа с геоданными не исключение. Если вы разрабатываете сервис для трекинга транспорта, геоинформационную систему или просто хотите добавить на сайт интерактивную карту, экосистема Rust предлагает несколько зрелых решений. В этой статье мы разберем ключевые библиотеки для геолокации и отображения карт, а также приведем практические примеры кода.

1. Библиотека geo — основа геометрических вычислений

Библиотека geo (crate geo-types и geo) предоставляет базовые типы данных: точки, линии, полигоны, а также алгоритмы для работы с ними. Она является фундаментом для многих других гео-крейтов.

// cargo add geo-types geo
use 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 geoutils
use 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

Для отображения карт в десктопных или встраиваемых приложениях можно использовать Rust-обертку над Mapbox GL Native. Библиотека позволяет рендерить векторные тайлы, накладывать маркеры и полигоны, управлять стилями.

// Пример упрощен — требуется настройка окружения
// cargo add mapbox-gl-native-rs
use 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();
}

Примечание: Для работы требуется установленный Mapbox GL Native. Библиоте

Рекомендаций