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

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

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

Начать курс

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

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

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

geo — это фундаментальная библиотека для работы с геометрическими типами: точками, линиями, полигонами. Она предоставляет алгоритмы для расчёта расстояний, площадей, пересечений и буферных зон. Используется как основа для многих других крейтов.

use geo::{Point, LineString, EuclideanDistance};

fn main() {
    let p1 = Point::new(37.6173, 55.7558); // Москва
    let p2 = Point::new(30.3156, 59.9386); // Санкт-Петербург

    let distance = p1.euclidean_distance(&p2);
    println!("Евклидово расстояние: {:.2} градусов", distance);

    // Создание линии (маршрута)
    let line = LineString::from(vec![
        (37.6173, 55.7558),
        (30.3156, 59.9386),
    ]);

    // Длина линии в градусах
    let length: f64 = line.euclidean_length();
    println!("Длина линии: {:.2} градусов", length);
}

2. georust — экосистема для геопространственных данных

Группа крейтов georust включает несколько взаимодополняющих библиотек:

  • geo-types — типы данных (Point, Polygon, MultiPolygon).
  • geo-algorithms — алгоритмы (буферизация, триангуляция Делоне, выпуклая оболочка).
  • proj — преобразование систем координат (например, из WGS84 в проекцию Меркатора).
  • gpx — чтение/запись GPX-файлов (формат обмена GPS-треками).

Пример преобразования координат с помощью proj:

use proj::Proj;

fn main() {
    // Создаём трансформатор из WGS84 (EPSG:4326) в Web Mercator (EPSG:3857)
    let from = "EPSG:4326";
    let to = "EPSG:3857";
    let transform = Proj::new_known_crs(from, to, None).unwrap();

    // Координаты Москвы
    let (x, y) = transform.convert((37.6173, 55.7558)).unwrap();
    println!("Web Mercator: x={:.2}, y={:.2}", x, y);
}

3. navi — работа с картами OpenStreetMap

navi — библиотека для загрузки и обработки картографических данных из OpenStreetMap (OSM). Позволяет извлекать дороги, здания, точки интереса (POI) и строить маршруты. Для работы требуется файл карты в формате PBF.

use navi::{Map, NodeId, WayId};

fn main() {
    // Загружаем карту из PBF-файла
    let map = Map::from_pbf("moscow.osm.pbf").unwrap();

    // Получаем все узлы (nodes) в заданном радиусе
    let center = (37.6173, 55.7558);
    let nodes_in_radius: Vec<NodeId> = map.nodes_within_radius(center, 1000.0).unwrap();
    println!("Найдено узлов: {}", nodes_in_radius.len());

    // Извлекаем дороги (highways)
    let ways: Vec<WayId> = map.ways().filter(|w| w.is_highway()).collect();
    println!("Количество дорог: {}", ways.len());
}

4. Визуализация карт: plotters + geo

Для отображения карт на Rust можно использовать библиотеку plotters в паре с geo. Она позволяет рисовать полигоны, линии и точки на холсте и сохранять результат в PNG/SVG.

use plotters::prelude::*;
use geo::{Point, LineString};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let root = BitMapBackend::new("map.png", (800                    

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