Геолокация и карты в 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